参见英文答案 Catch Segfault or any other errors/exceptions/signals in C++ like catching exceptions in Java4个 我正在研究一个涉及链表的C项目,我需要对一段代码进行分段,以证明它不起作用.但我的代码不能
我正在研究一个涉及链表的C项目,我需要对一段代码进行分段,以证明它不起作用.但我的代码不能崩溃.
到目前为止,这是我的处理程序:
typedef void sigfunc(int); sigfunc *signal(int, sigfunc*); void Handler(int sig) { if (sig == SIGSEGV) printf("received SegFault\n"); signal(SIGSEGV, &Handler); }
它需要在段错误中存活下来.到目前为止,我得到的是“收到的SegFault”的无限循环.提前致谢!
一般来说,一旦你点击了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’d进入时,它将返回非零值.在这种情况下,它返回longjmp()的第二个参数是什么(除非该参数== 0,在这种情况下它仍然返回非零).
说真的,我已经给了你足够的信息让你变得危险,但是不要轻视我的注意事项……用这种方法解决你的问题要比解决它们容易得多,除非你非常小心和限制您使用此工具.