JNI通过调用callVoidMethod调用Java方法,如何捕捉其中的crash?

有一个native方法A,这个方法是第三方库的,在部分情况下可能会发生crash导致程序崩溃。JNI层的crash无法通过外界try catch的方式捕获。于是我自己写了一个JNI函数,通过sigaction覆写信号处理函数的方法试图捕获信号。
我参考了https://blog.csdn.net/yuanjj5549/article/details/119210436这篇文章,先调用sigaction,然后再通过callVoidMethod方法调用了Java层的方法A。然而我发现方法A里的crash无视了设置的信号处理函数。而如果我调用一个可能引起crash的C语言方法,那么我自己定义的信号处理函数是生效的。
我想知道这是什么缘故?


回答:

这个博客提到的方法并不能保证你一定能处理到这个异常。

如果程序出现的错误非常致命,捕捉异常信号的方法可能会完全执行不了。

举一个极端的例子,如果掉用的方法修改了内核中关键的一处内存内容,可能会导致整个系统的崩溃,自然也就不可能触发任何方法,甚至信号都可能不会有机会发出。

如果出现 crash,建议不要在进程内处理,让它自然 crash,直到你处理掉这个问题,因为绝大部分 crash 你处理完之后,都没法确定后续可能会有什么影响,比如访问修改了一处非程序内存后,这些影响对操作系统和其它进程来说是未知的。

以上是 JNI通过调用callVoidMethod调用Java方法,如何捕捉其中的crash? 的全部内容, 来源链接: utcz.com/p/945116.html

回到顶部