Как определить, исходит ли указатель на функцию из общей библиотеки или основного исполняемого файла? ⇐ C++
Как определить, исходит ли указатель на функцию из общей библиотеки или основного исполняемого файла?
Я использую 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 в кадре трассировки стека, но это кажется... неправильным.
Я использую 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 в кадре трассировки стека, но это кажется... неправильным.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение