c++ - Valgrind 报告在一个系统上读取无效,但在另一个系统上没有

标签 c++ c segmentation-fault valgrind

我需要在一台新机器上运行一个相当大的软件包来工作。该应用程序是用 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/

相关文章:

c - C 中的 "for"循环后面是否需要 "{}"?

c++ - 为什么函数序言中没有 "mov rsp, rbp"?

C++:友元函数、派生类

c++ - boost ptime : how to format data in a way browsers send inside headers of http requests?

c++ - 如何检查 vector 是否具有以特定字符串开头的元素

c - 从 RGB 到 BGRA 的快速矢量化转换

c - C中通过socket写入不同类型的消息

c++ - 多线程段错误(for循环)

c - 尝试读取目录中的文件并将其写入列表

c++ - OpenCL 多 GPU 积分 - 将全局大小从 32 更改为 64 时出现段错误