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