一般來說,一旦你擊中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,在這種情況下它仍然返回非零)。
說真的,我已經給了你足夠的信息讓你變得危險,但不要輕率地告誡我......這種方法比解決問題要容易得多,除非你已經非常小心,並限制您使用此工具。
來源
2014-02-26 20:27:32
mah
在信號處理程序中調用'printf()'是不安全的。 http://stackoverflow.com/questions/8493095/what-constitutes-asynchronous-safeness –
對於您的特定用例,您可能最好檢查每個指針的有效性(這可能需要確保所有無效指針都爲空),並且在它發生之前檢測段錯誤。 – Brilliand
這個問題似乎在積累downvotes ...我不同意這是一個特別糟糕的問題;唯一的主要問題是正確的答案是「你不能」(並且不能期望提前知道提問者)。 – Brilliand