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