Как отладить сбойную программу Linux по ее обратному пути glibc / malloc (ядро недоступно)?

У меня есть приложение C ++, работающее на удаленном сервере. Я недавно ввел много нового кода. Опасаясь аварий, я установил ulimit -c unlimited и через некоторое время у меня произошел сбой с coredump, который помог мне отладить проблему. По деловым причинам в исполняемом бинарном файле нет символов отладки, но у меня на компьютере есть бинарный файл с символами, поэтому отладка была проще простого.

Сегодня обновленный сервис снова вышел из строя, к сожалению, на этот раз он не выдал coredump (старый core файл все еще там, нетронутый, я думаю, это может быть какое-то ожидаемое поведение). На этот раз падение происходило внутри realloc (), поэтому он представил мне следующую трассировку стека в stdout:

*** Error in `./MyApp': corrupted double-linked list: 0x0000000003a04940 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f05ed2897e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x7e6ed)[0x7f05ed2906ed]
/lib/x86_64-linux-gnu/libc.so.6(+0x81cde)[0x7f05ed293cde]
/lib/x86_64-linux-gnu/libc.so.6(__libc_malloc+0x54)[0x7f05ed296184]
/lib/x86_64-linux-gnu/libc.so.6(realloc+0x358)[0x7f05ed296a18]
./MyApp[0x453f58]
./MyApp[0x454a42]
./MyApp[0x457cd6]
./MyApp[0x45eb19]
./MyApp[0x49cfd7]
./MyApp[0x49707b]
./MyApp[0x70734e]
...
a lot more lines
...
./MyApp[0x664c65]
./MyApp[0x73e7b2]
./MyApp[0x70d849]
./MyApp[0x783af4]
./MyApp[0x425da8]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f05ed232830]
./MyApp[0x43a0c9]
======= Memory map: ========
...
< a huge table of memory mappings, ending with: >
Aborted (core dumped)

Как указано выше, файл ядра не изменился с момента предыдущего сбоя, поэтому его нельзя использовать.

Мне было интересно, смогу ли я использовать эту трассировку стека, чтобы вручную выяснить, какая функция запустила функцию realloc (), которая все испортила. Я старался addr2line используя упомянутые адреса, но я чувствую, что это отправляет меня в неправильные места, поскольку они совершенно не имеют значения. Возможно, мне следует использовать карту памяти каким-то образом, который я не понимаю и не могу выяснить после некоторого поиска в Google. Есть ли руководство по использованию этого типа трассировки стека?

2

Решение

objdump — одна классная программа из инструментария GNU, которая может показать вам информацию о бинарном. связанные библиотеки, выравнивания памяти, таблицы функций и многое другое.

Общего пользования:
objdump -T <file>

Есть еще несколько инструментов, которые могут вам помочь. лайк nm или же readelf (для эльфийских файлов).

nm -g -C <file>
readelf -sW <file>

1

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector