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