linux内核中的函数调用者

BHS*_*BHS 20 kernel linux-device-driver linux-kernel embedded-linux kernel-mode

有没有办法在linux内核中获取函数调用?我知道__ func __返回正在执行的函数名.我正在寻找名为" __ func __ "的函数

mpe*_*mpe 40

你可以得到来电者__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));
Run Code Online (Sandbox Code Playgroud)

如果您不想打印,可以使用kallsyms_lookup()等.

  • 这是一些令人印象深刻的柔术. (8认同)
  • 顺便说一句:当使用__builtin_return_address(0)时,你不能用一个变量如int i替换0; 否则,你会得到一些编译错误.另外,在追溯过多时要小心,例如__builtin_return_address(10).如果调用堆栈不如10深,内核将很快崩溃. (4认同)

Ban*_*oot 5

您还可以通过调用dump_stack()来打印整个调用堆栈内容.