【发布时间】:2015-03-20 17:54:41
【问题描述】:
我有一个没有核心转储的致命错误日志,需要找出原因。 这是在 .log 文件中找到的堆栈:
# Problematic frame:
# C [libc.so.6+0x7b4bb] memcpy+0x15b
{...}
Stack: [0x00002ac8c4d2c000,0x00002ac8c4e2d000], sp=0x00002ac8c4e28ef8, free space=1011k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [libc.so.6+0x7b4bb] memcpy+0x15b
C [libzip.so+0x50b0] ZIP_GetEntry+0xd0
C [libzip.so+0x3eed] Java_java_util_zip_ZipFile_getEntry+0xad
J 28 java.util.zip.ZipFile.getEntry(J[BZ)J (0 bytes) @ 0x00002ac8acf404ee [0x00002ac8acf40420+0xce]
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
J 28 java.util.zip.ZipFile.getEntry(J[BZ)J (0 bytes) @ 0x00002ac8acf40478 [0x00002ac8acf40420+0x58]
J 33 C2 java.util.zip.ZipFile.getEntry(Ljava/lang/String;)Ljava/util/zip/ZipEntry; (86 bytes) @ 0x00002ac8acf45548 [0x00002ac8acf45480+0xc8]
J 58 C2 java.util.jar.JarFile.getJarEntry(Ljava/lang/String;)Ljava/util/jar/JarEntry; (9 bytes) @ 0x00002ac8acf4e828 [0x00002ac8acf4e7e0+0x48]
J 44 C2 sun.misc.URLClassPath$JarLoader.getResource(Ljava/lang/String;Z)Lsun/misc/Resource; (91 bytes) @ 0x00002ac8acf47168 [0x00002ac8acf47100+0x68]
J 34 C2 sun.misc.URLClassPath.getResource(Ljava/lang/String;Z)Lsun/misc/Resource; (74 bytes) @ 0x00002ac8acf41f70 [0x00002ac8acf41f00+0x70]
j java.net.URLClassLoader$1.run()Ljava/lang/Class;+26
j java.net.URLClassLoader$1.run()Ljava/lang/Object;+1
v ~StubRoutines::call_stub
j java.security.AccessController.doPrivileged(Ljava/security/PrivilegedExceptionAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;+0
j java.net.URLClassLoader.findClass(Ljava/lang/String;)Ljava/lang/Class;+13
j java.lang.ClassLoader.loadClass(Ljava/lang/String;Z)Ljava/lang/Class;+70
j sun.misc.Launcher$AppClassLoader.loadClass(Ljava/lang/String;Z)Ljava/lang/Class;+36
j java.lang.ClassLoader.loadClass(Ljava/lang/String;)Ljava/lang/Class;+3
v ~StubRoutines::call_stub
j com.smackdapp.SmackHandler.handleRequest(Ljava/lang/String;Lorg/eclipse/jetty/server/Request;Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V+72
正如我在另一个 StackOverflow 答案中所读到的,这可能是替换 jvm 需要加载的任何 .jar 时的常见错误(或硬件内存错误)。
我试图猜测的是导致此致命错误的 .jar 文件。有什么方法可以通过致命错误日志中的信息来识别我的源代码中的行号?
我希望这行末尾的“V+72”有事可做,但想不通。
【问题讨论】:
-
我还阅读了 oracle 的有关致命错误日志文件 oracle.com/technetwork/java/javase/felog-138657.html 的文档,但没有帮助。
-
"V" 仅仅意味着它是一个 void 方法。我怀疑 +72 是方法中的字节码偏移量,但我不会发誓。
-
有人对此投了反对票——也许是因为他认为这可以被视为“请求调试帮助的题外话”左右。但事实上,对于许多开发人员来说,这是一个有趣且相关的问题,所以请跟我来。
-
用 -Xint 再次运行你的程序,看看它是否仍然失败。 java -Xint 我的程序。回来报告
-
谢谢@HotLicks。我正在尝试与 IntelliJ 报告的 bycode 匹配,但有很多 cmets。似乎不准确。