этот вопрос скорее всего повторение Использование 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
Это общая проблема для многих парней; и обычно они скажут вам использовать GDB. Однако это не всегда разумный ответ. Вы не должны перекомпилировать его, так как не гарантируется, что новая сборка будет иметь те же адреса символов, что и аварийная.
Есть несколько инструментов, которые могут быть полезны: objdump, addr2line и т. Д.
Вы можете выполнить «objdump -D -S build.out> build.rasm.txt», а затем искать адреса этих функций среди текста.
Addr2line также является хорошим выбором для определения этих функций.
Если вы собираетесь часто сталкиваться с такими проблемами, рекомендуется написать инструмент-скрипт, который поможет вам в работе.
Удачи.
Вы можете использовать адреса «функций» в качестве аргументов 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
, ...
)
Другой способ найти проблемную строку — использовать gdb в вашем двоичном файле.
Итак, сначала запустите GDB:
gdb main.exe
Внутри GDB запустить:
info line *0xADD4355