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

问题描述 投票:15回答:8

我该如何做相当于x86软件的中断:

asm( "int $3" )

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

debugging assembly gdb arm
8个回答
17
投票

ARM没有定义特定的断点指令。它可以在不同的操作系统中有所不同。在ARM Linux上,它通常是ARM模式下的UND操作码(例如FE DE FF E7)和Thumb中的BKPT(BE BE)。

使用GCC编译器,您通常可以使用__builtin_trap() intrinsic来生成特定于平台的断点。另一种选择是raise(SIGTRAP)


11
投票

使用arm-none-eabi-gdb.exe交叉编译器,这对我很有用(感谢Igor的回答):

__asm__("BKPT");

5
投票

__asm__ __volatile__ ("bkpt #0");

BKPT man entry。


4
投票

我有一个简单的库(scottt/debugbreak)就是这样的:

#include <debugbreak.h>
...
debug_break();

只需将单个debugbreak.h标头复制到您的代码中,它就能正确处理ARM,AArch64,i386,x86-64甚至MSVC。


2
投票

对于ARM上的Windows,内在的qazxsw poi仍然可以使用未定义的操作码。

__debugbreak()

2
投票

我们可以使用断点inst:

  • 对于A32:使用nt!DbgBreakPointWithStatus: defe __debugbreak 指令
  • 对于Arm和Thumb:使用BRK #imm指令。

或者我们可以使用BKPT #imme伪指令生成未定义的指令,如果处理器尝试执行它,将导致异常。


1
投票

在我的armv7hl(i.MX6q with linux 4.1.15)系统上,要在另一个进程中设置断点,我使用:

ptrace(PTRACE_POKETEXT,pid,地址,0xe7f001f0)

strace'ing gdb后我选择了这个值:)

这非常有效:我可以检查跟踪过程,恢复原始指令,并使用PTRACE_CONT重新启动过程。


1
投票

虽然最初的问题是关于ARMv7-A的Cortex-A7,但在ARMv8 GDB上使用

闪电#0

© www.soinside.com 2019 - 2024. All rights reserved.