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

eng*_*gie 15 debugging assembly gdb arm

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

asm( "int $3" )
Run Code Online (Sandbox Code Playgroud)

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

Igo*_*sky 18

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

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

  • ** GCC / clang假设即使在`-O0`处,在__builtin_trap()之后的代码也无法访问。在https://godbolt.org/z/RNc7kY上,我们可以看到对于ARM,`.inst 0xe7f000f0`之后没有任何内容,甚至在函数末尾也没有`bx lr`。在x86上,它编译为`ud2`(非法指令),再次省略了代码以实现更高版本的C语句。即使在`-O0`处,ARM gcc8.2仍然保留函数结尾,尽管有用于后续C语句的代码。但这使其无法使用。 (3认同)

por*_*ast 13

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

__asm__("BKPT");
Run Code Online (Sandbox Code Playgroud)


sco*_*ttt 8

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

#include <debugbreak.h>
...
debug_break();
Run Code Online (Sandbox Code Playgroud)

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


Ben*_*oit 5

__asm__ __volatile__ ("bkpt #0");

请参见BKPT人员条目。

  • @L29Ah:如果没有“易失性”,编译器会重新排序断点的位置。那很糟... (4认同)