性能问答>java agent crash 问题。help ~~~~~>
4回复

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);


    }

输出如下 :

image.png

crash 文件:

hs_err_pid72464.log

还有比较奇怪的是如果我把 DumpHeap0 的参数,由JNI_TRUE 改为 JNI_FALSE 就不会发生 crash,但是没有生成 dump 文件,而且这个方法返回一个很奇怪的值,并且每次返回都不同。
image.png

这个不是应该只会返回 0 或 1吗?

image.png

3536 阅读
请先登录,查看4条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步