4

私は、サードパーティによって部分的に作成された、信頼性の低い(Qt / windows)アプリケーションを使用しています(責任を転嫁しようとしているだけです)。最新バージョンはより安定しています。ある種。クラッシュの報告は少なくなっていますが、ぶら下がっていて二度と戻ってこないという報告がたくさんあります。状況はさまざまで、収集できる情報が少ないため、問題を再現することはできませんでした。

理想的には、アプリケーションがロックされたことを認識し、クラッシュレポートを返送することを提案する、ある種のウォッチドッグを作成したいと思います。いいアイデアですが、問題があります。

  • ウォッチドッグは、プロセスがハングしたことをどのように認識しますか?おそらく、ウォッチドッグに対して定期的に「すべて大丈夫」と言うようにアプリケーションをインストルメントしますが、十分な頻度で発生することが保証されているように、どこに配置すればよいのでしょうか。ロックされています。

  • クラッシュが発生した場合、ウォッチドッグはどのような情報を報告する必要がありますか?WindowsにはまともなデバッグAPIがあるので、すべての興味深いデータにアクセスできると確信していますが、問題を追跡するのに何が役立つかはわかりません。

4

4 に答える 4

5

ミニダンプ(独自のミニダンプ生成コードを追加したくない場合は、DrWatsonを使用してこれらを作成します)とuserdumpを組み合わせて、ハング時にミニダンプの作成をトリガーする必要があります。

ハングを自動的に検出することについてのことは、何かがハングしたときと、それがちょうど遅いか、IO待機によってブロックされたときを判断するのが難しいことです。私は個人的に、ユーザーがアプリがハングしたと思ったときに意図的にアプリをクラッシュできるようにすることを好みます。はるかに簡単であることに加えて(私のアプリは、たとえあったとしても、頻繁にハングする傾向はありません:))、「ソリューションの一部になる」のにも役立ちます。彼らはそれが好きです。

まず、クラッシュダンプとシンボルに関する古典的なバグレイヤーの記事を確認してください。これらの記事には、これらの処理で何が起こっているかに関する優れた情報も含まれています。

次に、ダンプを作成できるuserdumpと、ダンプを生成するように設定する手順を取得します。

ダンプがある場合は、WinDBGで開くと、スレッドとコールスタック、レジスタ、メモリ、関数のパラメータなど、プログラムの状態全体を検査できます。特に「 〜*kp」の使用に興味があると思いますWindbgの「コマンド」ですべてのスレッドのコールスタックを取得し、「!locks」コマンドですべてのロックオブジェクトを表示します。ハングは同期オブジェクトのデッドロックが原因であることがわかります。これは追跡が困難です。すべてのスレッドがWaitForSingleObject呼び出しを待機する傾向があるため、ダウンしますが、コールスタックをさらに下に見て、アプリケーションスレッドを確認します(バックグラウンド通知やネットワークルーチンなどの「フレームワーク」スレッドではありません)。呼び出しが行われていました。アプリにロギングインストルメンテーションを追加して、次に失敗したときに備えて、より多くの情報を提供できるようにする可能性があります。

幸運を。

追伸 クイックグーグルは私にこれを思い出させました:デッドロックのデバッグ。(CDBはwindbgと同等のコマンドラインです)

于 2009-04-16T12:39:16.007 に答える
2

MicrosoftのWindows用デバッグツールのADPlusを使用して、ハングを特定できます。プロセスがハングまたはクラッシュすると、プロセスにアタッチされ、ダンプ(ミニまたはフル)が作成されます。

WinDbgは移植可能であり、インストールする必要はありません(ただし、シンボルを構成する必要があります)。バッチを使用してアプリを起動する特別なインストールを作成できます。これは、アプリの起動後にADPlusも実行します(ADPlusはコマンドラインツールであるため、何らかの方法で組み込む方法を見つけることができるはずです)。

ところで、ハングを内部で認識してプロセスをクラッシュさせることができる場合は、Windowsエラー報告に登録して、クラッシュダンプが送信されるようにすることができます(ユーザーが許可する必要があります)。

于 2009-04-16T12:40:03.787 に答える
1

ウォッチドッギングを行うための別のアプリは、それが解決するよりも多くの問題を引き起こす可能性が高いと思います。代わりに、アプリがクラッシュしたときにミニダンプを生成するハンドラーを最初に作成してから、ウォッチドッグスレッドをアプリケーションに追加することをお勧めします。これにより、アプリがレールから外れると意図的にクラッシュします。ウォッチドッグスレッドの利点は(別のアプリと比較して)、ウォッチドッグがアプリが軌道に乗っていないことを確認しやすくなることです。

MiniDumpsを入手したら、アプリが停止したときの状態を確認するためにざっと見て回ることができます。これにより、問題を理解するための十分な手がかり、または少なくとも次にどこを見ればよいかがわかります。

CodeProjectには、 MiniDumpsに関する情報がいくつかあります。これは、便利な例になる可能性があります。MSDNには、それらに関する詳細情報もあります。

于 2009-04-16T12:26:28.003 に答える
1

ウォッチドッグを気にしないでください。MicrosoftのWindowsエラー再現(winqual.microsoft.com)を購読します。彼らはあなたのためにスタックトレースを収集します。実際、彼らは今日すでにそうしている可能性が非常に高いです。あなたがサインアップするまで、彼らはそれらを共有しません。

于 2009-04-16T12:56:02.423 に答える