当前位置 : 主页 > 手机开发 > 无线 >

如何处理和移动段错误?

来源:互联网 收集:自由互联 发布时间:2021-06-10
参见英文答案 Catch Segfault or any other errors/exceptions/signals in C++ like catching exceptions in Java4个 我正在研究一个涉及链表的C项目,我需要对一段代码进行分段,以证明它不起作用.但我的代码不能
参见英文答案 > Catch Segfault or any other errors/exceptions/signals in C++ like catching exceptions in Java                                    4个
我正在研究一个涉及链表的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,在这种情况下它仍然返回非零).

说真的,我已经给了你足够的信息让你变得危险,但是不要轻视我的注意事项……用这种方法解决你的问题要比解决它们容易得多,除非你非常小心和限制您使用此工具.

网友评论