性能问答>java agent crash 问题。help ~~~~~>
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);


    }

输出如下 :

image.png

crash 文件:

hs_err_pid72464.log

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

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

image.png

2618 阅读
请先登录,再评论

从你提供的堆栈来看,你是在agent加载的时候直接去调用了这个函数,这个时间点,jvm整体的初始化还没有完成,所以调用会有问题的,根据crash日志里的信号量值判断应该是在调用到V [libjvm.dylib+0x32f3fc] oopDesc* JNIHandles::resolve_jweak<false>(_jobject*)+0x6时空指针了,你参考的c代码时在agentdetach的时候去做heapdump的,你想要更早地话,可以注册一个VMInit事件,然后在VMInit事件回调当中调用这个函数

1年前
回复 风中追风:

编译成功了,发现是可以 dump 的。。。。。应该是我代码的问题😵

1年前回复
回复 ferdi:

我原本是在 Agent_OnAttach 中的时候去执行这个 dump ,应该不是 jvm 没有初始化好的原因。后来我把这个 dump 的执行放到了 VMInit 的事件中,不过还是 crash 了😱 。最后我想试试 stackoverflow 上的那个代码行不行,但是一直编译不成功。。。。 公与大佬,我应该怎么编译那个呀😂

1年前回复