Вызывающая функция в ядре Linux - PullRequest
20 голосов
/ 10 ноября 2010

Есть ли способ получить функцию вызова в ядре Linux? Я знаю, __ func __ возвращает имя выполняемой функции. Я ищу функцию, которая называется " __ func __ "

Ответы [ 4 ]

38 голосов
/ 10 ноября 2010

Вы можете позвонить с помощью __builtin_return_address(0).

Вызывающий абонент __builtin_return_address(1) и т. Д.

Это расширение GCC, описанное в руководстве по gcc: http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html

Редактировать: Я, вероятно, должен указать, что вы получите адрес звонящего. Если вам нужно имя функции, вы можете напечатать его с помощью %pS, например:

printk("Caller is %pS\n", __builtin_return_address(0));

Если вы не хотите его печатать, вы можете использовать kallsyms_lookup() и т. Д.

5 голосов
/ 19 сентября 2012

Вы также можете распечатать все содержимое стека вызовов, вызвав dump_stack ().

4 голосов
/ 22 ноября 2010

Необходимость указателей кадра зависит от арки, IIRC. Для x86 они, безусловно, желают в полной мере использовать эти функции. Также обратите внимание, что по этой причине встраивание может исказить точность встроенного_адреса.

Если вы просто хотите получить дамп стека, чтобы увидеть, как было достигнуто какое-то место, лучше используйте функцию dump_stack(), чем пытаться возиться с встроенным_адресом.

0 голосов
/ 30 сентября 2015

Чтобы получить имя функции вызывающей стороны, можно использовать следующую команду printk.

printk ("Caller is% pF \ n", __builtin_return_address (0));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...