今天我安装了新版本的JRE;安装程序出错了,JRE损坏了.我注意到我的C程序没有启动,也没有发出任何警告信息.调试程序显示它成功运行,直到JNI_CreateJavaVM调用;但调用JNI_CreateJavaVM会导致程序立即终止.没有返回值,没有错误消息,没有.
是的,我知道我只需要重新安装JRE.但是,我希望我的C程序能够适应这种情况.如果它无法创建Java VM,则应显示消息“Please reinstall JRE”.但我没有机会展示这条消息,因为整个节目正在终止.
有没有办法在JRE中检测此类错误,或者更常见的是,在第三方库中?我尝试使用C try / catch构造,我尝试使用signal函数 – 没有任何帮助;程序消失而不调用任何catch或信号处理程序.
有没有办法检测这样的JRE崩溃?或者:有没有办法可靠地检测第三方库中的崩溃或终止?
解决方法 如果您使用的是linux / Unix:这通常是我开始使用的:struct sigaction sa;sa.sa_handler = bt_sighandler;sigemptyset(&sa.sa_mask);sa.sa_flags = SA_RESTART;sigaction(SIGSEGV,&sa,NulL);sigaction(SIGUSR1,NulL);
如果您在windows上使用Microsoft C:_try / _except通常可以解决问题.它是一个MSVC扩展(你可以从双下划线告诉),它扩展了标准的try / catch.
Try / catch捕获C异常,_try / _except将捕获所有其他未处理的异常(COM,Win32,…).例如,它将捕获null-dereferencing,内存访问问题,这可能是导致崩溃的原因.阅读here
否则,在寡妇中,尝试SetUnhandledExceptionFilter
编辑:由于使用SEH的方法似乎失败了,您可以升级一级并使用向量异常处理.根据this blog post on msdn,VEH是按过程注册的,并且在SEH之前进行检查.
如果全部失败,请不要绝望:)你仍然可以将你的应用程序变成一对调试器/ deBUGee.这将使你完全控制deBUGee过程的事件,生死.这通常不值得麻烦,但它是我过去必须使用的另一种解决方案.它也没有看起来那么困难;如果有任何其他方法失败,请告诉我,我会挖出一些旧代码.
总结以上是内存溢出为你收集整理的从C调用Java:如何捕获/检测致命的JVM错误?全部内容,希望文章能够帮你解决从C调用Java:如何捕获/检测致命的JVM错误?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)