相关疑难解决方法(0)

为什么分段错误不可恢复?

我之前的问题之后,大多数评论都说“不要这样做,你处于一种不确定的状态,你必须杀死一切并重新开始”。还有一个“安全”的解决方法

我不明白的是为什么分段错误本质上是不可恢复的。

写入受保护内存的时刻被捕获 - 否则,将SIGSEGV不会被发送。

如果可以捕获写入受保护内存的时刻,我不明白为什么 - 理论上 - 它不能在某个低级别上恢复,并且不能将 SIGSEGV 转换为标准软件异常。

请解释为什么在分段错误之后程序处于不确定状态,因为很明显,在内存实际更改之前抛出了错误(我可能是错的,不明白为什么)。如果它被抛出,人们可以创建一个程序来更改受保护的内存,一次一个字节,出现分段错误,并最终重新编程内核 - 这种安全风险并不存在,因为我们可以看到世界仍然存在。

  1. 分段错误究竟何时发生(=何时发送SIGSEGV)?
  2. 为什么该进程在该点之后处于未定义的行为状态?
  3. 为什么无法恢复?
  4. 为什么这个解决方案可以避免这种不可恢复的状态?甚至吗?

c c++ exception segmentation-fault

112
推荐指数
11
解决办法
1万
查看次数

如何在Linux中捕获分段错误?

我需要在第三方库清理操作中捕获分段错误.这有时会在我的程序退出之前发生,我无法解决这个问题的真正原因.在Windows编程中,我可以使用__try - __catch执行此操作.是否有跨平台或平台特定的方式来做同样的事情?我需要在Linux,gcc中使用它.

c++ try-catch segmentation-fault

67
推荐指数
5
解决办法
10万
查看次数

分段故障处理

我有一个应用程序,我用它来捕获任何分段错误或ctrl-c.使用下面的代码,我能够捕获分段错误,但是一次又一次地调用处理程序.我怎么能阻止他们.为了您的信息,我不想退出我的申请.我只需要注意释放所有损坏的缓冲区.

可能吗?

void SignalInit(void )
{

struct sigaction sigIntHandler;

sigIntHandler.sa_handler = mysighandler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGINT, &sigIntHandler, NULL);
sigaction(SIGSEGV, &sigIntHandler, NULL);

}
Run Code Online (Sandbox Code Playgroud)

和处理程序是这样的.

void mysighandler()
{
MyfreeBuffers(); /*related to my applciation*/
}
Run Code Online (Sandbox Code Playgroud)

这里对于Segmentation故障信号,处理程序被多次调用,很明显,MyfreeBuffers()给了我释放已经释放的内存的错误.我只想释放一次,但仍然不想退出应用程序.

请帮忙.

c linux signals signal-handling

33
推荐指数
4
解决办法
4万
查看次数