当我查看gdb中的backtrace时,我的应用程序有时会出现段错误,主要是在malloc()和malloc_consolidate()中。
我确认机器有足够的可用内存,甚至没有开始交换。 我检查了ulimits的数据分段和最大内存大小,两者都设置为'无限'。 我还在valgrind下运行了应用程序,但没有发现任何内存错误。
现在我没有想到还有什么可能导致这些段错误。任何想法?
更新的 由于我没有找到valgrind(或ptrcheck)的任何内容,可能是因为另一个应用程序正在破坏libc的内存结构,还是每个进程都有一个单独的结构?
答案 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。