Как я могу интерпретировать файл .stackdump? - программирование
Подтвердить что ты не робот

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

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

Я новичок в С++ и программировании, и я развиваюсь в 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, и я могу прочитать его через блокнот ++, но я не понимаю, что это значит. Я собираюсь по другому вопросу, что есть удобный способ декодирования этого файла, но мое лучшее предположение 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
4b9b3361

Ответ 1

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

Удачи.

Ответ 2

Вы можете использовать адреса "Function" в качестве аргументов для 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, ...)

Ответ 3

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

Внутри gdb run: info line *0xADD4355