Есть ли библиотечный вызов addr2line?

Мне нужно получить информацию, предоставленную addr2line (файл и строка из обратной трассировки вызова функции) из программы на C++. Есть ли библиотечный вызов, аналогичный addr2line?

изменить: я работаю в среде Linux.

Я знаю, что могу вызвать addr2line напрямую, и я знаю, что могу использовать исходный код addr2line в моей программе (которая также находится под лицензией GPL). Но я предполагаю, что вызов библиотечной функции, если она существует, чище.

редактировать: я буду использовать bfd из binutils, как это делает addr2line. Что вообще означает bfd?


person steffen    schedule 19.07.2012    source источник
comment
libdwarf это то, что вы ищете   -  person Johannes Schaub - litb    schedule 19.07.2012
comment
Спасибо за предложение. Я попробовал dwarfdump, и он печатает только там, где объявлены функции, а не там, где они вызываются. Я не мог найти приличную документацию, хотя...   -  person steffen    schedule 19.07.2012
comment
bfd — это en.wikipedia.org/wiki/Binary_File_Descriptor_library (хотя первоначально он обозначал другой значение BFD :)   -  person ecatmur    schedule 20.07.2012
comment
Вы можете видеть вызовы, которые addr2line делает с ltrace, но вы можете не захотеть напрямую связываться с bfd: lists.debian.org/debian-devel/2005/05/msg01086.html   -  person Flexo    schedule 20.07.2012
comment
дох! Так что мой единственный способ - вызвать popen(addr2line,r) и проанализировать вывод!   -  person steffen    schedule 20.07.2012
comment
Вот вам рабочая реализация. github.com/albfan/bindutils-gdb/issues/1. Now — это системный вызов, но его цель — создать библиотеку addr2line. Кажется довольно легко!   -  person albfan    schedule 08.10.2016


Ответы (2)


Проверьте исходный код реализации addr2line в bsd, он содержит всего около 400 строк кода. Изменить источник на библиотечную функцию должно быть очень просто. http://sourceforge.net/p/elftoolchain/code/HEAD/tree/trunk/addr2line/addr2line.c

person user416983    schedule 28.02.2013

Вы можете попробовать функцию dladdr(). Он использует динамические символы программы, а не отладочную информацию (компилируйте программу с помощью gcc -rdynamic).

Кроме того, вы можете проверить библиотеку backtrace или stacktrace библиотека.
Не совсем то, о чем вы спрашиваете, но они могут оказаться полезными.

person rodrigo    schedule 19.07.2012
comment
Спасибо за подсказки. С помощью dladdr() я получаю информацию только для динамически связанного кода и только имя файла, а не строку, если я правильно понимаю справочную страницу. Я уже использую обратную трассировку для получения адреса. Что мне нужно сейчас, так это что-то, чтобы получить файл и строку из адреса. stacktrace — это просто оболочка для обратной трассировки. - person steffen; 19.07.2012
comment
В дополнение к ним есть также библиотека libunwind: nongnu.org/libunwind - person Arto Bendiken; 04.07.2015
comment
@ArtoBendiken libunwind не имеет функций, подобных addr2line. Он обеспечивает только смещение - person tjysdsg; 25.07.2021