Как определить, исходит ли указатель на функцию из общей библиотеки или основного исполняемого файла?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как определить, исходит ли указатель на функцию из общей библиотеки или основного исполняемого файла?

Сообщение Anonymous »


Я использую backtrace и backtrace_symbols, чтобы получить трассировку стека, когда в моей программе выдается пользовательское исключение (на данный момент, в Linux... особенно в Ubuntu)< /п> trace_size = backtrace(stack_traces, MAX_STACK_FRAMES); сообщения = backtrace_symbols (stack_traces, Trace_size); Из трассировки стека я могу перебрать каждый кадр и извлечь адрес, по которому программа находилась в этом кадре.

Я получаю два типа адресов в зависимости от того, где была определена функция:
[*]Адрес библиотеки:
/path/to/library.so(mangled_function_name+0x75) [0x7f02bcdfa849] ^^^^^^^^^^^^^^^ [*]Адрес исполняемого файла: /path/to/executable(mangled_function_name?+0x90) [0x403336] ^^^^^^^^ [0x7f02bcdfa849] и [0x403336] — вот в чем мои опасения...

Я хочу передать эти адреса в addr2line.

Однако для адресов, принадлежащих общим библиотекам, это не сработает. Я узнал, что сначала мне нужно вычислить смещение анализируемого адреса от базового адреса, по которому была загружена библиотека.

addr2line -e /path/to/library.so 0x7f02bcdfa849 # не будет работать # или addr2line -e /path/to/executable 0x403336 # работает нормально Я знаю, что могу использовать ::dladdr, чтобы найти базовый адрес и смещение от него.

Но как я могу во время выполнения определить, нужно ли мне выполнять это преобразование? Например, как я могу определить, принадлежит ли адрес общей библиотеке во время выполнения?

Я пробовал просто проверить, отображается ли .so в кадре трассировки стека, но это кажется... неправильным.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»