1

我处于一个非常奇怪的情况,我的代码在我的桌面上运行,但在远程集群上崩溃。我花了无数次检查我的源代码是否有错误,在调试器中运行它以捕获破坏代码的内容,并在 valgrind 下寻找内存泄漏(结果证明是干净的——至少在 gcc 下)。

到目前为止,我最终发现,只要我使用相同的编译器(gcc 4.4.5),相同的源代码在两台机器上都会产生相同的结果。问题是我想在远程集群上使用英特尔编译器以获得更好的性能,以及一些使用英特尔的预构建库。此外,我仍然担心 gcc 可能会忽略一些 intel 编译器中发现的内存问题。

这对我的代码意味着什么?

4

2 回答 2

4

这可能意味着您依赖于未定义、未指定或实现定义的行为

也许您忘记了初始化变量,或者您访问了超出其有效范围的数组,或者您a[i] = b[i++]的代码中有类似的表达式......可能性实际上是无限的。

于 2012-09-25T18:49:46.027 回答
0

崩溃是否会导致核心文件?如果来自多个核心转储的回溯跟踪(相当于 gdb 'bt' 命令)是一致的,那么您可以开始有选择地开始放入 printf 语句,并在堆栈跟踪中的函数列表中向后工作。

如果没有检测到内存泄漏,那么堆可能没问题。这使得堆栈成为一个潜在的问题区域。看起来您可能有一个未初始化的变量正在破坏堆栈。

尝试使用 gcc/g++ 编译命令参数中包含的“-fstack-protector”编译您的应用程序。

于 2012-09-29T20:43:16.353 回答