如何解决malloc中的崩溃问题

时间:2011-09-20 05:45:11

标签: crash malloc

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

由于

2 个答案:

答案 0 :(得分:9)

内存分配是否中断?

尝试valgrind

Malloc仍在崩溃。

好的,我将不得不假设你的意思是SIGSEGV(分段错误)在malloc中被触发。这通常是由堆损坏引起的。堆损坏本身不会导致分段错误,通常是数组访问范围之外的数组访问的结果。这通常远不及您拨打malloc

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

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

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

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

答案 1 :(得分:0)

尝试阿桑

AddressSanitizer(aka ASan)是一个用于C / C ++的内存错误检测器。它发现:

SQL[2407]: select trim(both '-' from '2017-02-12') from dual;
2017-02-12
SQL[2408]: select trim(both '-' from '2017-02-12-') from dual;
2017-02-12
SQL[2409]: select trim(both '-' from '-2017-02-12-') from dual;
2017-02-12
SQL[2410]:

请找到了解更多以及如何使用它的链接

https://github.com/google/sanitizers/wiki/AddressSanitizerhttps://github.com/google/sanitizers/wiki/AddressSanitizerFlags

相关问题