Autor Thema: qemu: fatal: Trying to execute code outside RAM or ROM  (Gelesen 8129 mal)

Dimension

  • Beiträge: 155
    • Profil anzeigen
Gespeichert
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.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 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.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Dimension

  • Beiträge: 155
    • Profil anzeigen
Gespeichert
« Antwort #2 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

Dimension

  • Beiträge: 155
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 05. June 2012, 15:53 »
OK, gdb info symbol geht auch...

 

Einloggen