段错误(SIGSEGV)与总线错误(SIGBUS)

本文介绍了在C++编程中遇到的段错误(SIGSEGV)和总线错误(SIGBUS)的区别。段错误通常发生在访问非法内存区域,如未初始化指针、NULL指针解引用、越界访问或使用悬空指针。而总线错误(SIGBUS)则是因为访问无效的内存地址,常见于内存对齐问题。

段错误(SIGSEGV)与总线错误(SIGBUS)

  1. 前言
    最近整理组里的历史代码,发现有一段程序运行有问题,喜提Segmentation fault (core dumped),这个问题一般是访问非法内存造成的,但是使用gdb进行调试时,发现出现了没见过的错误SIGBUS
Program received signal SIGBUS, Bus error.
0x0000000000402007 in main () at energy-xtc.c:128
128					HBN[l][k] = start[is][1] + NAM[is][0] * j + HBI[i][k] - start[is][0];
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.209.el6_9.2.x86_64

这个错误照字面意思理解就是巴士🚌错误,然而遗憾的是我理解错了,计算机系统里面没有巴士的概念,只有总线的概念,所以这个错误应该是总线错误。

  1. SIGSEGVSIGBUS的区别
    当操作系统探测当应用程序发生严重错误,并且不可能再继续运行,系统就向程序发出信号,要求程序终止运行,SIGSEGVSIGBUS都属于这类信号。
    1)当出现Segmentation fault (core dumped)时,基本可以预期是程序访问了非法的内存区域,系统发出信号SIGSEGV终止程序。当程序企图向分配的内存以外的区域读写,或者向只读区域进行写操作时,都会产生这个信号。常见的场景有:
  • 使用了未初始化的指针
  • 对NULL指针进行解引用
  • 访问程序内存空间以外的内存
  • 访问已经释放的内存(使用悬空指针)
    2)而信号SIGBUS 的出现是因为程序企图访问CPU无法寻址的内存,即访问无效的地址,大部分情况是由内存对齐导致的。常见的场景有:
  • 程序请求CPU访问一个无效的物理地址
  • 对内存进行未对齐的访问
    在这里插入图片描述
    参考链接
    https://www.geeksforgeeks.org/segmentation-fault-sigsegv-vs-bus-error-sigbus/
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值