使用SIGABRT的Java堆分析崩溃
我试图分析由C编写的方法分配的本机内存,并通过使用SIGABRT的Java堆分析崩溃,java,jvm,profiling,heap,Java,Jvm,Profiling,Heap,我试图分析由C编写的方法分配的本机内存,并通过JNI插入到JVM。我安装了 $ valgrind --version valgrind-3.13.0 并尝试使用以下选项运行JVM: valgrind --tool=massif --massif-out-file=/tmp/massif-j.out java -XX:+UnlockDiagnosticVMOptions //... 问题是它在创建核心转储时崩溃 0x00000000080e4196: fxrstor64 (%rs
JNI
插入到JVM
。我安装了
$ valgrind --version
valgrind-3.13.0
并尝试使用以下选项运行JVM:
valgrind --tool=massif --massif-out-file=/tmp/massif-j.out java
-XX:+UnlockDiagnosticVMOptions //...
问题是它在创建核心转储时崩溃
0x00000000080e4196: fxrstor64 (%rsp)
0x00000000080e419b: add $0x200,%rsp
0x00000000080e41a2: mov (%rsp),%r15
0x00000000080e41a6: mov 0x8(%rsp),%r14
0x00000000080e41ab: mov 0x10(%rsp),%r13
0x00000000080e41b0: mov 0x18(%rsp),%r12
0x00000000080e41b5: mov 0x20(%rsp),%r11
0x00000000080e41ba: mov 0x28(%rsp),%r10
0x00000000080e41bf: mov 0x30(%rsp),%r9
0x00000000080e41c4: mov 0x38(%rsp),%r8
0x00000000080e41c9: mov 0x40(%rsp),%rdi
0x00000000080e41ce: mov 0x48(%rsp),%rsi
0x00000000080e41d3: mov 0x50(%rsp),%rbp
0x00000000080e41d8: mov 0x60(%rsp),%rbx
0x00000000080e41dd: mov 0x68(%rsp),%rdx
0x00000000080e41e2: mov 0x70(%rsp),%rcx
0x00000000080e41e7: mov 0x78(%rsp),%rax
0x00000000080e41ec: add $0x80,%rsp
0x00000000080e41f3: add $0x8,%rsp
0x00000000080e41f7: Fatal error: Disassembling failed with error code: 15#
# A fatal error has been detected by the Java Runtime Environment:
#
# Internal Error (sharedRuntime.cpp:834), pid=12441, tid=0x0000000021385700
# fatal error: exception happened outside interpreter, nmethods and vtable stubs at pc 0x00000000080e4147
#
# JRE version: Java(TM) SE Runtime Environment (8.0_181-b13) (build 1.8.0_181-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.181-b13 mixed mode linux-amd64 compressed oops)
# Core dump written. Default location: /var/log/prj/core or core.12441
#
# An error report file with more information is saved as:
# /var/log/prj/hs_err_pid12441.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
#
==12441==
==12441== Process terminating with default action of signal 6 (SIGABRT): dumping core
==12441== at 0x54AAE97: raise (raise.c:51)
==12441== by 0x54AC800: abort (abort.c:79)
==12441== by 0x658B3C4: ??? (in /usr/lib/jvm/java-oracle-8-amd64/jdk/jre/lib/amd64/server/libjvm.so)
==12441== by 0x672F5B2: ??? (in /usr/lib/jvm/java-oracle-8-amd64/jdk/jre/lib/amd64/server/libjvm.so)
==12441== by 0x615EE98: ??? (in /usr/lib/jvm/java-oracle-8-amd64/jdk/jre/lib/amd64/server/libjvm.so)
==12441== by 0x662A099: ??? (in /usr/lib/jvm/java-oracle-8-amd64/jdk/jre/lib/amd64/server/libjvm.so)
==12441== by 0x6591A49: JVM_handle_linux_signal (in /usr/lib/jvm/java-oracle-8-amd64/jdk/jre/lib/amd64/server/libjvm.so)
==12441== by 0x6587652: ??? (in /usr/lib/jvm/java-oracle-8-amd64/jdk/jre/lib/amd64/server/libjvm.so)
==12441== by 0x4E4588F: ??? (in /lib/x86_64-linux-gnu/libpthread-2.27.so)
==12441== by 0x80E4146: ???
==12441== by 0x107: ???
==12441== by 0x84CBC43: ???
==12441== by 0x10001BD37: ???
==12441== by 0xFDC7103F: ???
==12441== by 0xA3FFFFFFFF: ???
==12441== by 0xFF9275A7: ???
==12441==
谁能告诉我哪里会出错?这是因为致命错误:反汇编失败,错误代码为:15#
?Valgrind(以及基于Valgrind的工具)使用自修改代码。然而,HotSpot JVM严重依赖于动态代码生成,包括覆盖和修补先前生成的指令。即使禁用了JIT编译器,这一点仍然有效,因为HotSpot还为解释器和运行时存根使用动态代码生成
对于本机内存分配评测,您还可以使用或。后者具有与Java运行时集成的优点,即它可以显示本机和Java框架的混合堆栈跟踪。此外,这两种工具都有相当小的性能开销,不像Valgrind虚拟化正在运行的程序
有关更多信息,请参阅和回答。带有自修改代码的Valgrind(和基于Valgrind的工具)。然而,HotSpot JVM严重依赖于动态代码生成,包括覆盖和修补先前生成的指令。即使禁用了JIT编译器,这一点仍然有效,因为HotSpot还为解释器和运行时存根使用动态代码生成
对于本机内存分配评测,您还可以使用或。后者具有与Java运行时集成的优点,即它可以显示本机和Java框架的混合堆栈跟踪。此外,这两种工具都有相当小的性能开销,不像Valgrind虚拟化正在运行的程序
有关更多信息,请参阅和回答。我还尝试编译库并将其链接到
-fsanize=address
,但不幸的是,它无法捕获简单的malloc(sizeof(char))代码>从JNI
方法调用。在JVM下运行时使用地址消毒器是否有问题?@St.Antario否,JVM不应影响-fsanize=address
我还试图编译库并将其链接到-fsanize=address
,但不幸的是它无法捕获简单的malloc(sizeof(char))代码>从JNI
方法调用。在JVM下运行时使用地址消毒器是否有问题?@St.Antario否,JVM不应影响-fsanize=address