Wie bestimmen Sie bei einer Kernel-Stack-Ablaufverfolgung wie folgt die bestimmte Codezeile, in der das Problem aufgetreten ist?
kernel: [<ffffffff80009a14>] __link_path_walk+0x173/0xfb9
kernel: [<ffffffff8002cbec>] mntput_no_expire+0x19/0x89
kernel: [<ffffffff8000eb94>] link_path_walk+0xa6/0xb2
kernel: [<ffffffff80063c4f>] __mutex_lock_slowpath+0x60/0x9b
kernel: [<ffffffff800238de>] __path_lookup_intent_open+0x56/0x97
kernel: [<ffffffff80063c99>] .text.lock.mutex+0xf/0x14
kernel: [<ffffffff8001b222>] open_namei+0xea/0x712
kernel: [<ffffffff8006723e>] do_page_fault+0x4fe/0x874
kernel: [<ffffffff80027660>] do_filp_open+0x1c/0x38
kernel: [<ffffffff8001a061>] do_sys_open+0x44/0xbe
kernel: [<ffffffff8005d28d>] tracesys+0xd5/0xe0
Ich habe zwar keine Probleme, den Funktionsaufruf zu finden - aber die Übersetzung von __link_path_walk plus Offset zu einer tatsächlichen Zeilennummer ist der schwierige Teil.
Angenommen, dies gilt für einen von der Standarddistribution bereitgestellten Kernel, für den ich die genaue Version und Build-Nummer kenne. Wie werden die erforderlichen Metadaten abgerufen und die entsprechende Suche durchgeführt?
CONFIG_KALLSYMS
Ich habe kein ~ = RHEL5 zur Hand, daher stammt die angezeigte Ausgabe von einem Fedora 20, obwohl der Prozess größtenteils der gleiche sein sollte ( der Name der Funktion hat sich geändert ).
Sie müssen das entsprechende
kernel-debug-debuginfo
Paket für Ihren Kernel installieren (RHEL oder eine abgeleitete Distribution vorausgesetzt). Dieses Paket enthält einvmlinux
Image (eine nicht komprimierte, nicht entpackte Version des Kernels):Dieses Bild kann direkt mit verwendet werden
gdb
Sie können auch
objdump(1)
auf demvmlinux
Bild verwenden:Die Flaggen sind:
Dort können Sie die Funktion nachschlagen:
und passen Sie den Offset an die tatsächliche Codezeile an.
quelle
Machen Sie die Stack-Dump-Ausgabe wieder nützlich.
quelle
Wenn addr2line ein Fragezeichen für die Zeilennummer ausgeben soll oder objdump den Quellcode nicht einbinden kann und Sie einen benutzerdefinierten Kernel haben, müssen Sie den Kernel mit CONFIG_DEBUG_INFO neu kompilieren. Möglicherweise müssen Sie den Fehler mit dem soeben erstellten Kernel reproduzieren.
quelle