Linux kernel linux内核中的函数调用程序

Linux kernel linux内核中的函数调用程序,linux-kernel,linux-device-driver,embedded-linux,kernel,kernel-mode,Linux Kernel,Linux Device Driver,Embedded Linux,Kernel,Kernel Mode,有没有办法在linux内核中获取函数调用方?我知道\uuu func\uu返回正在执行的函数名。我正在寻找一个名为“\uuuu func\uu”的函数。您可以使用\uu内置返回地址(0)获取调用者 呼叫者的呼叫者是\u内置\u返回\u地址(1),依此类推 它是一个GCC扩展,记录在GCC手册中: 编辑:我可能应该指出,这会让你知道打电话的人的地址。如果需要函数名,可以使用%pS打印,例如: printk("Caller is %pS\n", __builtin_return_address(0)

有没有办法在linux内核中获取函数调用方?我知道\uuu func\uu返回正在执行的函数名。我正在寻找一个名为“\uuuu func\uu”的函数。

您可以使用
\uu内置返回地址(0)
获取调用者

呼叫者的呼叫者是
\u内置\u返回\u地址(1)
,依此类推

它是一个GCC扩展,记录在GCC手册中:

编辑:我可能应该指出,这会让你知道打电话的人的地址。如果需要函数名,可以使用
%pS
打印,例如:

printk("Caller is %pS\n", __builtin_return_address(0));

如果不想打印,可以使用
kallsyms\u lookup()
等。

是否需要帧指针取决于arch、IIRC。对于x86,他们当然希望充分利用这些特性。还请注意,内联可能会因为这个原因而影响内置返回地址的准确性


如果您只是想通过堆栈转储查看某个位置是如何到达的,最好使用
dump\u stack()
函数,而不是尝试摆弄内置的返回地址。

您还可以通过调用dump\u stack()打印整个调用堆栈内容

要获取调用方函数名,可以使用下面的printk命令


printk(“调用方是%pF\n”,内置返回地址(0))

哈哈哈。哈哈。。。不理智。这是令人印象深刻的柔术。顺便说一句:当使用uuu内置u返回u地址(0)时,不能用int i等变量替换0;否则,您将得到一些编译错误。此外,当回溯太多时要小心,例如uu内置u返回u地址(10)。如果调用堆栈没有10深,内核将很高兴崩溃。%pF已被弃用,%ps和%ps是首选方式