Как получить имя функции указателя на функцию C - PullRequest
7 голосов
/ 27 августа 2010

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

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

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

Спасибо!

UPDATE:

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

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

Ответы [ 2 ]

1 голос
/ 28 августа 2010

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

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

0 голосов
/ 28 августа 2010

addr2line (1) может быть именно тем, что вы ищете.

...