Как я могу интерпретировать файл .stackdump?

этот вопрос скорее всего повторение Использование stackdump из исполняемого файла Cygwin — но я новичок, и я не понимал ответы или даже части вопроса.

Я довольно новичок в c ++ и программировании, и я занимаюсь разработкой в ​​NetBeans. Я работаю над кодом, который прекрасно компилируется, но не работает во время работы. Если я использую отладчик, я получаю следующую ошибку:

1 [main] all 6200 exception::handle: Exception: STATUS_ACCESS_VIOLATION
881 [main] all 6200 open_stackdumpfile: Dumping stack trace to all.exe.stackdump

Мне удалось найти файл all.exe.stackdump, и я могу прочитать его через notepad ++, но я не понимаю, что это значит. По другому вопросу я понял, что существует удобный для пользователя способ декодирования этого файла, но я предпочитаю bash$ gdb all.exe.stackdump был неэффективен. Какой лучший способ использовать этот файл для отладки?

На всякий случай это полезно, вот содержимое all.exe.stackdump

Exception: STATUS_ACCESS_VIOLATION at eip=00434C41
eax=2003A2E4 ebx=0028A95C ecx=00000000 edx=0028A95C esi=0028A9B0 edi=00000000
ebp=0028A9C8 esp=0028A930 program=[redacted for privacy/security], pid 6200, thread main
cs=0023 ds=002B es=002B fs=0053 gs=002B ss=002B
Stack trace:
Frame     Function  Args
0028A9C8  00434C41  (00000000, 2003A4F0, 0028A9E8, 00000000)
0028A9E8  00436B14  (00000000, 2003A4F0, 0028AA28, 0028D000)
0028AAF8  004036A4  (0028AB80, 2003A2B0, 00000014, 00000003)
0028ABD8  00403FBC  (00000001, 0028AC00, 200280E8, 2003A189)
0028ACF8  61007535  (00000000, 0028CD78, 61006B20, 00000000)
End of stack trace

16

Решение

Это общая проблема для многих парней; и обычно они скажут вам использовать GDB. Однако это не всегда разумный ответ. Вы не должны перекомпилировать его, так как не гарантируется, что новая сборка будет иметь те же адреса символов, что и аварийная.
Есть несколько инструментов, которые могут быть полезны: objdump, addr2line и т. Д.
Вы можете выполнить «objdump -D -S build.out> build.rasm.txt», а затем искать адреса этих функций среди текста.
Addr2line также является хорошим выбором для определения этих функций.
Если вы собираетесь часто сталкиваться с такими проблемами, рекомендуется написать инструмент-скрипт, который поможет вам в работе.

Удачи.

7

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

Вы можете использовать адреса «функций» в качестве аргументов addr2line,

addr2line -f -C -e main.exe 0xADD4355

Отфильтруйте его, используя awk и pipe по всем адресам:

awk '/^[0-9]/{print $2}' main.exe.stackdump | addr2line -f -C -e main.exe

Если ты видишь ??вместо имен функций, вам нужно будет перестроить с помощью символов отладки (-g, -ggdb3, ...)

8

Другой способ найти проблемную строку — использовать gdb в вашем двоичном файле.
Итак, сначала запустите GDB:
gdb main.exe

Внутри GDB запустить:
info line *0xADD4355

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