Java 为什么JDK';断点在ARM上定义给定的特殊值?
以下是jdk中的断点代码Java 为什么JDK';断点在ARM上定义给定的特殊值?,java,jvm,breakpoints,Java,Jvm,Breakpoints,以下是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 ::breakpoin
#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”是否有特殊含义?将热点移植到ARM时,我发现内联断点比调用外部
断点()更有用。如果JVM到达这个位置,就会有一个有意义的崩溃上下文:附近的指令和相关的寄存器值
.long 0xe7f001f0
是未定义指令的编码。ARM0x.7f…f.
保留指令空间以生成未定义的指令异常。显然,它没有助记符,因此是数字文字。GDB对arm eabi上的断点使用相同的操作码
.long 0xe1200070
是手动编码的BKPT
操作码。我没有见过Solaris/ARM平台,但我想这就是断点通常在那里编码的方式