内存写越界导致破环堆结构引起的崩溃问题定位经验[如报错malloc(): memory corruption或free(): invalid next size]

        前段时间开发的一个后端C模块上线后,线上出core,初始时,由于访问压力不大,所以崩溃是上线3天左右出现的。当时用gdb跟进调用堆栈并检查源码,发现出core位置的代码没有啥问题。由于当时开发任务较重,且该模块不保存状态(崩溃重启不影响对外服务),所以没有深入跟进。后来随着客户端版本逐渐放量导致访问压力上升,噩梦开始了。。。
        该模块会不定时core掉,而且几乎每次崩溃时的调用堆栈都不一样,关键是最后几层堆栈很多都位于几乎不可能出问题的代码中,比如库函数或厂里的公共库。
        好在在众多core文件中发现规律:每次基本都是在对内存动态操作时挂掉,比如malloc/realloc/free/new/delete都引起了崩溃。而且幸运的是,崩溃进程还是输出了一些关键信息,比如下面这些(这些是在不同的崩溃时刻分别输出的):
*** glibc detected *** malloc(): memory corruption: 0x0000002a95c1ff10 ***
*** glibc detected *** double free or corruption (out): 0x0000000000f0d910 ***
*** glibc detected *** free(): invalid next size (normal): 0x0000002a96103b00 ***
*** glibc detected *** free(): invalid next size (fast): 0x0000000000f349d0 ***
*** glibc detected *** corrupted double-linked list: 0x0000002a95f062e0 ***
       
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值