我需要在一台新机器上运行一个相当大的软件包来工作。该应用程序是用 C 和 C++ 编写的,我在 CentOS 6.5 上运行。
程序构建良好,但在我运行时出现段错误。使用 valgrind,我看到在段错误的位置报告了以下错误:
==23843== Invalid read of size 4
[stack trace here]
==23843== Address 0x642e7464 is not stack'd, malloc'd or (recently) free'd
所以出于某种原因,我们正在从内存中读取我们不应该读取的内容,并且正在调用未定义的行为。当我将我的源文件压缩后,将它们带到另一台 CentOS 6.5 机器(具有相同内核)并编译它们(使用相同的 makefile 和相同的 GCC 版本)程序似乎运行良好。
我也在该机器上运行了 valgrind,并期望再次看到无效读取。我的想法是,无效读取将始终存在,但由于行为未定义,事情恰好在一台机器上正常工作,而不是在另一台机器上。
然而,我发现 valgrind 在第二台机器上没有报告读取错误。这怎么可能?
最佳答案
Valgrind 使运行环境更具确定性,但并没有消除所有的随机性。也许另一台机器安装了不同版本的库,或者它使用的任何外部(文件、网络..)不同,代码执行不必完全相同。
您应该查看堆栈跟踪并分析发生错误的代码。如果仅从堆栈跟踪来看不明显,您可以使用 --vgdb=full
参数启动 valgrind
。一旦发生错误,它将暂停执行并打印出如何附加 gdb
的说明。或者您可以直接在调试器下运行该程序 - 您写道即使没有 valgrind 它也会崩溃。
关于c++ - Valgrind 报告在一个系统上读取无效,但在另一个系统上没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29947806/