malloc()和malloc_consolidate()中的Segfaults

时间:2010-06-23 08:50:13

标签: c++ debugging malloc segmentation-fault

当我查看gdb中的backtrace时,我的应用程序有时会出现段错误,主要是在malloc()和malloc_consolidate()中。

我确认机器有足够的可用内存,甚至没有开始交换。 我检查了ulimits的数据分段和最大内存大小,两者都设置为'无限'。 我还在valgrind下运行了应用程序,但没有发现任何内存错误。

现在我没有想到还有什么可能导致这些段错误。任何想法?

更新的 由于我没有找到valgrind(或ptrcheck)的任何内容,可能是因为另一个应用程序正在破坏libc的内存结构,还是每个进程都有一个单独的结构?

2 个答案:

答案 0 :(得分:24)

来自http://www.gnu.org/s/libc/manual/html_node/Heap-Consistency-Checking.html#Heap-Consistency-Checking

  

检查和防范使用中的错误的另一种可能性   malloc,realloc和free是设置环境变量   MALLOC_CHECK_。设置MALLOC_CHECK_时,特殊(效率较低)   使用的实现是为了容忍简单   错误,例如使用相同参数进行双重调用,或者   单字节溢出(逐个错误)。并非所有这些错误都可以   但是,可以防止内存泄漏。如果   MALLOC_CHECK_设置为0,任何检测到的堆损坏都是静默的   忽略;如果设置为1,则在stderr上打印诊断;如果设置为2,   立即调用中止。这可能很有用,因为否则a   崩溃可能发生得更晚,问题的真正原因是   然后很难追查。

答案 1 :(得分:13)

最有可能的是,你正在摧毁堆 - 也就是说,你写的超出了你分配的一块内存的限制,这就覆盖了malloc()用来管理堆的数据结构。这会导致malloc()访问无效的地址,并且您的应用程序崩溃。

内存不足不会导致malloc()崩溃 - 它只会返回NULL。如果您没有检查NULL,可能会导致代码崩溃,但崩溃网站不在malloc()

Valgrind没有报告任何错误,这有点奇怪 - 但是默认的“Memcheck”工具可能会遗漏一些错误。尝试使用"Ptrcheck" tool运行Valgrid。