Вызывающая функция в ядре Linux
Есть ли способ получить функцию вызова в ядре Linux? Я знаю, что __func__ возвращает имя выполняемой функции. Я ищу функцию, которая называется "__func__"
4 ответа
Вы можете получить звонящего с __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()
и т.п.
Вы также можете распечатать все содержимое стека вызовов, вызвав dump_stack().
Необходимость указателей кадра зависит от арки, IIRC. Для x86 они, безусловно, желают в полной мере использовать эти функции. Также обратите внимание, что по этой причине встраивание может исказить точность встроенного_адреса.
Если вы просто хотите получить дамп стека, чтобы увидеть, как было достигнуто какое-то место, лучше используйте dump_stack()
функции, чем пытаться возиться с встроенным_адресом_адрес.
Чтобы получить имя функции вызывающей стороны, можно использовать приведенную ниже команду printk.
printk ("Звонящий%pF\n", __builtin_return_address(0));