记录一次排查提示段错误bug的过程

这次记录的是一次改bug的过程。

现象:程序编译能通过,运行到某一步之后崩掉,然后报段错误core dump,文件夹下多出core.pid的文件。程序中使用了一个类库,vflib。

排查过程:第一步是百度,首先查到core dump的错误一般是内存错误,而且运行出错的地方往往不是导致错误的地方,应该是内存非法访问等等的问题。用Boss的话说,比较模糊。。。

第二步是单步调试,几乎一句代码一个输出,还不会用icc的单步调试,但是调试到报错的代码也没什么用。发现报错代码是一个20次的for循环第13次执行循环体中的new语句。好好的一句new 也能报错?前几次new都没有问题就这个new能出问题?所以肯定不是代码的语法上等等的问题,嗯,比较模糊。

第三步就是。。。凭感觉了,这一步做了很多尝试,trycatch什么的都用了,没有什么用,最后无意间发现删除掉gSet.push_back(*gp)后程序可以正常运行(gSet是一个STL的vector,gp是指针,类型合法)。我的天,这STL的push_back还能错。然后我突然意识到,会不会是传参的过程中调用了拷贝构造函数或者是赋值重载函数,但是库里边的类没有重写这两个函数导致了浅复制?打开源码一看,我靠还真没重写这俩函数,太不良心了,写出来的类有指针成员还不重写拷贝构造函数和赋值重载函数!

解决:库里边的类是不能用来传参了,只能自己写了一个类用来传递数据,而不是用库里边的类。每次需要库中的类的时候用自己写的类初始化然后传递。

 

教训:1.类有了指针成员,一定要重写拷贝构造函数和复制重载函数。

  2.运行起来报错的一般都是内存出错,出错原因也比较模糊,只能想哪里可能出现内存非法访问的问题。

 3.有个好习惯是delete掉的指针,赋值为NULL。不过这一条和本次BUG无关。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值