如何在内核模块代码中包含 C 回溯?

2023-12-25

所以我试图找出哪些内核进程正在调用块驱动程序中的某些函数。我认为在 C 库中包含 backtrace() 会让事情变得容易。但我在加载回溯时遇到问题。

我复制了这个示例函数来显示回溯:

http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/063/6391/6391l1.html http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/063/6391/6391l1.html

所有编译尝试都会在某个地方或另一个地方出现错误,即找不到文件或未定义函数。

这是最接近的。

在 Makefile 中我放置了编译器指令:

 -rdynamic -I/usr/include 

如果我省略第二个 -I/usr/include,那么编译器会报告找不到所需的标头 execinfo.h。

接下来,在我想要执行回溯的代码中,我复制了示例中的函数:

//trying to include the c backtrace capability
#include <execinfo.h>

void show_stackframe() {
void *trace[16];
char **messages = (char **)NULL;
int i, trace_size = 0;

trace_size = backtrace(trace, 16);
messages = backtrace_symbols(trace, trace_size);
printk(KERN_ERR "[bt] Execution path:\n");
for (i=0; i<trace_size; ++i)
    printk(KERN_ERR "[bt] %s\n", messages[i]);
}
//backtrace function

我稍后将对此函数的调用放在第一个错误迹象发生的块驱动程序函数中。简单地:

show_stackframe();

所以当我编译时,出现以下错误:

user@slinux:~/2.6-32$ make -s
Invoking make againt the kernel at /lib/modules/2.6.32-5-686/build
In file included from /usr/include/features.h:346,
        from /usr/include/execinfo.h:22,
        from /home/linux/2.6-32/block/block26.c:49:
/usr/include/sys/cdefs.h:287:1: warning: "__always_inline" redefined
In file included from /usr/src/linux-headers-2.6.32-5-common/include/linux/compiler-gcc.h:86,
        from /usr/src/linux-headers-2.6.32-5-common/include/linux/compiler.h:40,
        from /usr/src/linux-headers-2.6.32-5-common/include/linux/stddef.h:4,
        from /usr/src/linux-headers-2.6.32-5-common/include/linux/list.h:4,
        from /usr/src/linux-headers-2.6.32-5-common/include/linux/module.h:9,
        from /home/linux/2.6-32/inc/linux_ver.h:40,
        from /home/linux/2.6-32/block/block26.c:32:
/usr/src/linux-headers-2.6.32-5-common/include/linux/compiler-gcc4.h:15:1: warning: this is the location of the previous definition
    /home/linux/2.6-32/block/block26.c:50: warning: function declaration isn’t a prototype
WARNING: "backtrace" [/home/linux/2.6-32/ndas_block.ko] undefined!
WARNING: "backtrace_symbols" [/home/linux/2.6-32/ndas_block.ko] undefined!

注意:block26.c 是我希望从中获取回溯的文件。

当 backtrace 和 backtrace_symbols 编译到 .ko 模块中时仍然未定义,是否有明显的原因?

我猜测是因为我使用编译器 include execinfo.h ,它驻留在计算机上并且没有加载到模块中。

至少可以说,这是我没有受过教育的猜测。

任何人都可以提供帮助来在模块中加载回溯函数吗?

感谢您查看此询问。

我正在 debian 上工作。当我取出该函数等时,该模块可以正常编译并且几乎可以完美运行。

来自 ndasusers


要打印堆栈内容和内核日志的回溯,请使用dump_stack()在你的内核模块中运行。它声明于linux/kernel.h在内核源代码目录的 include 文件夹中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在内核模块代码中包含 C 回溯? 的相关文章

随机推荐