Pregunta

He desarrollado un programa por un cliente que experimenta cuando se haga una determinada operación.Esto no ocurre siempre en el mismo lugar y con los mismos datos y, además, no está pasando ni en mi local el desarrollo de la máquina ni en mi prueba de la Máquina Virtual (que es libre de todos los equipos).

Dadas estas condiciones, he decidido compilar con el MAPA (habilitado en la Configuración de Propiedades-> Linker->Depurador con la opción /MAPA) para ver que la función está causando el accidente.

Si he entendido correctamente, cuando el programa se cuelgue he comprobar hacia abajo el desplazamiento de error y, a continuación, busque en mi MAPA en la columna RVA+BASE:

     Address                         Publics by Value                                      Rva+Base       Lib:Object
 0001:00037af0       ?PersonalizzaPlancia@CDlgGestioneDatiProgetto@MosaicoDialogs@@IAEXXZ 00438af0 f   DlgGestioneDatiProgetto.obj
 0001:00038000       ?SalvaTemporanei@CDlgGestioneDatiProgetto@MosaicoDialogs@@IAEXXZ 00439000 f   DlgGestioneDatiProgetto.obj

En realidad, mi accidente ocurre en el desplazamiento:

00038C90
Así que debemos pensar que se trata de un lugar en el método:

MosaicoDialogs::CDlgGestioneDatiProgetto::PersonalizzaPlancia

pero esto no es absolutamente posible, por lo que suponiendo que el equipo no puede estar equivocado, yo soy el que está haciendo mal.

Puede que alguien me explique cómo leer el MAPA en la dirección correcta?

¿Fue útil?

Solución

Lectura de los archivos MAP para averiguar la ubicación de los bloqueos se explica muy bien en este artículo del proyecto Código.

http://www.codeproject.COM / ARTES / 3472 / Búsqueda-Crash-Uso-usando-the-Map-File

esperanza ayuda.

Otros consejos

no te molestes - en su lugar, construir el proyecto con símbolos habilitado y tira de ellos en un archivo pdb.

Modificar el programa un poco, para escribir un minidump cuando se bloquea el uso de un excepción no controlada en el controlador

Dar a la nueva programa compilado para el cliente, y cuando se bloquea la llamada MiniDumpWriteDump.

Preguntar al cliente para enviar este .archivo dmp para usted, y usted, a continuación, sólo tiene que cargar en Visual Studio (o WinDbg) y hará coincidir los símbolos para el programa, y también coinciden en el código.Usted debe ser capaz de ver la línea de código exacta y algunas de las variables que intervienen.(si se usa VS, cuando se carga el .archivo dmp, la esquina superior derecha será una opción para "iniciar depuración", haga clic en, a medida que se va a "iniciar depuración" en el punto del accidente)

Pruebe primero localmente poner un div por error de cero en algún lugar en el programa y ver si se puede depurar el volcado después de su ejecución.Tenga en cuenta que debe mantener el mismo archivo de símbolo para cada generación de su programa - que coincidir exactamente.Usted no puede esperar que un archivo de símbolo para construir con otra build, incluso si no se cambió nada.

Hay tutoriales para este tipo de cosas, tales como este uno de CodeProject que parece que describe lo que usted necesita.

Para la depuración posmortem, hay una alternativa que no exigiría el uso de un archivo de mapa. Más bien, le pediría que cree un script de registro simple para habilitar un poco de wer (informes de errores de Windows) banderas para atrapar el archivo de volcado de bloqueo. Primero, construye su solicitud con símbolos de depuración. Luego, siga las instrucciones para recogida VUELOS DE MODO DE USUARIO . Básicamente, crea una clave secundaria debajo de la tecla "LocalDumps". Esta Sub Tecla debe ser el nombre de su solicitud, por ejemplo, "myapplication.exe". Luego, cree el "Dumpcount", "DumpType", y los valores / "Dumpfolder". Haga que el usuario ejecute el script de registro. Esto permitirá atrapar el volcado localmente. Luego, haga que el usuario obliga al bloqueo para recoger el archivo de volcado. El usuario puede enviarle el archivo de descarga para depurar usando los símbolos que creó anteriormente. Por último, deberá crear un script de registro que elimine las teclas / valores que agregó al registro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top