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

Ответить Пред. темаСлед. тема
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 МБ.

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

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