Wie debugge ich den Linux Kernel mit GDB und QEMU?
Ich bin neu in die kernel-Entwicklung, und ich würde gerne wissen, wie Sie die run/debug-linux-kernel mit QEMU und gdb. Ich bin eigentlich Lesen von Robert Love ist das Buch aber leider ist es nicht dem Leser helfen, wie zu installieren, die richtigen Werkzeuge zum ausführen oder Debuggen der kernel... Also, was ich Tat, war, Folgen Sie diesem tutorial http://opensourceforu.efytimes.com/2011/02/kernel-development-debugging-using-eclipse/. Ich bin mit eclipse als IDE zu entwickeln, die auf den kernel, aber Erstens wollte ich, um es arbeiten unter QEMU/gdb. So was habe ich bisher war:
1) Zum kompilieren des Kernels mit:
make defconfig (then setting the CONFIG_DEBUG_INFO=y in the .config)
make -j4
2) Sobald die Kompilierung ist vorbei ich Qemu gestartet mit:
qemu-system-x86_64 -s -S /dev/zero -kernel /arch/x86/boot/bzImage
dem starten des kernel in "stopped" state
3) So habe ich den Gebrauch von gdb, ich versuche folgenden Befehl:
gdb ./vmlinux
welche läuft es richtig, aber... Nun, ich weiß nicht, was zu tun ist... ich weiß, dass ich für die Verwendung von remote-debugging auf dem port 1234 (Standard-port verwendet, der von Qemu), mit dem vmlinux als symbol table file für die Fehlersuche.
Also meine Frage ist: Was muss ich tun, um führen Sie den kernel auf Qemu, befestigen, mein debugger und wird somit bekommen Sie zusammen arbeiten, um mein Leben einfacher mit der kernel-Entwicklung.
InformationsquelleAutor der Frage E-Kami | 2012-07-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde versuchen:
Verwendung der '-s' option macht qemu hört auf port tcp::1234, können Sie eine Verbindung zu localhost:1234 wenn Sie sich auf der gleichen Maschine. Qemu-s '-S' option macht Qemu beenden Sie die Ausführung, bis Sie die continue-Befehl.
Beste würde wahrscheinlich sein, einen Blick auf eine anständige GDB tutorial zu bekommen, zusammen mit dem, was Sie tun. Diese eine sieht ganz nett aus.
InformationsquelleAutor der Antwort BjoernD
Schritt-für-Schritt-Verfahren getestet auf Ubuntu 16.10 host
Einstieg von Grund auf schnell habe ich eine minimale Vollautomatische QEMU + Buildroot Beispiel: https://github.com/cirosantilli/linux-kernel-module-cheat/blob/c7bbc6029af7f4fab0a23a380d1607df0b2a3701/gdb-step-debugging.md Großen Schritte, die nachfolgend vorgestellt werden.
Zuerst ein root-Dateisystem
rootfs.cpio.gz
. Wenn Sie einen brauchen, die Sie berücksichtigen sollten:init
-nur ausführbare Bild: https://unix.stackexchange.com/questions/122717/custom-linux-distro-that-runs-just-one-program-nothing-else/238579#238579Dann auf dem Linux-kernel:
Auf einem anderen terminal, aus dem inneren des Linux-kernel-tree, angenommen, dass Sie möchten, starten Sie das Debuggen von
start_kernel
:und wir sind fertig!!
Für kernel-Module finden Sie unter: Gewusst wie: Debuggen von Linux-kernel-Module mit QEMU?
Für Ubuntu 14.04, GDB 7.7.1,
hbreak
nötig war,break
software-breakpoints ignoriert wurden. Nicht mehr der Fall in 16.10. Siehe auch: https://bugs.launchpad.net/ubuntu/+source/qemu-kvm/+bug/901944Chaotisch
disconnect
und was nach ihm kommen werden, um Fehler zu umgehen:Verwandte threads:
nokaslr
: https://unix.stackexchange.com/questions/397939/turning-off-kaslr-to-debug-linux-kernel-using-qemu-and-gdb/421287#421287Bekannte Einschränkungen:
-O0
: Wie zu de-optimieren der Linux-kernel und kompilieren Sie es mit -O0?max-completions
Update: Tab completion interrupt für große Binärdateien Wahrscheinlich eine Ecke Fall, die war nicht bedeckt, der patch. So einulimit -Sv 500000
ist eine kluge Aktion vor dem Debuggen. Blies, insbesondere wenn ich tab abgeschlossenfile<tab>
für diefilename
argumentsys_execve
: https://stackoverflow.com/a/42290593/895245Siehe auch:
InformationsquelleAutor der Antwort Ciro Santilli 新疆改造中心 六四事件 法轮功
BjoernID die Antwort nicht wirklich Arbeit für mich. Nachdem die erste Fortsetzung, kein breakpoint erreicht ist und auf einen interrupt, ich würde sehen, Zeilen wie:
Ich denke, das hat etwas zu tun mit verschiedenen CPU-Modi (real-Modus im BIOS-vs. long-Modus, wenn Linux gebootet wurde). Ja eh, die Lösung ist um QEMU laufen lassen, zuerst, ohne zu warten (d.h. ohne
-S
):In meinem Fall, ich musste brechen etwas beim Booten, also nach einigen deciseconds, lief ich den gdb-Befehl. Wenn Sie mehr Zeit haben (z.B. müssen Sie eine debug-Modul, das geladen wird, manuell), dann das timing nicht wirklich wichtig.
gdb
können Sie Befehle angeben, die ausgeführt werden soll, wenn Sie gestartet werden. Dies macht die Automatisierung ein bisschen einfacher. Die Verbindung zu QEMU (das sollte nun bereits gestartet sein), brechen auf eine Funktion und fortsetzen der Ausführung, Verwendung:InformationsquelleAutor der Antwort Lekensteyn
Wenn Sie versuchen, starten Sie die exe-Datei vmlinux mit gdb, dann erste, was gdb ist zu erteilen Befehle:
(gdb) target remote localhost:1234
(gdb) break start_kernel
(weiter)
Diese brechen mit dem kernel start_kernel.
InformationsquelleAutor der Antwort Ritesh
Als für mich die beste Lösung für das Debuggen des Kernels -, ist die Verwendung von gdb aus Eclipse-Umgebung. Sie sollten nur die entsprechenden port für den gdb (muss identisch sein mit einer von Ihnen bestimmten qemu starten, string) in das remote-debugging-Abschnitt. Hier ist die Anleitung:
http://www.sw-at.com/blog/2011/02/11/linux-kernel-development-and-debugging-using-eclipse-cdt/
InformationsquelleAutor der Antwort Alex Hoppus