如何捕获SIGBUS错误
How to catch SIGBUS error?
我正在尝试在只读内存上捕获错误但无法做到?如果我处理错误,那么程序可以继续还是唯一的选项是退出/中止?
#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;
}
SIGBUS 表示您正在访问未对齐的地址,SIGSEGV
表示您正在访问您"不应该"访问的地址(无效地址或写入只读内存 - 在某些情况下,内存可以是只写的,从此类内存读取也会导致 SIGSEGV)。
由于处理器并不真正知道当您最终进入信号处理程序时它处于什么状态,因此在这些情况下通常不可能仅从信号处理程序本身继续。相反,典型的方法是使用setjmp
和longjmp
来"恢复到已知点"。这可能是代码的"主循环",也可能是某个错误恢复点。
所以,像这样:
jmp_buf reset;
int termination_handler(int signum)
{
longjmp(reset, 1);
}
int main()
{
if (setjmp(reset) != 0)
{
printf("We got back from signal handler")
...
}
signal (SIGBUS, termination_handler);
...
return 0;
}
应该注意的是,如果您在执行错误(如总线故障或地址错误)后实际上"继续前进",您可能会遇到一些严重的麻烦 - 例如考虑:
// At global level:
some_lock lock;
// in some function.
....
lock->take();
some code that crashes;
lock->release();
所以,现在锁被抓住了,并且从未释放过......下次您需要取锁时,代码可能会挂起...
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 如何捕获SIGBUS错误
- C++中的gcc浮点指针强制转换导致SIGBUS错误