У меня следующая проблема: когда я получаю обратную трассировку в C с помощью функции backtrace (3), символы возвращают имя функции, легко определяемое с помощью библиотеки dwarf и dladdr (3).
Проблема в том, что если у меня есть простой указатель на функцию (например, передав его & function ) функции dladdr + dwarf не могут помочь. Кажется, что указатель отличается от указателя, возвращаемого backtrace (3) (это не странно, поскольку backtrace получает эти указатели функций прямо из стека).
У меня вопрос, есть ли какой-нибудь метод для разрешения этих имен тоже? Кроме того, я хотел бы точно знать, в чем разница между двумя указателями.
Спасибо!
ОБНОВЛЕНИЕ:
Разница между указателями довольно существенная:
Тот, который я получаю с помощью backtrace: 0x8048ca4
Версия с прямым указателем: 0x3ba838
Мне кажется, что второму нужно смещение.
Судя по существенным различиям в приведенных вами типичных адресах, один из них относится к реальной общей библиотеке, а другой — к вашему основному исполняемому файлу. Читая между строк справочной страницы для dladdr(3)
, может случиться так, что если символ не находится в модуле, который был загружен dlopen(3)
, возможно, не удастся восстановить совпадающие имена файлов и символов.
Я предполагаю, что вы не удалили символы ни с одного модуля, который вам нужен, иначе все ставки сняты. Если исполняемый файл имеет символы, то в них должна быть возможность найти тот, который точно совпадает с адресом любой именуемой функции. В конце концов, указатель на функцию — это именно то, что нужно.