2

ハードウェア障害 (RAM の破損など) は、C++ プログラムで不合理ではあるが一貫した動作として現れることがありますか?

今日、私は過去 1 年ほど取り組んできたプログラムの非常に奇妙な動作を目撃しました。これは C++ で書かれており、私は Visual Studio 2010 を使用しています。不可解な動作のインスタンスが 2 つあります。

1 つ目は、特定のクラスのコンストラクターに関するものでした。いくつかのコード変更 (コンストラクターではなく別の場所) を行い、プロジェクトを再構築した後、メモリが最大に急増し、OS がフリーズしました ( 1 年前に発生した最適化による問題と似ていますが、今回は最適化が無効になっていました)。 . デバッグ時に、コンストラクターでブレークポイントにアクセスできないことに気付きました。つまり、コードが生成されていませんでした。コードの別の場所にある構造体にいくつかのメンバー変数を追加すると、コンストラクターは魔法のように再び機能しました。

2 番目の例では、メソッド A がメソッド B を呼び出し、パラメーターを渡します。デバッグ時に、渡される変数は、B に渡される前は有効な文字列でした。B では、パラメーターは空でした。システムを再起動すると、正常に動作するようになりました。

これにより、RAM に問題がある可能性があると考えました。再起動後、プログラムはメモリの別の部分で実行される可能性があるため、問題は発生しません。私が取り組んでいるマシンでは、定期的ではありませんが、過去にいくつかのブルー スクリーンが発生しました。Windows メモリ診断ツールを実行しても問題は明らかになりませんでしたが、それでも疑わしいと思います。

何が起こっているのか見当もつかない場合、環境のせいにするのは簡単ですが、私はこれまでにこのようなことを見たことがありません. ハードウェアの誤動作がこのようなプログラムに影響を与えることに意味があるかどうかを尋ねたかっただけです.

4

3 に答える 3

1

ハードウェアが疑わしい場合は、別のコンピューターを試す必要があります。とはいえ、実際にはRAMの障害が誤動作やコンパイルの問題の原因だと思っていましたが、そうではありませんでした。最も考えられる原因は次のとおりです。

  • 初期化されていない変数だけでなく、戻り値で終わらない関数パスの未定義の動作。ある種の Lint を使用する必要があります。
  • 不正なコンパイル スクリプトまたはメイクファイル。ライブラリ バージョン X を使用していると思われますが、実際には他のバージョン Y にリンクしている場合や、同じバージョンであるがそれほど等しくない別のファイル、特に異なるデバッグ/テスト/リリース バージョンにリンクしている場合があります。
  • 最適化された場合と最適化されていない場合のライブラリの異なる動作。
  • スレッド。考えられるすべてのシナリオで、書き込み/読み取りアクセスを確認してください。可能であれば、堅牢で査読済みの安定したライブラリを使用してください。
于 2013-01-21T00:59:16.223 に答える
0

いいえ、問題がハードウェアにあるのではないと確信できます。そうしないと、他のアプリケーションが正しく動作しなくなります。

于 2013-01-20T23:32:34.633 に答える
0

ハードウェア障害は、1 つのアプリケーションだけでなく、システム内のほとんどのものに影響を与える傾向があります。マシンに問題があると思われる場合は、メモリ テストを実行してみてください。これにより、CPU の動作もテストされます (ただし、一部のソフトウェアにのみ影響する方法で壊れる可能性はさらに低くなります)。

あなたのソフトウェアは、ハードウェアの障害ではなく「未定義の動作」に苦しんでいると思います...許可された領域の外に書いているか、初期化されていない変数を使用しているか、それらの線に沿って何か他のものを使用しています。コードを単純化するようにしてください。15 ~ 50 行のコードにすることができれば、ここに投稿してください。

于 2013-01-20T23:36:36.427 に答える