Я просмотрел файлы backtrace.c
и backtracesyms.c
в исходном коде glibc (git: //sourceware.org/git/glibc.git, коммит 2482ae433a4249495859343ae1fba408300f2c2e).
Предполагая, что я не неправильно прочитал / неправильно понял: backtrace () сам по себе выглядит так, как будто он даст вам только адреса символов, как они есть во время выполнения, что, я думаю, означает, что вам нужен адрес загрузки библиотеки был из pmap или аналогичный. Однако backtrace_symbols () пересчитывает вещи так, что адреса относятся к разделяемой библиотеке ELF, а не к процессу во время выполнения, что действительно удобно. Это означает, что вам не нужна информация из pmap.
Итак, если вы скомпилировали с -g (или с -rdynamic), то вам повезло. Вы должны быть в состоянии сделать следующее:
$ # get the address in the ELF so using objdump or nm
$ nm libtst.so | grep myfunc
0000073c T myfunc5
$ # get the (hex) address after adding the offset
$ # from the start of the symbol (as provided by backtrace_syms())
$ python -c 'print hex(0x0000073c+0x2b)'
0x767
$ # use addr2line to get the line information, assuming any is available
addr2line -e libtst.so 0x767
Или, используя gdb:
$ gdb libtst.so
(gdb) info address myfunc
Symbol "myfunc" is at 0x073c in a file compiled without debugging. # (Faked output)
(gdb) info line *(0x073c+0x2b)
Line 27 of "foo.cpp" starts at address 0x767 <myfunc()+21> and ends at 0x769 <something>. # (Faked output)
Кроме того, если вы удалили библиотеку, но спрятали отладочные символы для последующего использования , то, скорее всего, вы получите только смещения ELF, распечатанные с помощью backtrace_syms (), и никаких имен символов (так что не вполне справедливо в исходном вопросе): в этом случае использование gdb возможно более удобно, чем использование других инструментов командной строки. Предполагая, что вы сделали это, вам нужно будет вызвать gdb следующим образом (например):
$ gdb -s debug/libtst.debug -e libtst.so
А затем выполните последовательность действий, аналогичную приведенной выше, используя «информационную строку» и «информационный адрес» в зависимости от того, есть ли у вас только смещения символов ELF или имена символов плюс смещения.