2

H.263 ビデオ エンコーダーをループで 31 回実行するためのワークスペースがあります。つまり、メインが 31 回実行され、31 の異なるエンコードされたビット ストリームが生成されます。この MS Visual Studio 2005 ワークスペースには、すべての C ソース ファイルがあります。ワークスペースの「DEBUG」構成を作成し、それをビルドして実行すると、正常に実行されます。つまり、31 個の出力ファイルすべてが期待どおりに生成されます。しかし、ワークスペースの構成を "RELEASE" mdoe に設定してプロセスを繰り返すと、一部のテスト ケースの実行でエンコーダーがクラッシュします。

これをデバッグするには、次のように検証します。

  1. コードを分析して、エンコーダーの実行ごとに変数の初期化が見逃されていないかどうかを確認しました
  2. 両方のモード (DEBUG と RELEASE) でさまざまな Workspace(Solution) オプションを確認しました。

明らかな違いがいくつかありますが、最適化関連のオプションを両方のモードで明示的に同じにしました。

しかし、それでも問題を解決できず、その修正を見つけることができませんでした。ポインタはありますか?

-アジト。

4

8 に答える 8

2

コードを注意深く調べないと、何が問題なのかを判断するのは困難です。でも...

デバッグ ビルドとリリース ビルドの違いの 1 つは、関数呼び出しスタック フレームの設定方法です。デバッグ ビルドでは致命的ではないが、リリース ビルドでは恐ろしくクラッシュする可能性がある特定のクラスの悪いこと (間違った数の引数で関数を呼び出すなど) があります。おそらく、リリース ビルドのスタック フレーム関連のオプション (それらが何と呼ばれているか忘れてしまいました) をデバッグ ビルドと同じに変更してみて、それが役立つかどうかを確認してみてください。

もう 1 つの方法は、可能な限りすべての警告を有効にして、それらをすべて修正することです。

于 2008-08-12T08:51:01.053 に答える
1

2 つのスレッドの同時実行の問題である可能性があります。DEBUG 構成により実行速度が低下するため、問題は発生しません。しかし、あくまでも推測です。

于 2008-08-12T08:51:20.990 に答える
1

興味深い問題..リリースモードでコンパイルされていない条件付きコンパイルコードが潜んでいないと確信していますか? すなわち:

#if (DEBUG)
// Debug Code here
#else
// Release Code here
#endif

それは私が本当に考えることができる唯一のことです..このようなことは自分で経験したことがありません..

于 2008-08-12T08:51:52.627 に答える
1

デバッグ シンボルをリリース ビルドに追加し、デバッガーで実行して、クラッシュした場所と理由を確認できますか?

于 2008-08-12T10:12:57.737 に答える
1

ええ、それらのろくでなしのクラッシュは修正するのが最も難しいです。幸いなことに、手動でコードを調べて針を見つけようとする前に、手がかりを得ることができるいくつかの手順があります。

いつクラッシュしますか?テストのたびに?特定のテストで?そのテストは何をし、他の人はしませんか?

エラーは何ですか?アクセス違反の場合、発生するパターンはありますか? アドレスが低い場合は、どこかに初期化されていないポインターがあることを意味している可能性があります。

プログラムはデバッグ構成でクラッシュしますが、デバッガーは接続されていませんか? もしそうなら、John Smithers が指摘したように、スレッド同期の問題である可能性が最も高いです。

Purify などのアナライザーでコードを実行してみましたか? 遅いですが、通常は待つ価値があります。

とにかくリリース構成をデバッグしてみてください。アセンブリのみをダンプしますが、コード ポインターがガベージの途中でジャンプしたり、外部ライブラリのブレークポイントにヒットした場合など、何が起こるかを示すことができます。

Intel アーキテクチャを使用していますか? そうでない場合は、メモリ アライメント エラーに注意してください。一部のアーキテクチャでは警告なしにハード クラッシュが発生します。これらのコーデック アルゴリズムは、過度に最適化されているため、このような状況を頻繁に作成する傾向があります。

于 2008-08-12T13:03:36.223 に答える
0

考慮すべきもう1つのこと:デバッグモードでは、変数はゼロではなく0xCCCCCCCCで初期化されます。それはいくつかの厄介な副作用があるかもしれません。

于 2008-08-12T10:48:18.663 に答える
0

たとえば、Release モードでは非常に重要なコードを無視し、Debug モードでは許可するプリコンパイル ディレクティブが存在しないと確信していますか?

また、エラーをスローしている正確なアセンブリを指摘する可能性のあるログを実装しましたか?

于 2008-08-12T08:48:45.380 に答える
0

クラッシュをより詳細に見ていきます。テスト ケースでクラッシュした場合は、再現性が非常に高いように思えますが、これは通常、ほとんどの課題です。

于 2008-08-12T10:04:14.590 に答える