2013-11-04 27 views
5

Sono nuovo di qemu e ho letto che consente un'emulazione in modalità singlestep. Questo è utile perché sto provando a scaricare alcuni indirizzi della RAM fisica in ogni ciclo. Sfortunatamente, la documentazione di qemu è pessima. So come abilitare la modalità singlestep dal monitor qemu ma non ho idea di dove mettere il codice che voglio eseguire ad ogni passo. Qualcuno ha qualche informazione su questo?Come utilizzare la modalità a passo singolo in QEMU?

+0

La risposta di @peter ti ha aiutato? – stackoverflowwww

+1

Correlati: https://reverseengineering.stackexchange.com/questions/4738/using-qemu-monitor-interface-to-extract-execution-traces-from-a-binary –

risposta

0

È possibile utilizzare gdb da allegare alla ospite con la

tcp --gdb ::

opzione per QEMU e quindi utilizzare

$ gdb <binary> 
(gdb) symbol-file <sym file> 
(gdb) target remote <host>:<port number> 
(gdb) b <function> 
(gdb) c 

'b' imposta un punto di interruzione. È possibile utilizzare 'n' s '' i 'per eseguire il passaggio del codice. Entrare "info" in modalità gdb mostrerà ulteriori informazioni

+0

E beh, c'è la modalità -singlestep - non so come funziona - forse solleva un punto di interruzione per ogni passo in cui gdb si aggancia? –

+0

Ecco una guida all'installazione del GDB QEMU più dettagliata: https://stackoverflow.com/a/33203642/895245 –

0

http://www.xenproject.org/help/questions-and-answers/problem-with-vga-passthrough.html

Dal link qui sopra è l'opzione da riga di comando per l'inserimento di modalità singlestep per QEMU. Successivo è quello di ottenere il codice sorgente per QEMU (http://wiki.qemu.org/Download)

La funzione monitor.c: do_singlestep (Monitor * Lun, QDict const * QDict)

semplicemente impostare un flag "singlestep". Nota che questo non è lo stesso di "singlestep_enabled", che è quello di emulare l'emulazione di singlestep dell'hardware.

(la variabile globale è dichiarata in vl.c).

Ora guardate in tutte le funzioni in targt-i386/translate.c - dove si sperimentano flag "singlestep" sono:

if (singlestep) { 
     gen_jmp_im(pc_ptr - dc->cs_base); 
     gen_eob(dc); 
     break; 
    } 

Questo è il luogo dove i binari sono o eseguiti (o "tradotte" per essere più precisi), o altrimenti eccezione hardware sollevata e gestore (ad esempio). Se c'è qualche comportamento che vuoi modificare, puoi provare qui?