关于C++出现Bus error问题的排查与解决

 更新时间:2024年01月30日 10:36:53   作者:普罗米修斯Aaron_Swartz  
项目代码中经常出现莫名其妙的Bus error问题,并且代码中增加很多try catch 后依然不能将错误捕获,一旦Bus erro出现,进程直接崩溃掉,所以本文给大家介绍了关于C++出现Bus error问题的排查与解决,需要的朋友可以参考下

前言

项目代码中经常出现莫名其妙的Bus error问题,并且代码中增加很多try catch 后依然不能将错误捕获,一旦Bus erro出现,进程直接崩溃掉。类似如下这种:

异常提示

经查询google,出现该问题一般是因为地址未对齐引起的,也就是程序试图访问一个不是地址的值。从而导致该错误。后经公司高工通过gdb运行代码后查看汇编发现,寄存器中确实存储了一个非地址的值(50位, 64位机器的实际内存地址应该为48位,高位用于寻址),导致在访问时出现Bus-error。

更奇怪的是,该问题不会一直复现,而是经常跑几个小时,然后在调用函数指针的时候崩溃一次。提示UpdateDataPtr指向的一个空地址。

在这里插入图片描述

对于此,高工的判断要么是数组越界,要么是因为野指针导致该函数指针被意外修改。

顺着这个思路,一开始是通过内存监控,查看是谁修改了该内存,但是并未守到结果。此时高工想通过分析内存的方式看能不能找到一些线索。

*** 操作方法就是在该指针前后增加标记变量,然后通过程序挂掉时候的core dump 查看那时刻的内存结构,从而尝试分析问题***

std_function.h

最后发现代码中的一个单例中定义了一个数组u_char crcbuf[64]; 在写这个数据的时候发生越界,最终将该变量下的指针变量也覆盖了

写成我们接收到的里程计数据了,从此真相大白!

在这里插入图片描述

对于此,接着分析是如何导致该问题的呢?

看看报文就知道了,正常报文的数据部分出现了报头一样的情况,导致程序误认为读取的数据大小为176个字节,那么在计算crcbuf的时候也会尝试放入176个字节,最终产生数组越界,将函数指针覆盖。

问题数据

总结

1 该问题从出现到解决持续了好几周,一直没有好的方案。

2 遇到问题不能回避,应该迎难而上,实在不行请教公司高工。

3 C++ 中无法对数组越界的问题进行捕获, 因此务必小心使用数组和指针

4 C++中内存分析和gdb调试要及早掌握,对于分析复杂问题帮助很大

以上就是关于C++出现Bus error问题的排查与解决的详细内容,更多关于C++出现Bus error的资料请关注脚本之家其它相关文章!

相关文章

  • C++实现马踏棋盘(骑士周游)

    C++实现马踏棋盘(骑士周游)

    这篇文章主要为大家详细介绍了C++实现马踏棋盘,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C语言趣味编程之水仙花数

    C语言趣味编程之水仙花数

    这篇文章介绍了C语言趣味编程之水仙花数,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11
  • C语言实现猜数字游戏

    C语言实现猜数字游戏

    这篇文章主要为大家详细介绍了C语言实现猜数字游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • C++中静态初始化数组与动态初始化数组详解

    C++中静态初始化数组与动态初始化数组详解

    今天小编就为大家分享一篇C++中静态初始化数组与动态初始化数组详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • C++实现DES加密算法实例解析

    C++实现DES加密算法实例解析

    这篇文章主要介绍了C++实现DES加密算法实例解析,是一个很实用的功能,需要的朋友可以参考下
    2014-08-08
  • C与C++ 无参函数的区别解析

    C与C++ 无参函数的区别解析

    在《C++ 编程思想》:“关于无参函数声明,C与C++有很大的差别。在C语言中,声明int fun1(),意味着一个可以有任意数目和类型的函数;而在C++中,指的却是一个没有参数的函数”
    2013-07-07
  • OpenCV利用对比度亮度变换实现水印去除

    OpenCV利用对比度亮度变换实现水印去除

    OpenCV中去除水印最常用的方法是inpaint,通过图像修复的方法来去除水印。本文将介绍另一种方法:利用对比度亮度变换去除水印,需要的朋友可以参考一下
    2021-11-11
  • OpenCV实现低对比度图像脏污区域检测

    OpenCV实现低对比度图像脏污区域检测

    本文主要介绍了OpenCV实现低对比度图像脏污区域检测,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • C++实现LeetCode(82.移除有序链表中的重复项之二)

    C++实现LeetCode(82.移除有序链表中的重复项之二)

    这篇文章主要介绍了C++实现LeetCode(82.移除有序链表中的重复项之二),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言PlaySound函数使用方法

    C语言PlaySound函数使用方法

    这篇文章介绍了C语言PlaySound函数的使用方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12

最新评论