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

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

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

*** 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. Есть ли руководство по использованию этого типа трассировки стека?

1 Ответ

0 голосов
/ 15 ноября 2018

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

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

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

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

...