You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java调用C++崩溃未触发AeDebug,如何阻止JVM终止进程?

解决JVM拦截C++异常导致AeDebug无法触发的问题

JVM默认会注册全局异常处理程序,当被调用的C++代码抛出空指针解引用这类原生异常时,JVM的处理程序会先捕获异常并直接终止进程,跳过系统的AeDebug机制,这就是你遇到的问题。以下是可行的解决方法:

方法1:禁用JVM的原生异常拦截

启动Java程序时添加-XX:+DisableExceptionHandler参数,这个参数会关闭JVM的全局异常处理逻辑,让系统的异常处理链(包括AeDebug)正常接管崩溃事件。

注意:该参数在Oracle JDK 8及以上、部分OpenJDK版本中有效,需结合你的JDK版本测试。

方法2:在C++代码中主动绕过JVM异常处理

在可能触发崩溃的C++代码块中,用Windows平台的__try/__except结构包裹,在异常处理块中不处理异常,直接让系统接管:

__try {
    // 这里放你会触发空指针解引用的代码
    char* null_ptr = nullptr;
    *null_ptr = 'a';
}
__except (EXCEPTION_EXECUTE_HANDLER) {
    // 直接让系统处理异常,不交给JVM
    ExitProcess(GetExceptionCode());
}

这样做能避免JVM捕获到异常,让系统的AeDebug机制正常触发。

方法3:调整JVM崩溃提示策略(备选)

添加-XX:+ShowMessageBoxOnError参数启动JVM,这个参数会在崩溃时弹出系统消息框,此时系统的AeDebug机制有机会被触发,但这个方法不如前两种直接,适合作为备选方案。

验证步骤:确保AeDebug注册表项已正确设置(比如设置为记事本),用上述任一方法启动Java程序并触发C++崩溃,检查是否自动启动记事本。

内容的提问来源于stack exchange,提问作者devstability

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:27:15