所以我试图找出哪些内核进程正在调用块驱动程序中的某些函数。我认为在 C 库中包含 backtrace() 会很容易。但是我无法加载回溯。
我复制了这个示例函数来显示回溯:
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