8

これは私に何度も起こり、幽霊を追いかける多くの失われた時間をもたらしました。通常、非常に難しいタイミング関連のコードをデバッグしているときに、大量のOutputDebugString()呼び出しを追加し始めるので、関連する操作のシーケンスをよく把握できます。問題は、Delphi6IDEはその状況を非常に長い間しか処理できないように見えることです。一般性を避けるために(可能な限り)、今行った具体的な例を使用します。

スレッド間セマフォロックコードとDirectShowタイムスタンプ計算コードのデバッグに数日を費やしました。これは非常に苛立たしい問題を引き起こしていました。考えられるすべてのバグを排除した後も、アプリケーションがオーディオを送信するSkypeに問題がありました。

約10秒後、通話の遠端であるテストに使用していた2台目のPCでSkypeから音声が聞こえるまでの遅延が大きくなり始めました。約20〜30秒で遅延が指数関数的に増加し始め、その時点でコードがトリガーされ、クリティカルセクションが長すぎて保持されていないかどうかを確認します。

幸いなことに、夜遅くはなく、以前にこれを経験したことがあるので、私は執拗にトレースを停止し、OutputDebugString()の大部分をオフにすることにしました。ありがたいことに、それらのほとんどを条件付きコンパイラー定義でラップしていたので、簡単に実行できました。これを実行した瞬間に問題は解消され、コードは正常に機能していることがわかりました。

したがって、OutputDebugstring()トラフィックの量があるしきい値を超えると、Delphi6IDEが実際に停止し始めているように見えます。おそらく、すべてのOutputDebugString()レポートを保持するイベントログデバッガペインに文字列を追加するだけのタスクです。わかりませんが、TMemoまたは同様のコントロールに含まれる文字列が多すぎると、アプリケーションで同様の問題が発生します。

これを防ぐために、あなた方は何をしましたか?メソッド呼び出しを介してイベントログをクリアする方法、または少なくともそのサイズを制限する方法はありますか?また、この状況に対処するために、条件付き定義、IDEプラグインなどを介してどのような手法を使用していますか?

4

4 に答える 4

4

以前、Delphi 2007 で同様の問題が発生しました。IDE でのイベント表示を無効にし、代わりにSysinternalsのDebugViewを使用してください。

于 2011-12-03T19:44:20.707 に答える
2

OutputDebugStringを使用することはほとんどありません。IDEで出力を分析するのは難しく、複数の実行のセットをいくつか保持するには余分な労力が必要です。

私は本当に優れたログコンポーネントスイート(CodeSite、SmartInspect)を好み、通常はさまざまなファイルにログを記録します。たとえば、標準ファイルは、「一般」、「デバッグ」(クライアントのインストールからも収集したい標準のデバッグ情報)、「構成」、「サービス」、「クライアント」です。これらはすべて、番号付きファイルのセットに「オーバーフロー」するように設定されています。これにより、番号付きファイルを増やすだけで、複数の実行のログを保持できます。さまざまな実行からのログ情報を比較することは、その方法で非常に簡単になります。

あなたが説明する状況では、別のログファイルにログを記録するデバッグステートメントを追加します。たとえば、「トレース」。「トレース」を使用可能にするコードは、条件付き定義の間にあります。これにより、オンにするのが非常に簡単になります。

これらの余分なデバッグステートメントを残さないようにするために、ソース管理からチェックアウトせずに「トレース」ログをオンにするように変更する傾向があります。そうすれば、ビルドサーバーのコンパイラは、意図せずに残されたステートメントに対して「識別子が定義されていません」エラーをスローします。これらの余分なステートメントを保持したい場合は、「デバッグ」ログに移動するように変更するか、間に入れます。条件付き定義。

于 2011-12-03T18:41:24.407 に答える
2

私が最初に行うことは、問題があなたが考えていることであることを確認することです. Delphi を使用してから長い時間が経過しているため、IDE の制限についてはよくわかりませんが、同じ数のデバッグ文字列を使用して、時間の経過とともにイベント ログが指数関数的に停止し始めることに少し懐疑的です。 20〜30秒で書かれています。何らかの理由で、書き込まれるデバッグ文字列の数が時間の経過とともに増加している可能性が高いようです。これは、ロギングが無効になっているだけでは明らかではないアプリケーション制御フローのバグを示している可能性があります。

確かに、100 程度のチャンクでデバッグ文字列を書き出すループ内で実行される単純なアプリケーションを作成してみて、各チャンクにかかる時間を記録し始め、時間の経過とともに大幅に増加し始めるかどうかを確認します。 20 ~ 30 秒のタイムスパン。

これが問題であることを確認した場合、またはそうでない場合でも、代わりに何らかの種類のログ ライブラリを使用することをお勧めします。OutputDebugString は、そのような大量のログ ダンプに使用すると、その効果が本当に失われます。出力ウィンドウをリセットまたは制限する方法を見つけたとしても、そのログ データはすべて失われます。

于 2011-12-03T19:02:11.440 に答える
1

IDE フィックスパックには、OutputDebugString のパフォーマンスを改善するための最適化があります。

IDE のデバッグ ログ ビューも最適化されました。デバッガーは、IDE がアイドル状態のときにのみログ ビューを更新するようになりました。これにより、何百もの OutputDebugString メッセージまたはその他のデバッグ メッセージがデバッグ ログ ビューに書き込まれる場合でも、IDE は応答性を維持できます。

これは Delphi 2007 以降でのみ実行されることに注意してください。

于 2011-12-04T22:49:37.750 に答える