2012-07-05 3 views
12

come faccio a fare l'equivalente di un interrupt software x86:Come si imposta un breakpoint software su un processore ARM?

asm("int $3") 

su un processore ARM (in particolare un Cortex A8) per generare un evento che interrompere l'esecuzione in gdb?

+0

L'utilizzo dell'istruzione BKPT genera un SIGBUS che sembra rovinare il contatore del programma. – engie

+0

usa l'istruzione swi, credo che svc sia un altro nome per quella istruzione a seconda del sapore del braccio. –

+0

L'istruzione SWI dipende dal SO/debugger. Il debugger Angel definisce il codice 0x18 come ReportException e il sottocodice 0x20020 come punto di interruzione. Non è portatile. http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0058d/BACBEFAA.html –

risposta

17

ARM non definisce un'istruzione di breakpoint specifica. Può essere diverso in diversi sistemi operativi. Su ARM Linux di solito è un codice operativo UND (ad esempio FE DE FF E7) in modalità ARM e BKPT (BE BE) in Thumb.

Con i compilatori GCC, è possibile utilizzare in genere __builtin_trap() intrinseco per generare un punto di interruzione specifico della piattaforma. Un'altra opzione è raise(SIGTRAP).

7

Utilizzando il braccio-nessuno-EABI-gdb.exe cross compiler, questo funziona grande per me (grazie alla risposta di Igor):

__asm__("BKPT"); 
1

Per Windows su ARM, il instrinsic __debugbreak() funziona ancora che utilizza codice operativo non definito .

nt!DbgBreakPointWithStatus: 
defe  __debugbreak 
2

Ho una semplice libreria (scottt/debugbreak) solo per questo:

#include <debugbreak.h> 
... 
debug_break(); 

basta copiare il singolo debugbreak.h intestazione nel codice e sarà gestire correttamente ARM, AArch64, i386, x86-64 e persino MSVC.

1

__asm__ __volatile__ ("bkpt #0");

Vedi BKPT ingresso uomo.

0

Sul mio armv7hl (i.MX6q con Linux 4.1.15) del sistema, per impostare un punto di interruzione in un altro processo, io uso:

ptrace (PTRACE_POKETEXT, pid, indirizzo, 0xe7f001f0)

scelgo quel valore dopo strace'ing gdb :)

Ciò funziona perfettamente: posso esaminare il processo tracciato, ripristinare l'istruzione originale e riavviare il processo con PTRACE_CONT.