Android NDK:处理来自Java端的任何线程引起的SIGSEGV

时间:2015-10-14 22:53:02

标签: java android multithreading android-ndk signal-handling

考虑这种情况:

有一个Android应用程序可以处理不同的线程。 其中一些可能会导致分段违规(SIGSEGV)。 我希望能够使用NDK从使用C语言编写的信号处理程序中捕获所有违规,而不管引起它的线程如何。

实际上,我已经使用sigaction编写了这样的处理程序。 它的工作原理只适用于运行NDK代码的线程。 这是因为SIGSEGV被传递到导致违规的线程,而不是让我们说SIGKILL被传递给进程。 结果,我的处理程序没有收到由其他线程引起的SIGSEGV,程序被杀死。

有没有办法让所有SIGSEGV重定向到我的处理程序? 或者,替代地,一种覆盖所有线程的默认处理程序的方法吗?

是的,有一个原因我想要这个特别的东西就像我描述的那样! ;)

1 个答案:

答案 0 :(得分:0)

您可能会遇到SIGSEGV,但如果SIGSEGV未发生,则您无法释放免费资源。 Java有一个垃圾收集器(在某些情况下甚至gc也不会从内存泄漏中节省),但是c / c ++代码必须是free()deletedelete[]已经分配的内容(但是不是alloca() - ed)。

我会把那些冒险本地事物的东西放到一个单独的过程中。 (Android应用程序可能包含多个进程。)当进程死亡时,其垃圾也会死亡。主要过程必须检测到工人进程已经死亡。