1

非常に不可解なクラッシュに遭遇し、プログラムでそれを追跡するのに問題がありました。

/debugデバッグ シンボルを使用してデバッグするためにフラグとリンクしようとすると、クラッシュが消えるため、そのソースがどこにあるのかわかりません。

これは、最適化とは無関係のようで (/Odコンパイラーの最適化を無効にするためにでコンパイルしましたが、リンク時のコード生成は使用していません)、デバッグ情報自体とも無関係です (私は でコンパイルしてい/Ziます)。何らかの理由で、リンカーが/debugフラグなしで呼び出されると、すべてが異なる動作をします。

これを引き起こしている可能性があるのは何ですか?

4

1 に答える 1

4

犯人はリンカーによるフィールドのマージでstatic const intあることが判明しました。

どうやら、static const同じタイプと値の複数のフィールドがある場合、リンカはそれらをマージしますが、デバッグ シンボルをリンクしない場合のみです。

私はそのようなフィールドのアドレスを使用してそれらを区別していましたが、結局のところ、それらはすべてリンカにとって同じように見え、したがってコードの残りの部分にも同じように見えました。

どうやってこれを理解したのですか?
たくさんprintステートメント (時間) が原因で、最終的に原因に気付くまで、間違ったコードが実行されていることに気付きました。

于 2012-10-12T11:24:01.690 に答える