linux内核中的函数调用者

时间:2010-11-10 04:50:20

标签: linux-kernel linux-device-driver embedded-linux kernel kernel-mode

有没有办法在linux内核中获取函数调用者?我知道 __ func __ 会返回正在执行的函数名称。我正在寻找名为“ __ func __ ”的函数

4 个答案:

答案 0 :(得分:38)

您可以通过__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()等。

答案 1 :(得分:5)

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

答案 2 :(得分:4)

是否需要帧指针取决于arch,IIRC。对于x86,他们当然希望充分利用这些功能。另请注意,内联可能会因为这个原因而扭曲builtin_return_address的准确性。

如果您只是想要一个堆栈转储来查看某个地方是如何到达的,那么最好使用dump_stack()函数而不是试图摆弄builtin_return_address。

答案 3 :(得分:0)

要获取调用者函数名称,可以使用以下printk命令。

printk(“来电者是%pF \ n”,__ builtin_return_address(0));