首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何捕捉SIGBUS错误?

如何捕捉SIGBUS错误?
EN

Stack Overflow用户
提问于 2015-01-24 09:41:27
回答 1查看 4.4K关注 0票数 1

我正在尝试捕捉只读内存上的错误,但无法做到这一点?如果我处理错误,那么它的程序可以继续,还是只能选择退出/中止?

代码语言:javascript
复制
#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;
}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-24 09:51:55

SIGBUS表示您正在访问一个未对齐地址,SIGSEGV表示您正在访问一个“不应该访问”的地址(无效地址,或者写入只读内存--在某些情况下,内存可以是只写的,然后从这些内存中读取也会导致SIGSEGV )。

由于当您在信号处理程序中结束时,处理器并不真正知道它处于什么状态,在这些情况下,通常不可能只从信号处理程序本身继续。相反,典型的方法是使用setjmplongjmp“恢复到一个已知的点”。这可能是代码的“主循环”,或者是一些错误恢复点。

所以,就像这样:

代码语言:javascript
复制
 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;
 }

应该注意的是,如果您在执行错误(如总线故障或地址故障)之后“继续”运行,您可能会遇到一些严重的麻烦--例如:

代码语言:javascript
复制
// At global level:
  some_lock lock;

// in some function. 
  ....
  lock->take();
  some code that crashes;
  lock->release();

所以,现在锁已经开了,而且一直没松过.下次你需要取下锁时,代码可能会挂起.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28124154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档