2010-11-13 76 views
0

我使用ncurses的,每當我得到一個segfault,ncurses的不正確釋放終端的控制(因爲endwin()從未被調用)。我設置了一個信號處理程序:最後塊分割故障(C++)

void handler(int signum) { 
    endwin(); 
    exit(EXIT_FAILURE); 
} 

但這個問題是內存設計缺陷被忽略,因爲endwin後反對推遲到()。我對C++相當陌生; segfaults可以被捕獲爲異常,這樣我可以有一個finally塊?還是有一些重新從處理程序內部重新發布segfault?

+0

可能的重複[如何在Linux中捕獲段錯誤?](http://stackoverflow.com/questions/2350489/how-to-catch-segmentation-fault-in-linux) – casablanca 2010-11-13 01:02:00

+0

只是出於興趣,什麼如果在信號處理程序中放置斷點,會發生什麼? gdb可以回到原始段落的上下文嗎? – 2010-11-13 01:30:20

+0

C++沒有finally塊。使用一個哨兵類,它的析構函數調用endwin(); – 2010-11-13 05:57:25

回答

4

段錯誤是不確定的行爲。你必須找到並修復它。不要擔心沒有釋放終端的ncurses,並找到並修復該錯誤。

+0

我想我應該更清楚。這僅僅是用於調試我的代碼的實際問題。當我遇到段錯誤時,我想去找到它並修復它,但是當ncurses仍然沒有釋放終端時,很難操作GDB。我最終發現了這個錯誤,但是花了我的時間超過了它,並且在我繼續編碼時,我可能會有更多的錯誤。所以沒有辦法去做我在問什麼? – Nick 2010-11-13 01:25:50

+0

@Nick:當你點擊一個段錯誤就意味着你已經擰東西漲得很厲害,有在繼續,因爲什麼,你要做的僅僅是使事情變得更糟沒有任何意義。 – 2010-11-13 01:34:07

+0

@Martin York:並不是他不想修復這個bug,而是在所有的資源都沒有被放棄的時候發現bug更難。想象一下,如果您每次都必須重新啓動計算機以修復空指針解除引用,那麼您是否不想找到避免重新引導的方法? – dreamlax 2010-11-13 01:39:25

0

signal手冊頁:

根據POSIX,一個過程的行爲是未定義它忽略不是由殺滅產生的SIGFPE,SIGILL, 或SIGSEGV信號(2)之後或提高(3)。

試圖做任何事情後,賽格故障是瘋了。這就像碰撞後激活的安全氣囊,你繼續駕駛,因爲,你有一個安全氣囊,它會讓你在碰撞中安全。用處理程序來處理這個事情並不是方法。

一種方法是使你的程序從文件中輸入或存根出的輸出。您也可以嘗試remotely attaching to a process with gdb。從來沒有做過,但它可能是值得一試。

+0

不,這就像碰撞你的車,想着,「嘿,我應該抓住我的孩子才離開燃燒的車輛。」 (在這種情況下,孩子是終端。) 遠程調試可能會奏效,但它看起來複雜。我可以嘗試它,但我寧願將它作爲極端的最後手段。 – Nick 2010-11-13 01:54:08