Анализировать сбои, используя мини-дампы и GDB для скомпилированных Mingw исполняемых файлов?

Я использую Cmake + mingw для компиляции моего проекта. С какого-то неизвестного момента моя программа начала аварийно завершать работу при запуске, и я понял, как заставить Windows создавать мини-дамп для моего аварийного приложения. Я бы использовал GDB для прямой отладки своего приложения, но когда я использую GDB, программа не падает.
Google Breakpad содержит инструмент для преобразования мини-дампов в coredumps, поэтому я попытался скомпилировать Google BreakPad, но кажется, что Breakpad — это не решение для Windows.
Я ищу решение, как проверить мини-дамп и найти причину сбоя моей программы при запуске.
Как ты делаешь это?

4

Решение

Вам не нужно анализировать мини-дампы. Вместо этого вы можете установить ваш отладчик как посмертный отладчик. Я искал в Интернете «Windows заменить посмертный отладчик с GDB». Смотри, есть доктор Mingw: https://github.com/jrfonseca/drmingw . Это с их сайта:

Доктор Mingw является отладчиком JIT. Когда приложение
бросает необработанное исключение, доктор 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
3

Другие решения

Можете ли вы подключиться к процессу сбоя после того, как вы найдете его PID? Я мог бы сделать это для моего приложения.

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

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

0

По вопросам рекламы [email protected]