2013-01-20 40 views
2

硬件故障(例如RAM损坏)在C++程序中是否表现为非理性但一致的行为?C++和可能的硬件故障

今天笔者从一个程序我一直在努力,在过去一年左右的时间见证了很奇怪的行为。它是用C++编写的,我使用的是Visual Studio 2010.有两个莫名其妙的行为。

第一个涉及特定类的构造函数。在我做了一些代码更改(其他地方,不在构造函数中)并重建项目之后,内存尖峰化并最终冻结了我的操作系统(类似于一年前我曾经有过的problem,这是由于优化,但是这次优化被禁用) 。经过调试,我意识到断点在构造函数中是不可访问的,这意味着没有代码被生成。如果我在代码中的其他地方的结构中添加了几个成员变量,构造函数再次神奇地工作。

第二个实例涉及一个方法的调用方法B和传递的参数。调试时,传递给B的变量在传递给B之前是有效的字符串。一旦在B处,参数为空。系统重新启动使事情再次正常工作。

这让我觉得有可能是我的RAM一个问题 - 重启后,该方案将在可能的内存不同部分运行,所以不会有问题。我工作的机器过去经历过几次蓝屏,但并不经常。 Windows内存诊断工具的运行没有发现问题,但我仍然怀疑。

这很容易,当你不知道为什么事情发生归咎于环境,但我确实之前从来没有见过这样的事。我只想问一下,如果硬件故障影响到这样的程序,是否会有意义。

+6

代码在不同的硬件上运行良好吗? – juanchopanza

+0

@juancopanza你打我:) –

+0

听起来很粗略。您的应用程序是否有可能指向随机垃圾的未初始化数据? – OldProgrammer

回答

0

不,你可以肯定这个问题不是你的硬件。否则其他应用程序会有不正确的行为

+0

我倾向于同意你的观点,但我遇到过一个案例(40年之一),其中硬件问题_did_仅影响一个程序。然而,硬件问题涉及磁芯RAM,(它对写入的位的模式敏感),现在还没有使用过一段时间。 –

+0

这听起来很奇怪,因为我知道测试RAM的最好的程序之一实际上是在运行一个编译器......因此我会说,在发生RAM故障时,不仅在运行它的应用程序时会遇到问题,编译它。 –

+0

RAM的哪些故障模式运行编译器测试?不同的技术有不同的故障模式,并且需要不同种类的测试。编译器当然不会被写入来执行任何特定类型的RAM的任何特定故障模式;我相当怀疑这将是一个特别好的测试 - 可能没有任何其他随机应用更好。 –

0

硬件故障往往会影响到大多数事情在系统中,而不仅仅是一个应用程序。如果您怀疑机器存在问题,请尝试运行内存测试 - 这也将测试CPU的行为(尽管这种情况不太可能以仅影响某些软件的方式破坏)。

我相信你的软件是从“未定义的行为”,而不是硬件故障的痛苦......你不是写超出允许的地区,或使用未初始化的变量,或沿着这些线路的别的东西。尝试简化你的代码,如果你能够制作15-50行代码,请在这里发帖。

+0

我已经做了内存测试(参见问题)。我没有设法在较小的代码基础上复制任何一个问题。我怀疑未定义的行为 - 我遇到的问题不是未初始化变量的结果。第一个特别似乎是一个汇编问题。 – Gigi

+0

啊,错过了。那么,不太可能。除非你的硬盘已经出来了。但这似乎不太可能。您可以随时重命名当前的可执行文件,以便下次编译时,可执行文件将在不同的地方结束。如果它仍然以类似的方式失败,那么你可以肯定它不是硬盘(特别是如果你比较你的二进制文件和它们是相同的)。 –

+0

想到另一件事。过去两三次,由于某些Boost头文件导致编译失败。经过检查,我发现一些随机字符被插入到头文件中间,无处不在。也许这可能是对即将发生的硬盘故障的暗示...... – Gigi

1

如果您怀疑硬件,则应尝试另一台计算机。也就是说,我始终认为内存故障是故障或编译问题的原因,但没有一个是。最可能的原因是:

  • 未定义的行为不仅仅针对未初始化的变量,而是针对未在返回中完成的函数路径。你应该使用某种皮棉。
  • 糟糕的编译脚本或生成文件。您认为您正在使用库X版本,但实际上您正在链接到某个其他Y版本,或者有时是相同的版本,但另一个不是那么平等的文件,特别是具有不同的调试/测试/版本版本。
  • 当优化与未优化时库的不同行为。
  • 线程。在每种可能的情况下检查您的写/读访问权限。如果可以的话,使用一些强大的同行评审稳定库。
+0

放下列表,但仍有可能是编译器错误。几个月前,我在VS 2010中打了一个。我在32位版本中做了一些工作,以使更多寄存器可用,并且编译器在捕获异常后不恢复EAX。或类似的东西。 –