Lowlevel

Lowlevel => Softwareentwicklung => Thema gestartet von: Dimension am 05. June 2012, 13:55

Titel: qemu: fatal: Trying to execute code outside RAM or ROM
Beitrag 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.
Titel: Re: qemu: fatal: Trying to execute code outside RAM or ROM
Beitrag von: kevin am 05. June 2012, 14:55
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.
Titel: Re: qemu: fatal: Trying to execute code outside RAM or ROM
Beitrag von: Dimension am 05. June 2012, 15:45
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
Titel: Re: qemu: fatal: Trying to execute code outside RAM or ROM
Beitrag von: Dimension am 05. June 2012, 15:53
OK, gdb info symbol geht auch...