4回复
3年前
java agent crash 问题。help ~~~~~
我想在 agent 中调用 jmm 的 DumpHeap0 方法来进行内存 dump,但是 dump 的时候发生了 crash。有大佬能看懂这个 crash 的原因吗,或者我应该怎么分析这个 crash 文件。
代码大致如下:我是仿照 stackoverflow 上的 C 语言写的 Rust 版本
unsafe{
// 获取 jni
let result = (**vm).AttachCurrentThread.unwrap()(*&vm, jni_env_ptr, ptr::null_mut());
//JNINativeInterface
let jni_interface = (*jni_env_ptr) as *mut JNIEnv;
let path = CString::new("/Users/yaoliao/IdeaProjects/demo/src/main/resources/my-dump.hprof").unwrap();
println!("path : {}", *(path.as_ptr()));
let path_string = (**jni_interface).NewStringUTF.unwrap()(jni_interface, path.as_ptr());
let len = (**jni_interface).GetStringUTFLength.unwrap()(jni_interface, path_string);
println!("jstring len : {}", len);
println!("11111111111");
let func = (jvm::JVM_GetManagement.get().unwrap());
let jmm_interface = ((*func)(JMM_VERSION_1_0 as i32)) as *mut JmmInterface;
let jni = (*jni_env_ptr) as *mut jvm_native::jni::JNIEnv;
println!("222222222222");
let version = (*jmm_interface).GetVersion.unwrap()(jni);
println!("version:{}", version);
let dump_result = (*jmm_interface).DumpHeap0.unwrap()(jni, path_string, JNI_TRUE as u8);
println!("======= dump_result: {}", dump_result);
}
输出如下 :
crash 文件:
还有比较奇怪的是如果我把 DumpHeap0 的参数,由JNI_TRUE 改为 JNI_FALSE 就不会发生 crash,但是没有生成 dump 文件,而且这个方法返回一个很奇怪的值,并且每次返回都不同。
这个不是应该只会返回 0 或 1吗?
3536 阅读