所以我試圖找出哪些內核進程正在調用塊驅動程序中的某些功能。我認爲在C庫中包含backtrace()會讓它變得容易。但是我無法加載回溯。如何將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();
所以,當我編譯它,以下錯誤:
[email protected]:~/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是我希望能得到回溯文件。
當編譯到.ko模塊時,回溯和backtrace_symbols爲什麼仍然未定義有明顯的原因嗎?
我猜測它是因爲我使用的編譯器包括execinfo.h,它駐留在計算機上並且未加載到模塊。
這是我沒有受過教育的猜測,至少可以說。
任何人都可以提供一個幫助,以獲得加載模塊中的回溯函數嗎?
感謝您查看此調查。
我正在研究debian。當我拿出功能等,模塊編譯好,幾乎完美的作品。
從ndasusers
我不太確定你是否應該在內核模塊代碼中包含這樣的庫。你有沒有嘗試過使用gdb並設置一箇中斷點? [1] [1]:http://www.xml.com/ldd/chapter/book/ch04.html#t5 – zdav 2011-05-02 22:37:13
哦老鼠!我很害怕聽到這樣的事情。這看起來像你已經與我聯繫的有用章節。感謝那。 – ndasusers 2011-05-02 23:44:39
與用戶空間程序不同,內核不與標準C庫(或任何其他庫)鏈接。 http://kernelnewbies.org/FAQ/LibraryFunctionsInKernel – jschmier 2011-05-03 18:21:59