如何在ARM处理器上设置软件断点?

时间:2012-07-05 13:30:11

标签: debugging assembly gdb arm

如何进行x86软件中断的等效操作:

asm( "int $3" )
在ARM处理器(特别是Cortex A8)上生成一个会破坏gdb下执行的事件?

8 个答案:

答案 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:

或者我们可以使用UND伪指令来生成未定义的指令,如果处理器试图执行该指令,则会导致异常。