Advertisement

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

阅读量:

近期完成的一个后端C语言模块在部署后发生核心崩溃问题,初期由于系统负载较低,因此故障出现在上线后的三日左右。当时使用gdb追踪调用堆栈并审查源代码,发现崩溃点的代码本身并无明显错误。由于当时开发任务繁重,且该模块不保存状态(重启后不影响对外服务),因此未进一步深入排查。然而随着客户端版本逐步推广,访问压力随之上升,问题开始频繁出现……
该模块会不定期发生核心崩溃,并且每次崩溃时的调用堆栈几乎都不相同。更为棘手的是,在堆栈的最后几层中,很多都指向了极难出现问题的代码区域,例如库函数或公司内部通用库。
幸运的是,在多个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): 0x0000

全部评论 (0)

还没有任何评论哟~