使用minidumps和GDB为mingw编译的可执行文件分析崩溃?

我用Cmake + mingw来编译我的项目。 由于一些不知名的时刻,我的程序开始在启动时崩溃,我想出了如何让Windows为我的崩溃的应用程序做小型转储。 我会使用GDB直接debugging我的应用程序,但是当我使用GDB时,程序不会崩溃。 谷歌breakpad包含工具转换minidumps coredumps,所以我尝试编译谷歌的break子,但它似乎breakpad是不是Windows解决scheme。 我正在寻找解决scheme如何检查小型转储,并find为什么我的程序开始崩溃。 你怎么做呢?

你不需要分析小型转储。 相反,您可以将您的调试器设置为事后调试器。 我已经在互联网上搜索“windows替代gdb的postmortem调试器”。 你看,有Dr. Mingw: https : //github.com/jrfonseca/drmingw 。 这是从他们的网站:

Dr. Mingw是一个Just-in-Time(JIT)调试器。 当应用程序抛出一个未处理的异常时,Dr. Mingw将自己附加到应用程序中,并使用可用的调试信息收集有关异常的信息。

我已经写了一个简单的C ++测试:

 int f() { int *ptr = 0; *ptr = *ptr +1; return *ptr; } int main() { f(); return 0; } 

建立它:

 g++ -g main.cpp 

这是DrMingw在我的程序崩溃时的输出,并且磁盘上有源文件。 正如你所看到的,找到一个问题是很容易的:

 .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 

如果测试是用“-g”构建的,但是没有源文件可用,那么Dr.Mingw的输出看起来就像这样,而且你的程序在哪一行崩溃也很清楚:

 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 

如果测试的构建没有“-g”,那么Dr.Mingw的输出如下所示:

 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 

找到它的PID后,你可以附加到崩溃的过程吗? 我可以为我的应用程序做到这一点。

 (gdb) attach 1337 Attaching to process 1337 ... (gdb) 

http://bengreen.eu/fancyhtml/quickreference/gdbusageinwindows.html