21

如何执行相当于 x86 软件中断的操作:

asm( "int $3" )

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

4

8 回答 8

22

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

__asm__("BKPT");
于 2014-03-13T23:23:34.900 回答
19

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

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

于 2012-07-05T13:55:40.107 回答
8

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

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

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

于 2015-07-07T10:28:17.920 回答
6

__asm__ __volatile__ ("bkpt #0");

请参阅BKPT人条目。

于 2015-07-29T08:27:26.373 回答
3

对于 ARM 上的 Windows __debugbreak(),使用未定义操作码的内在函数仍然有效。

nt!DbgBreakPointWithStatus:
defe     __debugbreak
于 2014-09-23T08:36:13.757 回答
2

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

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

我在 strace'ing gdb 之后选择该值 :)

这很完美:我可以检查跟踪的进程,恢复原始指令,并使用 PTRACE_CONT 重新启动进程。

于 2017-08-23T12:52:22.323 回答
2

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

刹车 #0

于 2019-03-04T20:24:27.233 回答
2

我们可以使用断点 inst:

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

于 2019-03-30T09:40:52.917 回答