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

相关文章

  • OpenCV基于背景减除实现行人计数

    OpenCV基于背景减除实现行人计数

    本文主要介绍了如何使用OpenCV C++对视频中的人流量进行统计。文中的示例代码讲解详细,对我们学习OpenCV有一定的帮助,需要的可以了解一下
    2022-01-01
  • C语言编程动态内存分配常见错误全面分析

    C语言编程动态内存分配常见错误全面分析

    这篇文章主要介绍了C语言编程中动态内存分配的常见错误全面分析讲解,同样遇到过C语言动态内存分配各种问题的同学可以借鉴参考下,希望能够有所帮助
    2021-10-10
  • Cocos2d-x UI开发之CCControlButton控件类实例

    Cocos2d-x UI开发之CCControlButton控件类实例

    这篇文章主要介绍了Cocos2d-x UI开发之CCControlButton控件类实例,本文代码中包含大量注释来讲解CCControlButton控件类的使用,需要的朋友可以参考下
    2014-09-09
  • VScode搭建OpenCV环境的详细步骤

    VScode搭建OpenCV环境的详细步骤

    用vscode来写opencv代码需要自己编译OpenCV,主要用到MinGW-w64和CMake工具。接下来通过本文给大家介绍VScode搭建OpenCV环境的相关知识,需要的朋友可以参考下
    2021-11-11
  • c++中typename和class的区别介绍

    c++中typename和class的区别介绍

    在c++Template中,很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢?
    2013-03-03
  • C语言数据结构之单链表操作详解

    C语言数据结构之单链表操作详解

    链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。本文将和大家一起聊聊C语言中单链表的常用操作,感兴趣的可以学习一下
    2022-07-07
  • C++实现LeetCode(151.翻转字符串中的单词)

    C++实现LeetCode(151.翻转字符串中的单词)

    这篇文章主要介绍了C++实现LeetCode(151.翻转字符串中的单词),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 用C语言实现圣诞树(简易版+进阶版)

    用C语言实现圣诞树(简易版+进阶版)

    大家好,本篇文章主要讲的是用C语言实现圣诞树(简易版+进阶版),感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • 一文带你快速了解C/C++标准库中的ptrdiff_t

    一文带你快速了解C/C++标准库中的ptrdiff_t

    ptrdiff_t是C/C++标准库中定义的一个与机器相关的数据类型,ptrdiff_t类型变量通常用来保存两个指针减法操作的结果,下面这篇文章主要给大家介绍了关于C/C++标准库中ptrdiff_t的相关资料,需要的朋友可以参考下
    2022-11-11
  • 深入解析C++编程中的纯虚函数和抽象类

    深入解析C++编程中的纯虚函数和抽象类

    这篇文章主要介绍了深入解析C++编程中的纯虚函数和抽象类,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09

最新评论