在经历崩溃转储时,我遇到了以下行
j java.awt.EventDispatchThread.pumpEventsForFilter(ILjava/awt/Conditional;Ljava/awt/EventFilter;)V+35
我有几个问题,我急切地想了解。
IL 和 L 在字符串中代表什么ILjava/awt/Conditional;Ljava/awt/EventFilter;
字符串末尾的 V+35 是什么?
这些是方法签名中的类型字符串。
(ILjava/awt/Conditional;Ljava/awt/EventFilter;)V
I
意味着int
Ljava/awt/Conditional;
意味着java.awt.Conditional
Ljava/awt/EventFilter;
意味着java.awt.EventFilter
V
表示void
。
所以调用堆栈上的方法
void pumpEventsForFilter(int, Conditional, EventFilter)
此内部类型字符串语法记录在 javadoc forClass.getName()
和 JVM 规范中。 (相同的语法出现在Object.toString
生成的字符串中...假设它没有被更人性化的东西覆盖。
+35
是一个字节码偏移量;即指示方法执行在这个堆栈帧中的位置。
在回答您的问题时,Oracle 关于致命错误日志的文档非常肤浅。
看起来这个答案至少对崩溃转储中的+35
位有一个彻底的解释。根据该答案,这将为您提供生成的字节代码中的偏移量。
IL
和L
仍然是个谜。