我的程序又core dump了

小心翼翼的检查好源文件,make一下,庆幸编译完美通过。run一下,过了不知道多久,程序又core了!

你是否也遇到过这样的情况,有点想骂人的冲动,程序总是无端的core dump,多个模块,gdb调试之也看不出问题,这样的系统交付出去,自己都不放心。

骂人是没有用的,发泄发泄,该调试还得调试。冷静下来,梳理一下思路,分析下到底哪里出了问题。运行时的segment error大多数是内存问题。gdb调试core文件,查看上下文,看看是否有非法访问的情况。总结一下常犯的内存问题:

1.内存重复释放,出现double free时,通常是由于这种情况所致。(当core的那一行是free语句时往往会报这个错)
2.内存泄露,分配的内存忘了释放。(如果程序跑的时间长,观察内存显著增长直至上限)
3.内存越界使用,使用了不该使用的内存。(最难查到的问题,因为看似合理的指向,可能指向的空间已经破坏或者非法
4.使用了无效指针。
5.空指针,对一个空指针进行操作。


奇葩的问题的表象下本质上仍旧可归于以上几类问题:

在我的程序中申请了两块堆内存A,B,指针来访问,粗心了一下,B的偏移出错,越界访问。可是在对A的正常操作语句中core了。究其原因是因为,由于B的越界访问赋值,造成了A内存的破坏。在访问A的时候就Cannot Access了。

调试的时候注意力只在A本身,检查多次之后,依然找不出错。折腾了三四天之后,通过不断的排除正确代码,锁定出错位置,阅读检查逻辑,终于发现了B的越界。


如果你的程序中有大量的申请堆内存,一定要注意以上几类问题。

另外注意,不是每次malloc都会成功,我就遇到了失败的情况,失败了怎么办?这都是要考虑和检查的。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值