gpt4 book ai didi

java - 在未捕获的异常上生成 Java 堆转储

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:04:48 25 4
gpt4 key购买 nike

我尝试在触发未捕获的异常时生成堆转储。我尝试使用 jmap,但因为当异常发生时进程已完成,所以这是不可能的。

使用 UncaughtExceptionHandler 也不是一个选择,因为我只有被执行程序的二进制文件。

谁能帮帮我?

编辑:重要的是该技术可通过命令行或类似方式使用,因为我需要将其自动化。使用 GUI 是不可行的

最佳答案

这可以通过 JVMTI 实现将收听 VMDeath 的代理人事件然后使用 JMM interface启动堆转储。

这是此类 JVMTI 代理的示例源代码:

#include <jvmti.h>
#include <string.h>
#include <stdio.h>
#include "jmm.h"

JNIEXPORT void* JNICALL JVM_GetManagement(jint version);

void JNICALL VMDeath(jvmtiEnv* jvmti, JNIEnv* jni) {
JmmInterface* jmm = (JmmInterface*) JVM_GetManagement(JMM_VERSION_1_0);
if (jmm == NULL) {
printf("Sorry, JMM is not supported\n");
} else {
jstring path = (*jni)->NewStringUTF(jni, "dump.hprof");
jmm->DumpHeap0(jni, path, JNI_TRUE);
printf("Heap dumped\n");
}
}

JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM* vm, char* options, void* reserved) {
jvmtiEnv* jvmti;
(*vm)->GetEnv(vm, (void**)&jvmti, JVMTI_VERSION_1_0);

jvmtiEventCallbacks callbacks;
memset(&callbacks, 0, sizeof(callbacks));
callbacks.VMDeath = VMDeath;
(*jvmti)->SetEventCallbacks(jvmti, &callbacks, sizeof(callbacks));
(*jvmti)->SetEventNotificationMode(jvmti, JVMTI_ENABLE, JVMTI_EVENT_VM_DEATH, NULL);

return 0;
}

将其编译到共享库 (libdump.so) 后,使用 -agentpath 选项运行 Java:

java -agentpath:/path/to/libdump.so MainClass

如果您希望处理未捕获的异常而不是等待 VMDeath,您可以使用类似的技术为异常事件安装回调。看here举个例子。

关于java - 在未捕获的异常上生成 Java 堆转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23632653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com