如何执行相当于 x86 软件中断的操作:
asm( "int $3" )
在 ARM 处理器(特别是 Cortex A8)上生成会中断 gdb 下执行的事件?
使用 arm-none-eabi-gdb.exe 交叉编译器,这对我很有用(感谢 Igor 的回答):
__asm__("BKPT");
ARM 没有定义特定的断点指令。在不同的操作系统中可能会有所不同。在 ARM Linux 上,它通常是FE DE FF E7
ARM 模式下的 UND 操作码(例如 )和 Thumb 中的 BKPT ( BE BE
)。
使用 GCC 编译器,您通常可以使用__builtin_trap()
内部函数来生成特定于平台的断点。另一种选择是raise(SIGTRAP)
。
我有一个简单的库(scottt/debugbreak)就是为了这个:
#include <debugbreak.h>
...
debug_break();
只需将单个标头复制debugbreak.h
到您的代码中,它就会正确处理 ARM、AArch64、i386、x86-64 甚至 MSVC。
__asm__ __volatile__ ("bkpt #0");
请参阅BKPT人条目。
对于 ARM 上的 Windows __debugbreak()
,使用未定义操作码的内在函数仍然有效。
nt!DbgBreakPointWithStatus:
defe __debugbreak
在我的 armv7hl(带有 linux 4.1.15 的 i.MX6q)系统上,要在另一个进程中设置断点,我使用:
ptrace(PTRACE_POKETEXT,pid,地址,0xe7f001f0)
我在 strace'ing gdb 之后选择该值 :)
这很完美:我可以检查跟踪的进程,恢复原始指令,并使用 PTRACE_CONT 重新启动进程。
尽管最初的问题是关于 ARMv7-A 的 Cortex-A7,但在 ARMv8 GDB 上使用
刹车 #0