20

有没有办法在linux内核中获取函数调用者?我知道__ func __返回正在执行的函数名称。我要寻找其所谓的“__ FUNC __linux内核函数调用者

+2

Muahahahaaa。哈哈......不理智。 – 2010-11-10 05:08:43

回答

37

你可以用__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()

+8

这是一些令人印象深刻的柔术。 – 2010-11-10 16:04:51

+0

您是否需要启用帧指针才能使用它? – Brad 2010-11-10 18:27:21

+0

是的,你可能需要帧指针。 – mpe 2010-11-11 13:34:50

4

无论帧指针需要依赖在拱门上,IIRC。对于x86,他们当然希望充分利用这些功能。还要注意,由于这个原因,内联可能会歪曲builtin_return_address的准确性。

如果您只是希望通过堆栈转储来查看某个位置是否已到达,那么最好使用dump_stack()函数,而不是试图绕过builtin_return_address。

5

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

0

要获取调用者函数名称,可以使用下面的printk命令。 (“Caller is%pF \ n”,__builtin_return_address(0));