c++ - Analizar el bloqueo utilizando minivolcados y GDB para mingw compilados ejecutables?
windows minidump (2)
Uso Cmake + mingw para compilar mi proyecto. Desde algún momento desconocido, mi programa comenzó a fallar al inicio y descubrí cómo hacer que Windows haga un minivolcado para mi aplicación bloqueada. Usaría GDB para depurar directamente mi aplicación, pero cuando uso GDB, el programa no falla. Google breakpad contiene una herramienta para convertir minivolcados en núcleos, por lo que intenté compilar el bloqueador de Google, pero parece que el bloqueador no es la solución de Windows. Estoy buscando una solución para inspeccionar el minivolcado y descubrir por qué mi programa falla al inicio. ¿Cómo lo haces?
¿Puede unirse a un proceso de bloqueo después de encontrar su PID? Podría hacer esto por mi aplicación.
(gdb) attach 1337
Attaching to process 1337
...
(gdb)
http://bengreen.eu/fancyhtml/quickreference/gdbusageinwindows.html
No necesita analizar minivolcados. En su lugar, puede configurar su depurador como un depurador post mortem. He buscado en Internet para "windows replace postmortem debugger with gdb". Mira, ahí está el Dr. Mingw: https://github.com/jrfonseca/drmingw . Esto es de su sitio:
El Dr. Mingw es un depurador Just-in-Time (JIT). Cuando la aplicación arroja una excepción no controlada, el Dr. Mingw se adjunta a la aplicación y recopila información sobre la excepción, utilizando la información de depuración disponible.
He escrito una simple prueba de C ++:
int f()
{
int *ptr = 0;
*ptr = *ptr +1;
return *ptr;
}
int main()
{
f();
return 0;
}
Constrúyelo:
g++ -g main.cpp
Este es el resultado de DrMingw cuando mi programa se bloqueó y hay archivos fuente en su disco. Como puede ver, es bastante fácil ubicar una línea con un problema:
.exe caused an Access Violation at location 0040139C in module a.exe Reading from location 00000000.
Registers:
eax=00000000 ebx=7ffdb000 ecx=00000001 edx=77c51ae8 esi=01cedca2 edi=2eafc26a
eip=0040139c esp=0022ff38 ebp=0022ff48 iopl=0 nv up ei pl nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202
AddrPC Params
0040139C 0000001D 7FFDB000 0022FFA0 a.exe!f() [D:/src-c++/test.crasj/main.cpp @ 4]
...
{
int *ptr = 0;
> *ptr = *ptr +1;
return *ptr;
}
...
004013BD 00000001 003D3DC0 003D2C78 a.exe!main [D:/src-c++/test.crasj/main.cpp @ 11]
...
{
f();
> return 0;
}
...
004010B9 00000001 A9FF6D08 7C90E64E a.exe!__mingw_CRTStartup [C:/MinGW/msys/1.0/src/mingwrt/../mingw/crt1.c @ 244]
00401284 2EAFC26A 01CEDCA2 7FFDB000 a.exe!WinMainCRTStartup [C:/MinGW/msys/1.0/src/mingwrt/../mingw/crt1.c @ 274]
7C816D4F 0040126C 00000000 78746341 kernel32.dll!RegisterWaitForInputIdle
Si la prueba está compilada con "-g" pero no hay archivos fuente disponibles, entonces la salida de Dr.Mingw se ve así y también está claro en qué línea falló su programa:
a.exe caused an Access Violation at location 0040139C in module a.exe Reading from location 00000000.
Registers:
eax=00000000 ebx=7ffd7000 ecx=00000001 edx=77c51ae8 esi=01cedca8 edi=ef612c64
eip=0040139c esp=0022ff38 ebp=0022ff48 iopl=0 nv up ei pl nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202
AddrPC Params
0040139C 0000001D 7FFD7000 0022FFA0 a.exe!f() [D:/src-c++/test.crasj/main.cpp @ 4]
004013BD 00000001 003D3D98 003D2C50 a.exe!main [D:/src-c++/test.crasj/main.cpp @ 11]
004010B9 00000001 F7114D08 7C90E64E a.exe!__mingw_CRTStartup [C:/MinGW/msys/1.0/src/mingwrt/../mingw/crt1.c @ 244]
00401284 EF612C64 01CEDCA8 7FFD7000 a.exe!WinMainCRTStartup [C:/MinGW/msys/1.0/src/mingwrt/../mingw/crt1.c @ 274]
7C816D4F 0040126C 00000000 78746341 kernel32.dll!RegisterWaitForInputIdle
Si la prueba se construye sin "-g", la salida de Dr.Mingw se ve así:
a.exe caused an Access Violation at location 0040139C in module a.exe Reading from location 00000000.
Registers:
eax=00000000 ebx=7ffdf000 ecx=00000001 edx=77c51ae8 esi=01cedca4 edi=79abd658
eip=0040139c esp=0022ff38 ebp=0022ff48 iopl=0 nv up ei pl nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202
AddrPC Params
0040139C 0000001D 7FFDF000 0022FFA0 a.exe
004013BD 00000001 003D3DC0 003D2C78 a.exe
004010B9 00000001 A9D73D08 7C90E64E a.exe!__mingw_CRTStartup [C:/MinGW/msys/1.0/src/mingwrt/../mingw/crt1.c @ 244]
00401284 79ABD658 01CEDCA4 7FFDF000 a.exe!WinMainCRTStartup [C:/MinGW/msys/1.0/src/mingwrt/../mingw/crt1.c @ 274]
7C816D4F 0040126C 00000000 78746341 kernel32.dll!RegisterWaitForInputIdle