【发布时间】:2015-01-24 17:57:50
【问题描述】:
我试图捕捉只读存储器上的错误但无法做到? 如果我处理了错误,那么它程序可以继续或唯一的选项是退出/中止?
#include<iostream>
#include <stdlib.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
char * F00()
{
char *s2="ab";
return s2;
}
void InvalidMem()
{
(F00())[0]='l';
}
void
termination_handler (int signum)
{
fprintf(stderr,"BUS error");
}
int
main(int argc, char **argv)
{
signal (SIGBUS, termination_handler);
InvalidMem();
for(int i = 0; i < 10; ++i)
std::cout<<" L " ;
return 0;
}
【问题讨论】:
-
从哪一点继续?
-
尝试从如此严重的崩溃中继续是可能的,但是您怎么知道程序处于可以安全继续的状态?简而言之:你不能。与其尝试“捕捉”崩溃并尝试继续,不如找到崩溃的根本原因并解决该问题,而不是试图忽略它。
-
Joachim,我同意你关于状态的观点,但这是否意味着如果我捕捉到一个信号,那么程序可以从导致信号提升的点继续。
-
如果我添加以下内容:信号(SIGSEGV,termination_handler);然后它陷入无限循环并总是打印 BUS 错误。
-
就像我说的,这是可能,但从来没有是个好主意!