2015-10-14 47 views
0

任何線程SIGSEGVs考慮這種情況:的Android NDK:處理由從Java端

有一個Android應用程序,並東西,這可能是在不同的線程。 其中一些可能會導致分段違規(SIGSEGV's)。 我希望能夠從使用NDK編寫的C語言信號處理程序中捕獲所有違規行爲,而不管引起它的線程如何。

其實我用sigaction寫了這樣的處理程序。 它只適用於運行NDK代碼的線程。 這是因爲SIGSEGV被傳遞給導致違規的線程,與之相反,讓我們說SIGKILL將其傳遞給進程。 因此,我的處理程序不會收到由其他線程引起的SIGSEGV,並且程序被終止。

有沒有辦法讓所有SIGSEGV被重定向到我的處理程序? 或者,也可以重寫所有線程的默認處理程序?

是的,有一個原因,我希望這個特殊的東西,我已經描述它的方式! ;)

+1

一些信息在這裏:http://stackoverflow.com/questions/1083154/how-can-i-catch-sigsegv-segmentation-fault-and-get-a-stack-trace-under-jni-on/。從每個線程進行JNI調用以設置該線程的處理程序。確保你確定你的具體崩潰並鏈接到以前的處理程序。 – fadden

+0

@fadden對不起,我的問題不是很清楚!我們假設我不能訪問這些線程。我不知道應用程序可能會做什麼,我只想處理由它引起的所有SIGSEGV。 – Paschalis

+0

你想要什麼被稱爲未捕獲異常處理程序。它存在於Java中,不確定它在c/C++中調用的是什麼。 – 18446744073709551615

回答

0

您可能會遇到SIGSEGV,但是如果SIGSEGV沒有發生,您將無法獲得免費的資源。 Java有一個垃圾收集器(在某些情況下,甚至gc也不會從內存泄漏中保存),但c/C++代碼必須是free()deletedelete[]它分配的內容(但不是alloca() -ed)。

我會把做有風險的本地事情的東西放到一個單獨的過程中。 (Android應用程序可能由多個進程組成)。當進程死亡時,其垃圾也會死亡。主流程必須檢測到工作進程已經死亡。

+0

我沒有這樣做'免費'或'malloc's!我正在使用'mprotect'從虛擬頁面中刪除權限。這些頁面大概正在被其他線程使用。該線程中出現'sigsegv',我想要的是能夠處理它。所以我需要重定向它,或者其他的東西。 **這是可能的嗎?** – Paschalis

+1

換句話說,您刪除了虛擬頁面的權限,並且當線程發生異常時,您想要授予權限並恢復執行該線程。理論上這應該是可能的。這與調試器的作用非常相似。但是調試器通常啓動一個子進程。可能是一個內核模塊可以幫助你。寫一個關於_your內存管理任務_的描述,不僅僅是「捕獲SIGSEGV」,並且要求另一個SO問題標記爲POSIX(或者使用描述中的單詞以及可能的「調試器」和「內核模塊」來搜索)。 – 18446744073709551615