Cómo localizar la versión de lanzamiento donde el programa falló
Cómo localizar el fallo del programa en la versión de lanzamiento
Los siguientes son algunos fallos y métodos de procesamiento comunes:
1. debe estar en la versión de depuración al mismo tiempo.
Solución: elimine todos los puntos de interrupción y ejecute el programa directamente en la versión de depuración. Cuando el programa falla, VC saltará automáticamente a la línea del código de falla. Este es el método más simple y más utilizado.
2. Para los programas que no fallan en la versión de depuración pero fallan en la versión de lanzamiento, es probable que exista una diferencia entre la versión de depuración y la versión de lanzamiento. Por ejemplo, todos los miembros de la versión de depuración se borrarán durante la compilación, mientras que todos los miembros de la versión de lanzamiento conservarán sus valores originales en la memoria durante la compilación, y la biblioteca de tiempo de ejecución protege la depuración, lo que puede causar algunos problemas. Los programas fallan en el lanzamiento cuando la depuración es normal.
Solución: 1) Agregue la impresión al programa y localice la ubicación del error mediante la impresión antes de que el programa falle; 2) Comente el código sección por sección hasta que el programa no falle. Este método requiere más tiempo y requiere más tiempo para los programadores. Es más difícil lidiar con errores que pueden no existir necesariamente o que dificultan la creación de un entorno de ejecución.
3. En caso de una falla en el sitio del cliente, obviamente no es apropiado llevar la computadora directamente para la depuración.
Solución: debe haber un archivo para registrar la información del fallo. El personal de servicio al cliente puede enviar el archivo de información del fallo al programador para que el programador pueda consultar la causa del fallo y luego utilizar el archivo MAP. (archivo de información del proyecto) generado durante la compilación. Información almacenada en el compilador de la versión) localiza la función o línea de código problemática. Este método se discutirá a continuación:
3? Proceso de solución
Para el tercer caso de la sección anterior, que también es el caso más difícil de resolver, el proceso de solución es el siguiente. :
p>
1. Registre una devolución de llamada de falla para interceptar fallas del programa de Windows
2. Genere la causa de la falla, la dirección de la memoria de la falla y la pila de fallas en el procesamiento de la devolución de llamada;
3 .Archivo de mapeo de salida del proyecto;
4. Encuentre la función de falla a través de la dirección de la memoria de falla y el archivo de mapeo.
5. Utilice archivos COD para identificar la línea de fallo
3.1 Registrar devoluciones de llamadas de fallo
En realidad, el cuadro de diálogo de mensaje de error de Windows por sí solo proporciona una gran cantidad de información. cantidad de información limitada. El registro de una función de devolución de llamada de manejo de errores personalizada mediante SetUnhandledExceptionFilter reemplazará el filtro de excepción de nivel superior predeterminado de Win32 e imprimirá la pila de fallos, lo cual es útil para encontrar la causa del fallo.
Prototipo de función SetUnhandledExceptionFilter:
LPTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter (
LPTOP_LEVEL_EXCEPTION_FILTER (
LPTOP_LEVEL_EXCEPTION_FILTER) es una función que puede reemplazar la parte superior predeterminada de Win32. Función de filtro de excepción de nivel EXCEPTION_FILTER lpTopLevelExceptionFilter );?
Función?: registrar y cancelar el registro de devolución de llamada de manejo de excepciones;
Usar método: ¿la primera llamada para registrar la devolución de llamada de excepción? llamada para cancelar la excepción.
Valor de retorno: devuelve el filtro de excepción actual. Este puntero de función debe guardarse y cuando se cancela la devolución de llamada de excepción, se vuelve a llamar a SetUnhandledExceptionFilter usándolo como parámetro.
Parámetro: función de devolución de llamada de manejo de excepciones;
3.2 Información sobre fallas de salida
La información sobre fallas se imprime en la función de devolución de llamada de excepción y se envía a un archivo durante la ejecución del programa. directorio:
Prototipo de función de devolución de llamada de manejo de excepciones:
LONG WINAPI CallBackDebugInfo (EXCEPTION_POINTERS *pException);?
Función: procesamiento de devolución de llamada de manejo de excepciones, impresión de información sobre fallas
Uso: registrar una devolución de llamada de manejo de errores personalizada: SetUnhandledExceptionFilter (CallBackDebugInfo);
Valor de retorno: excepción_continue_execution - ?El error se ha solucionado, continúe la ejecución desde la ubicación donde se produjo la excepción. ocurrió
EXCEPTION_CONTINUE_SEARCH - ?Continuar buscando el filtro de excepción
EXCEPTION_EXECUTE_HANDLER ?- ?Regresar normalmente
Parámetros: estructura de información de falla, incluida la causa de la falla, el módulo de la falla, dirección de falla, pila de falla, etc.
Las causas comunes de fallas son:
EXCEPTION_ACCESS_VIOLATION = C0000005h?Error de memoria de lectura/escritura
EXCEPTION_INT_DIVIDE_BY_ZERO = C0000094h?Error de división por 0
EXCEPTION_STACK_OVERFLOW = C00000FDh ?Desbordamiento de pila o fuera de límites
EXCEPTION_GUARD_PAGE = 80000001h Conflicto en la página de propiedades creado por Virtual Alloc
EXCEPTION_NONCONTINUABLE_EXCEPTION = C0000025h Excepción insostenible, el programa no puede continuar ejecución, ejemplo de manejo de excepciones El programa no debe manejar esta excepción
EXCEPTION_INVALID_DISPOSITION = C0000026h Código utilizado por el sistema durante el manejo de excepciones
EXCEPTION_BREAKPOINT = 80000003h ¿Interrupción durante la depuración (INT 3)? p>
EXCEPTION_SINGLE_STEP = 80000004h ?Estado de depuración de un solo paso (INT 1)
3.3 Exportar archivo de mapeo
El archivo de mapeo registra los símbolos globales, los archivos fuente y el número de línea de código información del programa, y es el proyecto completo del programa Texto estático del mensaje. Los archivos de mapas se pueden abrir utilizando herramientas de lectura de texto como Ultra Edit o Notepad.
En VC, abra la pestaña "Configuración del proyecto", seleccione la pestaña C/C++, luego escriba: /Zd en la parte inferior de las opciones del proyecto, luego seleccione la pestaña "Enlace" y marque "Generar". archivo de mapa" "casilla de verificación. "Generar archivo de mapa". Luego seleccione la pestaña Enlaces y seleccione la casilla de verificación "Generar archivo de mapa". Escriba /mapinfo:lines en la parte inferior de Opciones del proyecto para incluir información de línea al generar el archivo de mapa.
Finalmente , puede compilar y generar un archivo MAP, que se encuentra en el directorio Debug o Release del proyecto y se denomina "project.map"
3.4 Utilice archivos MAP para buscar funciones de bloqueo
.?A través de los pasos anteriores, hemos obtenido el archivo MAP, entonces, ¿cómo usarlo? A continuación se mostrará paso a paso cómo usar el archivo MAP para encontrar la línea de falla del programa.
?1. Primero agregamos el código de operación de memoria ilegal (la excepción más común):
BOOL CMainFrameDlg::OnInitDialog()
{
? ::SetProp(m_hWnd, AfxGetApp()->m_pszExeName, (HANDLE)1);
?s32 *p = NULL;
?*p= 123;
2. Cuando se ejecuta el programa, se produce una excepción al principio y se imprime la siguiente información en el archivo de impresión de la excepción:
========= ======= ======== Información sobre accidentes===========================
Hora del bloqueo: 2009/06/02 16:58:22
Causa del bloqueo: operación de memoria ilegal
Código de excepción = c0000005
Dirección de excepción = 0x0045a76f
Módulo de excepción: E:\ccroot\liuxiaojing_Enterprise\Enterprise_VOB\70 -nms1\pcmt2\prj_win32\Release\pcmt2.exe
Nombre de la sección: .text - offset(rva) :0x0005976f
- --------------------- Viajes de Stack ----- ------------- ------ p>
E:\ccroot\liuxiaojing_Enterprise\Enterprise_VOB\70-nms1\pcmt2\prj_win32\Release\pcmt2.exe
nombre: pcmtver - ubicación: 2bef
3 Determine la dirección del fallo: Determine la dirección del fallo: 0x0005976f, busque la función en el archivo de mapa:
0001:00059420 ?OnCreate@CMainFrameDlg@@IAEHPAUtagCREATESTRUCTA@@@Z. 0045a420 f ?MainFrameDlg.obj 0001:00059460 SetTooltips@CMainFrameDlg@@AAEXXZ 0045a460 f ?0001:00059700 OnTranslate@CMainFrameDlg@@IAEJIJ@Z 0045a700 f ?MainFrameDlg .obj 0001:00059730 OnInitDialog@CMainFrameDlg@@MAEHXZ 00 45a730 f ?0001: 00059a10 ?OnSysCommand@CMainFrameDlg@@IAEXIJ@Z 0045aa10 f ?MainFrameDlg.obj 0001:00059c20 OnPaint@CMainFrameDlg@@IAEXXZ 0045ac20 f ?MainFrameDlg.obj
Según 0 0059730 < 0005976f < 00059a10, determine el OnInitD de CMainFrameDlg Se produjo una excepción en una de las líneas de la función ialog.
3.5 Utilice líneas de mapeo de código para ubicar el número de línea del intervalo de línea de falla
.Release/MainFrameDlg.NET.
\Release\MainFrameDlg.obj(E:\ccroot\liuxiaojing_Enterprise\Enterprise_VOB\70-nms1\pcmt2\source\MainFrameDlg.cpp) sección .número de línea de texto
498 0001:00059647 ?499 0001:00059667 ? 501 0001:0005966e ?502 0001:000596af
503 0001:000596ed ?506 0001:00059700 ?507 0001:00059703 ?508 0001:00059708
0 0001:0005970f?511 0001 : 00059720 ?512 0001:00059723 ?515 0001:00059730
516 0001:0005974e ?521 0001:0005976d ?524 0001:0005977e ?526 0001:00 05978b
Miramos el mapa file Al observar la información de la línea de código, encontramos solo el resultado calculado 0x0005976f, pero el número más cercano que pudimos encontrar. Lo encontramos en el archivo MainFrameDlg.cpp: 521 0001:0005976d, y la línea de falla real del programa es 519 (las líneas de comentarios y las líneas vacías también deben contarse), que está muy cerca de la línea de falla real. Teniendo en cuenta que la ejecución real del programa es una instrucción ensambladora, podemos encontrar la línea de falla real dentro del rango de (516 ~ 524) líneas.
3.6 No se pueden localizar fallos
Sin embargo, este método de archivo de salida no puede localizar todos los fallos. Como dice el refrán: no existe un salvador omnipotente.
Por ejemplo, a veces experimentamos fallas en el códec de nivel inferior y la información sobre fallas se imprime en la siguiente tabla:
============== = =========== Información sobre el accidente===========================
Tiempo del accidente: 2009/05/07 09:48:17
Causa del bloqueo: operación de memoria ilegal
Código de excepción = c0000005
Dirección de excepción = 0x02163b32
Módulo de excepción: C:\WINDOWS\system32\kdg7221.acm
Nombre de la sección: .text - offset(rva): 0x00002b32
--------- - ------------ Viajes de Stack ----------------------
C:\WINDOWS\ system32 \kdg7221.acm
En este punto, se puede ver que nuestro decodificador de audio kdg7221.acm falló. En este momento, debemos considerar si la configuración de nuestro parámetro de códec de audio es incorrecta. Luego, los errores se pueden transferir a la capa de procesamiento de medios o al software para su manejo.