20

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

4

4 回答 4

46

您可以使用__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()etc.

于 2010-11-10T14:47:15.510 回答
5

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

于 2012-09-18T22:48:45.597 回答
4

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

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

于 2010-11-22T03:28:26.003 回答
0

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

printk("调用者是 %pF\n", __builtin_return_address(0));

于 2015-09-30T10:27:25.627 回答