Lowlevel
Lowlevel => Softwareentwicklung => Thema gestartet von: Dimension am 05. June 2012, 13:55
-
Wenn qemu mit der Meldung "qemu: fatal: Trying to execute code outside RAM or ROM" abstürzt gibt es keine Möglichkeit mehr mit gdb ein backtrace zu bekommen. Um dennoch ein backtrace zu bekommen, habe ich folgendes bash-script geschrieben:
#!/bin/bash
gdb="gdb bin/kernel.bin --eval-command=\"set pagination off\" --eval-command=\"set confirm off\" --eval-command=\"target remote localhost:1234\""
echo "" > debug_backtrace_list
echo "# list functions..."
list="$(eval gdb bin/kernel.bin --batch --eval-command=\"set pagination off\" --eval-command=\"info functions\")"
echo "# generate break commands..."
while read line
do
line2=$(echo "$line" | grep -oP '((?<= )|(?<= \*))\w+(?=\()')
if [ "$line2" != "" ]
then
echo -ne "break $line2\ncommands\nbt\ncontinue\nend\n" >> debug_backtrace_list
fi
done <<< "$list"
echo "# run gdb..."
eval "$gdb --command=debug_backtrace_list --eval-command=\"continue\" $@" | tee -a debug_output
echo '# done'
qemu wird im Vorfeld gestartet mit
qemu-system-i386 -kernel bin/kernel.bin -s -S
Damit wird bei jedem Aufruf einer Funktion ein backtrace erstellt. Eventuell macht es noch Sinn, bestimmte Funktionsnamen auszulassen, wie bspw. putc.
-
Autsch. :-)
Also irgendwie schon ein netter Hack, aber irgendwie kommen mir da spontan Kanonen und Spatzen in den Sinn. Um rauszufinden, welche Codestelle dorthin springt, hätte ich eher -d in_asm benutzt (Achtung Spoiler: Es ist das iret ;)) und evtl. bringt der Registerdump noch was. Meistens braucht man gar nicht mehr Informationen.
-
Naja, irgendwie habe ich es nicht geschafft in qemu mit Symbolen zu loggen. Abgesehen davon habe ich mir zuerst mein /tmp gefüllt und mein System gecrasht, bevor ich die glorreiche Idee hatte ein loop device zu mounten xD
-
OK, gdb info symbol geht auch...