Comment définir un point d'arrêt logiciel sur un processeur ARM?
Comment dois-je faire l'équivalent d'un x86 interruption logicielle:
asm( "int $3" )
sur un processeur ARM (en particulier un Cortex A8) pour générer un événement qui va briser l'exécution sous gdb?
source d'informationauteur engie
Vous devez vous connecter pour publier un commentaire.
BRAS ne permet pas de définir un point d'arrêt de l'instruction. Il peut être différente pour différents Systèmes d'exploitation. Sur Linux ARM il est généralement une UND opcode (par exemple
FE DE FF E7
) en mode de BRAS et BKPT (BE BE
) dans le Pouce.Avec de compilateurs GCC, vous pouvez généralement utiliser
__builtin_trap()
intrinsèque pour générer une plate-forme spécifique point d'arrêt. Une autre option estraise(SIGTRAP)
.À l'aide de arm-none-eabi-gdb.exe le compilateur croisé, cela fonctionne très bien pour moi (merci à Igor de réponse):
J'ai une simple bibliothèque (scottt/debugbreak) juste pour cela:
Il suffit de copier le seul
debugbreak.h
l'en-tête dans votre code et il va gérer correctement les BRAS, AArch64, i386, x86-64 et même MSVC.__asm__ __volatile__ ("bkpt #0");
Voir BKPT homme entrée.
Pour Windows sur ARM, le instrinsic
__debugbreak()
encore des travaux qui utilise undefined opcode.Sur mon armv7hl (j'.MX6q avec linux 4.1.15), pour définir un point d'arrêt dans un autre processus, j'utilise :
ptrace(PTRACE_POKETEXT, pid, adresse, 0xe7f001f0)
J'ai choisi la valeur après strace avec gdb 🙂
Cela fonctionne parfaitement : je peux examiner le tracé de remettre de l'ordre initial, et de relancer le processus avec PTRACE_CONT.