Как получить имя функции указателя на функцию C

У меня следующая проблема: когда я получаю обратную трассировку в C с помощью функции backtrace (3), символы возвращают имя функции, легко определяемое с помощью библиотеки dwarf и dladdr (3).

Проблема в том, что если у меня есть простой указатель на функцию (например, передав его & function ) функции dladdr + dwarf не могут помочь. Кажется, что указатель отличается от указателя, возвращаемого backtrace (3) (это не странно, поскольку backtrace получает эти указатели функций прямо из стека).

У меня вопрос, есть ли какой-нибудь метод для разрешения этих имен тоже? Кроме того, я хотел бы точно знать, в чем разница между двумя указателями.

Спасибо!

ОБНОВЛЕНИЕ:

Разница между указателями довольно существенная:
Тот, который я получаю с помощью backtrace: 0x8048ca4
Версия с прямым указателем: 0x3ba838

Мне кажется, что второму нужно смещение.

7
задан terminus 27 August 2010 в 20:25
поделиться

1 ответ

Судя по существенным различиям в приведенных вами типичных адресах, один из них относится к реальной общей библиотеке, а другой — к вашему основному исполняемому файлу. Читая между строк справочной страницы для dladdr(3), может случиться так, что если символ не находится в модуле, который был загружен dlopen(3) , возможно, не удастся восстановить совпадающие имена файлов и символов.

Я предполагаю, что вы не удалили символы ни с одного модуля, который вам нужен, иначе все ставки сняты. Если исполняемый файл имеет символы, то в них должна быть возможность найти тот, который точно совпадает с адресом любой именуемой функции. В конце концов, указатель на функцию — это именно то, что нужно.

1
ответ дан 7 December 2019 в 20:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: