捕捉C中的段错误

我有一个程序,有时会从指针算术进行段错误。 我知道会发生这种情况,但我不能提前检查是否存在段错误 - 要么我可以“预扫描”输入数据,看它是否会导致段错误(这是不可能确定的),或者我可以改装它不使用指针算术,这将需要大量的工作,或者我可以尝试捕捉段错误。 所以我的问题是:

1)在C中,如何捕捉段错误? 我知道操作系统中的某些东西会导致段错误,但是如果C段程序的Segmentation fault比分Segmentation fault更优雅地死了,那么C程序可以做些什么?

2)这是多么便携?

我想这是一个非常不可移植的行为,所以如果你发布任何代码来捕获段错误,请告诉我它的工作原理。 我在Mac OS X上,但我希望我的程序可以在尽可能多的平台上工作,并且我想查看我的选项。

别担心 - 基本上我想要做的就是打印一个更加用户友好的错误消息并释放一些malloc() ed内存,然后死掉。 我不打算忽略所有的段错误,并且提前耕种。


你必须定义一个信号处理程序。 这在使用函数sigaction Unix系统上完成。 我在Fedora 64和32位以及Sun Solaris上使用相同的代码完成了此操作。


那么,SIGSEGV是可以被捕获的,这是POSIX,所以它在这个意义上是可移植的。

Bu我担心你似乎想要处理段错误,而不是解决导致段错误的问题。 如果我不得不选择是错误的操作系统还是我自己的代码,我知道我会选择哪一个。 我建议你追捕那个bug,修正它,然后编写一个测试用例,以确保它再也不会再咬你。


您可以使用功能信号为信号安装新的信号处理程序:

   #include <signal.h>
   void (*signal(int signum, void (*sighandler)(int)))(int);

像下面的代码:

signal(SIGINT , clean_exit_on_sig);
signal(SIGABRT , clean_exit_on_sig);
signal(SIGILL , clean_exit_on_sig);
signal(SIGFPE , clean_exit_on_sig);
signal(SIGSEGV, clean_exit_on_sig); // <-- this one is for segmentation fault
signal(SIGTERM , clean_exit_on_sig);

void 
clean_exit_on_sig(int sig_num)
{
        printf ("n Signal %d received",sig_num);
}
链接地址: http://www.djcxy.com/p/86057.html

上一篇: Catching segfaults in C

下一篇: Find memory leaks caused by smart pointers