2014-08-30 21 views
0

換言之:如何將內核錯誤拋出到C++異常?任何想法如何使C++在內核錯誤上拋出異常

因爲C++能夠將大多數編程錯誤作爲例外拋出。但是,爲什麼不是零分的錯誤呢?分段錯誤?其他內核故障?

我明白這些故障是如何在內核中引發並由內核處理的。我也理解在編譯器的幫助下如何在C++中創建和處理異常。你如何看待兩者之間的點可以連接?這方面有沒有堅實的工作?

在此先感謝您的任何想法或提示。

編輯以迴應可能的重複標誌:作爲類似的問題How to catch segmentation已詢問關於segv的capture部分,recovery仍然丟失。此外,我正在尋找一種系統的方法來從各種內核異常中恢復,而不僅僅是segv。

再次編輯:我已經解釋了爲什麼這個問題與其他問題不同。還有5人投票結束。

+3

這取決於你的平臺。在某些Unix上,從某些信號(包括SIGSEGV,SIGFPE和SIGILL)返回會導致未定義的行爲。 – Brian 2014-08-30 04:50:29

+0

對,我想到了信號,但忘了在提出問題時提及它。具體來說,我還沒有想出如何將信號轉換爲C++可拋異常。如果你可以轉換sigsegv它將解決一半的問題。如果錯誤是由程序引起的,我仍然希望能夠拋出所有內核錯誤。 – minghua 2014-08-30 04:53:43

+1

@Brian:拋出一個異常,或者使用'longjmp',並不算作從信號處理程序返回的禁止。 – 2014-08-30 04:56:42

回答

2

「內核故障」不是標準術語。有「內核恐慌」事件。這些都是由內核代碼中的錯誤引起的內核本身的災難性故障。你的應用與他們無關。

如果我們談論用C++編寫的用戶空間程序,SIGSEGV(但不是SIGUSR1等信號)等信號是由C++代碼中未定義行爲引起的事件。它可能會或可能不會被內核處理,具體取決於您的操作系統和程序類型。無論哪種方式,它不稱爲內核故障。就C++而言,這是世界末日。你絕不會試圖處理這種信號,除非試圖打印告別信息並退出。沒有恢復。

在一些非常罕見的和依賴於實現的情況下捕獲像SIGSEGV這樣的信號可能是有意義的,但系統化的方法不會也不可能存在。

編輯迴應可能重複的標誌:作爲一個類似的問題如何抓住分割已經問了一個segv的捕獲部分,恢復仍然失蹤。此外,我正在尋找一種系統的方法來從各種內核異常中恢復,而不僅僅是segv。

恢復是不可能在一個通用的方法,因此,問題是相似的,

乍一看,這似乎是可能的。但是,許多例外情況可能表明存在無法恢復的損壞環境,但單獨恢復正常執行。

+0

+1對於非常有見識的解釋。 – minghua 2014-09-10 18:21:03