c-我该如何处理和越过segfault



我正在用C语言处理一个涉及链表的项目,我需要对一段代码进行分段,以证明它不起作用。但我的代码不会崩溃。

到目前为止,这是我的处理者:

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

它需要在断层中幸存下来。到目前为止,我得到的只是一个"收到的SegFault"的无限循环。提前感谢!

一般来说,一旦达到SEGFAULT,您的流程就完成了。

用专门的术语来说,恢复是可能的,但在没有敏锐意识到自己在做什么的情况下这样做会导致重复故障、内存泄漏、无效指针和其他问题的噩梦。

也就是说,除非您可以重新启动进程(这样可以避免所有上述情况),否则您可以尝试使用setjmp()longjmp()进行恢复。例如:

#include <setjmp.h>
jmp_buf restore_point;
void Handler(int sig)
{
if (sig == SIGSEGV)
{
printf("received SegFaultn");
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 = %dn", fault_code);
}
}

除了我列出的其他问题之外,另一个问题是您设置的恢复点(跳转缓冲区)只有在调用setjmp()的作用域终止之前才有效。。。。您必须而不是跳回终止的范围!

本质上,longjmp()是一个意义深远的goto,但更像是一个gobackto,因为它可以回到跳转缓冲区初始化的点。它是由setjmp()函数初始化的,其方式确保setjmp()在线性调用时返回0,而在通过longjmp'dinto到达时返回非零。在这种情况下,它返回longjmp()的第二个参数(除非该参数==0,在这种情况中它仍然返回非零)。

说真的,我已经给了你足够的信息,让你变得危险,但不要掉以轻心。。。使用这种方法使问题复杂化要比修复问题容易得多,除非你非常小心并限制了对该工具的使用。

最新更新