2014-02-26 46 views
5

我正在研究一個涉及鏈表的C項目,爲了證明它不起作用,我需要將段錯誤代碼段。但我的代碼不能崩潰。如何處理和移動段落錯誤?

這裏是到目前爲止我的處理程序:

typedef void sigfunc(int); 
sigfunc *signal(int, sigfunc*); 
void Handler(int sig) 
{ 
    if (sig == SIGSEGV) 
    printf("received SegFault\n"); 
    signal(SIGSEGV, &Handler); 
} 

它需要生存的段錯誤。到目前爲止,我所得到的只是一個「接收到的SegFault」的無限循環。提前致謝!

+1

在信號處理程序中調用'printf()'是不安全的。 http://stackoverflow.com/questions/8493095/what-c​​onstitutes-asynchronous-safeness –

+1

對於您的特定用例,您可能最好檢查每個指針的有效性(這可能需要確保所有無效指針都爲空),並且在它發生之前檢測段錯誤。 – Brilliand

+5

這個問題似乎在積累downvotes ...我不同意這是一個特別糟糕的問題;唯一的主要問題是正確的答案是「你不能」(並且不能期望提前知道提問者)。 – Brilliand

回答

7

一般來說,一旦你擊中SEGFAULT,你的過程就完成了。

用專門的術語來說,它可能有可能恢復,但是這樣做卻沒有敏銳地意識到你正在做的事情是重複失敗,內存泄漏,無效指針和其他問題的惡夢的祕訣。這就是說,除非你可以重新啓動你的過程(這避免了上述所有情況),你可以嘗試使用setjmp()longjmp()來恢復。例如:

#include <setjmp.h> 
jmp_buf restore_point; 
void Handler(int sig) 
{ 
    if (sig == SIGSEGV) 
    { 
     printf("received SegFault\n"); 
     signal(SIGSEGV, &Handler); 
     longjmp(restore_point, SIGSEGV); 
    } 
} 


void test() 
{ 
    int fault_code = setjmp(restore_point); 
    if (fault_code == 0) 
    { 
     // do something that might cause a segfault 
    } 
    else 
    { 
     printf("recovered from a fault; code = %d\n", fault_code); 
    } 
} 

除了我列出了其他的問題,另一個就是還原點(跳轉緩衝區)設置,直到調用setjmp()範圍終止是唯一有效的....你必須不是跳回到終止範圍!

本質上,longjmp()是一個深遠的goto,但更像是gobackto,因爲它回到跳轉緩衝區初始化的位置。它以setjmp()函數的初始化方式確保setjmp()在被線性調用時返回0,並且在通過longjmp進入到達時它將返回非零值。在這種情況下,它會返回任何第二個參數(除非該參數== 0,在這種情況下它仍然返回非零)。

說真的,我已經給了你足夠的信息讓你變得危險,但不要輕率地告誡我......這種方法比解決問題要容易得多,除非你已經非常小心,並限制您使用此工具。

+1

我知道一般來說這是一個可怕的想法。這是一個班級的項目。我從來沒有試圖在現實世界中拉這個廢話。我只需要對它進行段錯誤並存活,以便爲程序返回所有正確的內容。謝謝! – user3357612