如何进行x86软件中断的等效操作:
asm( "int $3" )
在ARM处理器(特别是Cortex A8)上生成一个会破坏gdb下执行的事件?
答案 0 :(得分:17)
ARM没有定义特定的断点指令。它可以在不同的操作系统中有所不同。在ARM Linux上,它通常是ARM模式下的UND操作码(例如FE DE FF E7
)和Thumb中的BKPT(BE BE
)。
使用GCC编译器,您通常可以使用__builtin_trap()
内在函数来生成特定于平台的断点。另一个选项是raise(SIGTRAP)
。
答案 1 :(得分:11)
使用arm-none-eabi-gdb.exe交叉编译器,这对我很有用(感谢Igor的答案):
__asm__("BKPT");
答案 2 :(得分:5)
__asm__ __volatile__ ("bkpt #0");
请参阅BKPT人员条目。
答案 3 :(得分:4)
我有一个简单的库(scottt/debugbreak)就是为了这个:
#include <debugbreak.h>
...
debug_break();
只需将单个debugbreak.h
标头复制到您的代码中,它就能正确处理ARM,AArch64,i386,x86-64甚至MSVC。
答案 4 :(得分:2)
对于ARM上的Windows,内部__debugbreak()
仍可使用未定义的操作码。
nt!DbgBreakPointWithStatus:
defe __debugbreak
答案 5 :(得分:1)
在我的armv7hl(i.MX6q with linux 4.1.15)系统上,要在另一个进程中设置断点,我使用:
ptrace(PTRACE_POKETEXT,pid,address,0xe7f001f0)
我在strad'ing gdb后选择了这个值:)
这非常有效:我可以检查跟踪过程,恢复原始指令,然后使用PTRACE_CONT重新启动过程。
答案 6 :(得分:1)
尽管最初的问题是关于Cortex-A7(即ARMv7-A)的问题,但在ARMv8 GDB上使用了
brk#0
答案 7 :(得分:1)
我们可以使用断点inst:
对于A32:使用 BRK #imm指令
对于手臂和拇指:使用BKPT #imme指令。
或者我们可以使用UND伪指令来生成未定义的指令,如果处理器试图执行该指令,则会导致异常。