2012-07-05 12 views
12

¿Cómo puedo hacer el equivalente de una interrupción de software x86:¿Cómo configuro un punto de interrupción de software en un procesador ARM?

asm("int $3") 

en un procesador ARM (en concreto una corteza A8) para generar un evento que romperá ejecución bajo gdb?

+0

El uso de la instrucción BKPT genera un SIGBUS que parece estropear el contador del programa. – engie

+0

use la instrucción swi, creo svc es otro nombre para esa instrucción dependiendo de qué sabor de brazo. –

+0

La instrucción SWI depende del sistema operativo/depurador. El depurador Angel define el código 0x18 como ReportException y el subcódigo 0x20020 como punto de interrupción. No es portátil. http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0058d/BACBEFAA.html –

Respuesta

17

ARM no define una instrucción específica de punto de interrupción. Puede ser diferente en diferentes sistemas operativos. En ARM Linux, generalmente es un código de operación UND (por ejemplo, FE DE FF E7) en modo ARM y BKPT (BE BE) en el pulgar.

Con los compiladores de GCC, generalmente puede usar __builtin_trap() intrinsic para generar un punto de interrupción específico de la plataforma. Otra opción es raise(SIGTRAP).

7

Usando compilador cruzado brazo-ninguno-EABI-gdb.exe, esto funciona muy bien para mí (gracias a la respuesta de Igor):

__asm__("BKPT"); 
1

para Windows en ARM, la intrínseca __debugbreak() sigue funcionando que utiliza código de operación indefinido .

nt!DbgBreakPointWithStatus: 
defe  __debugbreak 
2

que tienen una biblioteca sencilla (scottt/debugbreak) sólo para esto:

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

copiar el único encabezado debugbreak.h en su código y que va a manejar correctamente ARM, AArch64, i386, x86-64 e incluso MSVC.

1

__asm__ __volatile__ ("bkpt #0");

Ver BKPT entrada a la misma.

0

En mi armv7hl (i.MX6q con Linux 4.1.15) del sistema, para establecer un punto de interrupción en otro proceso, que utilizo:

ptrace (PTRACE_POKETEXT, pid, dirección, 0xe7f001f0)

elijo ese valor después de strace'ing gdb :)

Esto funciona perfectamente: puedo examinar el proceso trazado, restaurar las instrucciones originales y reiniciar el proceso con PTRACE_CONT.

Cuestiones relacionadas