Если приложение собрано при помощи cygwin, то, в случае крэша, создается файл с названием your_app.exe.stackdump. Содержимое его выглядит примерно так:
Exception: STATUS_ACCESS_VIOLATION at eip=004055D9
eax=00000000 ebx=10470C5F ecx=611691E8 edx=FFFFFFFF esi=10470C6D edi=00000000
ebp=0028CBB8 esp=0028CB20 program=C:/*****/***/*****/******.exe, pid 4036, thread main
cs=0023 ds=002B es=002B fs=0053 gs=002B ss=002B
Stack trace:
Frame Function Args
0028CBB8 004055D9 (0042F380, 0028CBF8, 0040F0AC, 0040F0AE)
0028CC88 0040662D (0040C7B0, 0040F220, 0040D36C, 0040D697)
0028CCC8 004097CF (10470C58, 0040D802, 612434B4, 10470C5F)
0028CCE8 0040A02D (00000001, 10438350, 10438270, 00008000)
0028CD58 61007038 (00000000, 0028CD94, 61006980, FFFDE000)
End of stack trace
Теперь, чтобы получить удобочитаемый вид, нужно воспользоваться утилитой addr2line. Пример использования:
awk '/^[0-9]/{print $2}' testprog.exe.stackdump | addr2line -f -e testprog.exe
После выполнения вы должны получить примерно следующий вывод:
fun2
Я оформил это в маленький башскрипт (смотри ссылку). Пример использования скрипта:
load_stackdump.sh testprog.exe testprog.exe.stackdump
Bash script: load_stackdump.sh
Exception: STATUS_ACCESS_VIOLATION at eip=004055D9
eax=00000000 ebx=10470C5F ecx=611691E8 edx=FFFFFFFF esi=10470C6D edi=00000000
ebp=0028CBB8 esp=0028CB20 program=C:/*****/***/*****/******.exe, pid 4036, thread main
cs=0023 ds=002B es=002B fs=0053 gs=002B ss=002B
Stack trace:
Frame Function Args
0028CBB8 004055D9 (0042F380, 0028CBF8, 0040F0AC, 0040F0AE)
0028CC88 0040662D (0040C7B0, 0040F220, 0040D36C, 0040D697)
0028CCC8 004097CF (10470C58, 0040D802, 612434B4, 10470C5F)
0028CCE8 0040A02D (00000001, 10438350, 10438270, 00008000)
0028CD58 61007038 (00000000, 0028CD94, 61006980, FFFDE000)
End of stack trace
Теперь, чтобы получить удобочитаемый вид, нужно воспользоваться утилитой addr2line. Пример использования:
awk '/^[0-9]/{print $2}' testprog.exe.stackdump | addr2line -f -e testprog.exe
После выполнения вы должны получить примерно следующий вывод:
fun2
/cygdrive/e/workdir/app.cpp:100
fun1
/cygdrive/e/workdir/app.cpp:200
main
/cygdrive/e/workdir/app.cpp:221
Я оформил это в маленький башскрипт (смотри ссылку). Пример использования скрипта:
load_stackdump.sh testprog.exe testprog.exe.stackdump
Bash script: load_stackdump.sh
Комментариев нет:
Отправить комментарий