这是jdk中的断点代码。
#ifdef ARM
#ifdef SOLARIS
#define BREAKPOINT __asm__ volatile (".long 0xe1200070")
#else
#define BREAKPOINT __asm__ volatile (".long 0xe7f001f0")
#endif
#else
extern "C" void breakpoint();
#define BREAKPOINT ::breakpoint()
#endif
我想知道“ .long 0xe1200070”和“ .long 0xe7f001f0”是否有特殊含义?
最佳答案
将HotSpot移植到ARM时,发现内联断点而不是调用外部breakpoint()
函数很有用。如果JVM到达此位置,将发生崩溃的有意义的上下文:附近的指令和相关的寄存器值。.long 0xe7f001f0
是未定义指令的编码。保留ARM 0x.7f...f.
指令空间以生成未定义的指令异常。显然没有助记符,因此没有数字文字。 GDB对arm-eabi上的断点使用相同的操作码。.long 0xe1200070
是手动编码的BKPT
操作码。我还没有看过Solaris / ARM平台,但是我想这是通常在那里编码断点的方式。