有没有办法在linux内核中获取函数调用者?我知道 __ func __ 会返回正在执行的函数名称。我正在寻找名为“ __ func __ ”的函数
答案 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));