Also versuche ich herauszufinden, welche Kernelprozesse einige Funktionen in einem Blocktreiber aufrufen. Ich dachte, das Hinzufügen von backtrace() in die C-Bibliothek würde es einfach machen. Aber ich habe Probleme, den Backtrace zu laden.
Ich habe diese Beispielfunktion kopiert, um den Backtrace anzuzeigen:
http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/063/6391/6391l1.html
Alle Kompilierungsversuche haben an der einen oder anderen Stelle den Fehler, dass eine Datei nicht gefunden werden kann oder dass die Funktionen nicht definiert sind.
Hier ist, was am nächsten kommt.
In das Makefile habe ich die Compiler-Direktiven eingefügt:
-rdynamic -I/usr/include
Wenn ich das zweite weglasse, -I/usr/include, meldet der Compiler, dass er den erforderlichen Header execinfo.h nicht finden kann.
Als nächstes habe ich in dem Code, in dem ich den Backtrace ausführen möchte, die Funktion aus dem Beispiel kopiert:
//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
Ich habe den Aufruf dieser Funktion später in eine Blocktreiberfunktion eingefügt, in der das erste Anzeichen des Fehlers auftritt. Einfach:
show_stackframe();
Also, wenn ich es kompiliere, die folgenden Fehler:
[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!
Hinweis: block26.c ist die Datei, von der ich hoffe, den Backtrace zu erhalten.
Gibt es einen offensichtlichen Grund, warum backtrace und backtrace_symbols undefiniert bleiben, wenn es in die .ko-Module kompiliert wird?
Ich vermute es, weil ich das Compiler-Include execinfo.h verwende, das sich auf dem Computer befindet und nicht in das Modul geladen wird.
Es ist meine ungebildete Vermutung, um es gelinde auszudrücken.
Kann jemand helfen, die Backtrace-Funktionen in das Modul zu laden?
Danke, dass Sie sich diese Anfrage angesehen haben.
Ich arbeite an Debian. Wenn ich die Funktion und dergleichen herausnehme, kompiliert das Modul einwandfrei und funktioniert fast perfekt.
Von ndasusers
Ich bin mir nicht sicher, ob Sie Bibliotheken wie diese in den Code des Kernelmoduls aufnehmen sollen. Haben Sie versucht, einfach gdb zu verwenden und einen Haltepunkt zu setzen? [1] [1]: xml.com/ldd/chapter/book/ch04.html#t5
– zdav
2. Mai 2011 um 22:37 Uhr
Ach Ratten! Ich hatte Angst, so etwas zu hören. Das sieht nach einem nützlichen Kapitel aus, mit dem Sie mich verlinkt haben. Dank dafür.
– ndasusers
2. Mai 2011 um 23:44 Uhr
Im Gegensatz zu User-Space-Programmen ist der Kernel nicht mit der Standard-C-Bibliothek (oder irgendeiner anderen Bibliothek, was das betrifft) gelinkt. kernelnewbies.org/FAQ/LibraryFunctionsInKernel
– jschmier
3. Mai 2011 um 18:21 Uhr
Jetzt, wo ich es verstehe, macht es absolut Sinn. Wie kann von einem Kernel erwartet werden, dass er viele Bibliotheken verwendet, die möglicherweise nicht einmal auf einem System vorhanden sind?
– ndasusers
7. Mai 2011 um 4:46 Uhr