这是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平台,但是我想这是通常在那里编码断点的方式。

08-07 23:01