如何解决malloc中的崩溃问题

doo*_*oon 1 crash malloc

我有一大堆继承的遗留代码.它一直运作良好,直到现在.突然在我无法在室内重现的客户试用版中,它在malloc中崩溃了.我认为我需要添加检测,例如在malloc之上我有自己的malloc,它存储关于每个malloc的一些元信息,例如谁已经进行了malloc调用.当它崩溃时,我可以查找元信息,看看发生了什么.几年前我做过类似的事,但现在不记得了......我相信人们已经提出了更好的想法.很高兴有投入.

谢谢

Mik*_*one 10

内存分配是否破裂?

试试valgrind.

Malloc仍在崩溃.

好吧,我将不得不假设你的意思是SIGSEGV(分段错误)正在解雇malloc.这通常是由堆损坏引起的.堆损坏本身不会导致分段错误,通常是数组访问范围之外的数组访问的结果.这通常远不及你打电话的地方malloc.

malloc在它返回给你的内存块"前面"存储一小段信息.此信息通常包含块的大小和指向下一个块的指针.不用说,改变其中任何一个都会导致问题.通常,下一个块指针被更改为无效地址,并且在下一次malloc调用时,它最终取消引用错误指针和分段错误.或者它没有并开始将随机内存解释为堆的一部分.最终它的运气耗尽了.

注意free,如果正在释放的块或空闲块列表搞砸了,可能会发生相同的事情.

如何捕获这种错误完全取决于您如何访问malloc返回的内存.甲malloc单个的struct通常不是问题; 它malloc是通常会让你的数组.使用负(-1或-2)索引通常会为您提供当前块的块头,并且通过数组末端的索引可以为您提供下一个块的头.两者都是有效的内存位置,因此不会出现分段错误.

所以首先要尝试的是范围检查.你提到它出现在客户的网站上; 也许是因为他们正在使用的数据集要大得多,或者输入数据已损坏(例如,它表示要分配100个元素然后初始化101),或者它们以不同的顺序执行操作(这隐藏了错误)你的内部测试),或做一些你没有测试过的东西.没有更多细节,很难说.你应该考虑写一些东西来理智检查你的输入数据.