1

MS VC++ 2010 と GCC 4.2.1 (Eclipse の Mac OS X 10.6 64 ビット用) で C++ CLI プログラムを作成しました。このプログラムは GCC+OS X でうまく動作し、ほとんどの場合 Windows で動作します。しかし、時々静かにフリーズします。コマンド ライン カーソルは点滅し続けますが、プログラムは作業の続行を拒否します。

次の構成はうまく機能します: 「リリース」および「デバッグ」構成の GCC。「デバッグ」構成の VC++

このエラーは、Win 7 32 ビットおよび 64 ビットの構成「VC++ with 'Release' configuration」でのみ発生します。残念ながら、これは私の顧客が使用したい構成です ;-(

私はすでにプログラムの高低をチェックし、すべてのメモリ リークを修正しました。しかし、このエラーは引き続き発生します。エラーを見つける方法はありますか?

4

3 に答える 3

1
  • ロギングを使用して、クラッシュ時にプログラムが実行しているコードの部分を絞り込みます。問題を確認するのに十分な範囲までログを追加し続けます。
  • リリース ビルド (コンパイラとリンカーの両方) でデバッグ情報を有効にします。多くの変数は正しく表示されませんが、少なくとも適切なバックトレースが得られるはずです (フリーズがスタック破壊またはスタック オーバーフローによるものでない限り)。これは通常、関数を短くして 1 つのことだけを行う場合には十分です。
  • メモリリークによってフリーズが発生することはありません。ただし、他の形式のメモリの誤用は非常に可能性が高いです。私の経験では、バッファをオーバーランすると、そのバッファが解放されるときにフリーズが発生することがよくあります。また、他の種類の未定義の動作にも注意してください。C/C++ には多くのものがあり、通常、デバッグでは期待どおりに動作し、最適化すると完全にランダムに動作します。
  • DUMAライブラリの下でプログラムをビルドして実行し、バッファ オーバーランをチェックしてみてください。ただし、次の点に注意してください。
    • 多くのメモリが必要です。私は簡単に何千倍も意味します。したがって、単純なケースでのみテストできます。
    • Microsoft ヘッダーは、通常の malloc と内部 __debug_free (またはその逆) など、内部割り当て関数と不一致を悪用する傾向があります。そのため、関数を再定義する前に、これらのシステム ヘッダーを duma ヘッダーに含めることで、慎重に回避する必要がある場合がいくつかあります。
  • Linux 用のプログラムをビルドしてValgrindで実行してみてください。これにより、バッファ オーバーランに加えてより多くの問題がチェックされ、それほど多くのメモリを使用しなくなります (通常の 2 倍だけですが、約 20 倍遅くなります)。
于 2012-05-25T10:27:05.577 に答える
1

デバッグ バージョンは、通常、割り当てられたすべてのメモリを初期化します (MSVC はそれらを0xCDデバッグ構成で埋めます)。おそらく、クラスに初期化されていない値がいくつかあり、GCC 構成と MSVC デバッグ構成では「幸運な」値を取得しますが、MSVC リリースではそうではありません。

MSVC で使用される残りのマジック ナンバーは次のとおりです。

したがって、初期化されていない変数、属性、および割り当てられたメモリ ブロックを探します。

于 2012-05-25T10:07:57.917 に答える
0

皆さん、特に Cody Gray と MikMik に感謝します。見つけました! 何人かが推奨したように、リリース構成でデバッグ情報を生成し、最適化を無効にするように VS に指示しました。次に、プログラムを開始して一時停止しました。または、実行中のプロセスにリモートで接続しました。これは、エラーが発生した領域を見つけるのに役立ちました。その理由は、配列の境界の背後にある読み取りと、無効なケースの除外の欠落によって引き起こされた無限ループでした。どちらも、実行時に到達不能な停止状態につながりました。難解な部分は、私のプログラムがいくつかのランダム化された値を使用しているという事実から来ました。それが人生だ...

于 2012-05-26T10:34:38.237 に答える