关于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的资料请关注脚本之家其它相关文章!

相关文章

  • Qt网络编程之TCP通信及常见问题

    Qt网络编程之TCP通信及常见问题

    这篇文章主要为大家详细介绍了Qt网络编程之TCP通信及常见问题,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • OpenCV实现轮廓检测与绘制

    OpenCV实现轮廓检测与绘制

    这篇文章主要为大家详细介绍了OpenCV实现轮廓检测与绘制,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • C语言链表详解及代码分析

    C语言链表详解及代码分析

    这篇文章主要介绍了C语言链表详解及代码分析,说明了链表的定义与概念,通过详细的代码展示了基于链表的增删改查功能,希望本文能对你有所帮助
    2021-06-06
  • C++ boost::asio编程-域名解析详细介绍

    C++ boost::asio编程-域名解析详细介绍

    这篇文章主要介绍了C++ boost::asio编程-域名解析详细介绍的相关资料,这里附有实例代码,帮助大家学习理解这部分知识,需要的朋友可以参考下
    2016-11-11
  • Qt实现网络聊天室的示例代码

    Qt实现网络聊天室的示例代码

    本文主要介绍了Qt实现网络聊天室,实现一个在线聊天室, 使用tcp对客户端和服务器端进行通讯。具有一定的参考价值,具有一定的参考价值,
    2021-06-06
  • C++实现主机字节序和网络字节序转换示例

    C++实现主机字节序和网络字节序转换示例

    这篇文章主要为大家介绍了C++实现主机字节序和网络字节序转换示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Qt编写地图之实现经纬度坐标纠偏

    Qt编写地图之实现经纬度坐标纠偏

    地图应用中都涉及到一个问题就是坐标纠偏的问题,这个问题的是因为根据地方规则保密性要求不允许地图厂商使用标准的GPS坐标,而是要用国家定义的偏移标准。本文将详细讲解如何在Qt中实现经纬度坐标纠偏,需要的可以参考一下
    2022-03-03
  • C语言 scanf的工作原理详解

    C语言 scanf的工作原理详解

    这篇文章主要为大家介绍了C语言 scanf的工作原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • c++ error:crosses initialization of问题解决分析

    c++ error:crosses initialization of问题解决分析

    这篇文章主要介绍了c++ error:crosses initialization ofde 问题解决分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • C++ 数据结构之水洼的数量算法

    C++ 数据结构之水洼的数量算法

    这篇文章主要介绍了C++ 数据结构之水洼的数量算法的相关资料,需要的朋友可以参考下
    2017-06-06

最新评论