GDB single stepper automatisieren

Posted on 22.02.2008

Heute musste ich relativ viel mit GDB (GNU Debugger) hantieren, der zusammen mit QEmu ein echt wertvolles Tool darstellt.

Unter anderem geht es um die Frage, an welcher Stelle GRUB2 (der Bootloader), bzw. ein Modul, an dem ich gerade arbeite hängt (und im zweiten Schritt, warum).

Also GRUB2 in QEmu geladen, der mit GDB-Hook ausgestattet wurde (-s -S flags), gdb drangehängt, kernel.elf als Symboltabelle hergenommen (0x8200 ist in meinem Fall die Ladeadresse), das Modul für die Symbole in GDB geladen (set debug=modules, insmod - die letzte genannte Adresse ist in der Regel der gesuchte Wert) und durchgesteppt. und gesteppt. und gesteppt.. So ein Singlestepper kann ganz schön langweilig sein, der geht wirklich jeden einzelnen Befehl durch und nexti (also nicht jeden Sprung mitnehmen) war nicht detailliert genug. Da QEmu hängt, sobald das Problem auftritt, muss sich das doch irgendwie automatisieren lassen.

Und ja, es geht:

set pagination off
while 1 == 1
   stepi
end

“pagination off” ist sinnvoll, weil GDB sonst alle 25 Zeilen (oder wieviel auch immer eine Seite sind) nachfragt, ob man sich den Kram nicht erstmal durchlesen will. Für “1 == 1” gibt es vielleicht auch noch was kürzeres, halt irgendein “true”, was auch immer GDB darunter versteht (“true” könnte sogar funktionieren, hab ich nicht probiert)

Übrigens hängt mein Modul in __udivdi3 - das kommt aus libgcc und wickelt elementare Mathematik ab, nämlich die Division und scheint an einer Division durch 0 zu scheitern - wie auch immer diese zustande kommt.