Вызывающая функция в ядре 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));

Другие вопросы по тегам