没有使用valgrind时出现段错误

7
我用valgrind获得了最终的“完成”消息,并得到了以下退出报告:
==3434== HEAP SUMMARY:
==3434==     in use at exit: 8,432 bytes in 4 blocks
==3434==   total heap usage: 4,369 allocs, 8,037 frees, 377,356 bytes allocated
==3434== 
==3434== LEAK SUMMARY:
==3434==    definitely lost: 152 bytes in 1 blocks
==3434==    indirectly lost: 0 bytes in 0 blocks
==3434==      possibly lost: 0 bytes in 0 blocks
==3434==    still reachable: 8,192 bytes in 2 blocks
==3434==         suppressed: 88 bytes in 1 blocks
==3434== Rerun with --leak-check=full to see details of leaked memory
==3434== 
==3434== For counts of detected and suppressed errors, rerun with: -v
==3434== ERROR SUMMARY: 100190 errors from 140 contexts (suppressed: 0 from 0)

但是当我不使用valgrind运行时,它立即崩溃。valgrind是否抑制了某种错误,我应该寻找?我在网上找不到任何相关信息。


1
在valgrind输出中有任何“无效读取”或“无效写入”吗? - Daniel Fischer
它们有很多。那些一定很糟糕。 - SetSlapShot
2
没错。它们意味着你正在读取或写入不属于你的内存。必须全部修复。 - Daniel Fischer
我同意@DanielFischer的观点。首先修复所有警告,很可能也会消除段错误。 - Oliver Charlesworth
3个回答

6

Valgrind会在不同的环境中运行程序,与从shell中运行程序时不同。这可以防止一些由内存耗尽或数组越界引起的崩溃。

纠正你的140个错误上下文,你就没问题了。


3

内存检查器并不执行完整的范围检查,因为它有自己的内存分配器,所以它可能会抑制你本来会收到的故障。相反,请使用调试器。


2

Valgrind不能捕获的一个错误例子是:当你释放内存后,仍然通过另一个指针引用该内存,而该指针也指向同一位置。

我不确定为什么会出现这种情况。也许Valgrind环境处理内存分配和释放的方式不同。 [就像Eregrith所说的那样]

快速检查这个问题的方法是暂时注释掉free()函数调用,看看是否仍然出现段错误。[稍后取消注释,一旦修复它们!]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接