2009-04-16 10 views
4

私は部分的に信頼性の低い(Qt/windows)アプリケーションを使用しています。彼らの最新バージョンはより安定しています。並べ替えクラッシュの報告は少なくなっていますが、ぶら下がって戻ってこないという報告がたくさんあります。状況は様々で、私たちが集めることのできる情報はほとんどないため、問題を再現することはできませんでした。私のアプリケーションが顧客のマシンにロックアップしたときのクラッシュレポートのウォッチドッグ

理想的には、ウォッチドッグを作成して、アプリケーションがロックされていることに気づき、クラッシュレポートを返すようにしたいと考えています。いい考えですが、問題があります:

  • プロセスがハングアップしていることをウォッチドッグはどのように知っていますか?おそらく、我々はアプリケーションを定期的にウォッチドッグに「すべてOK」と言いますが、十分に頻繁に起こるようなものはどこに置くのでしょうか?しかし、アプリケーションが終了するコードパス上にある可能性は低いロックされた

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

答えて

5

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

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

まず、クラッシュダンプとシンボルに関する古典bugslayer articleをチェックしてください。また、これらのことで起こっていることに関する優れた情報もあります。

第二には、ダンプ

あなたはダンプを持っている場合は、WinDBGの中でそれを開き、あなたがプログラム全体を検査することができますを生成し、それを設定するため、あなたがダンプを作成することができますuserdump、およびinstructionsを取得します状態 - スレッドやコールスタック、レジスタ、メモリ、およびパラメータを関数に含めるWindbgで "~*kp"コマンドを使用してすべてのスレッドの呼び出しスタックを取得し、すべてのロックオブジェクトを表示する "!locks"コマンドを使用することに特に興味があると思います。私はハングが同期オブジェクトのデッドロックに起因することに気づくでしょう。すべてのスレッドがWaitForSingleObject呼び出しで待機する傾向にあるため追跡が難しくなりますが、コールスタックをさらに見てアプリケーションスレッドを表示しますバックグラウンド通知やネットワークルーチンなどの「フレームワーク」スレッドよりも)。それらを絞り込んだら、どのような呼び出しが行われているかを知ることができます。おそらく、アプリケーションにいくつかのログ機能を追加して、次回の失敗時に備えてより多くの情報を提供します。

幸運。

ps。クイックグーグルは私にこれを思い出させた:Debugging deadlocks。 (CDBはwindbgに相当するコマンドラインです)

1

ウォッチドッグを行う別のアプリが解決するよりも多くの問題を引き起こす可能性が高いと思います。代わりに、アプリケーションがクラッシュしたときにミニダンプを生成するハンドラを作成してから、ウォッチドッグスレッドをアプリケーションに追加することをお勧めします。アプリがレールから外れてしまうとクラッシュする可能性があります。ウォッチドッグスレッドのメリット(別のアプリケーションと比較して)は、ウォッチドッグがアプリがレールから外れていることを確実に知ることがより簡単にできることです。

ミニダンプを取得したら、アプリが死んだときにアプリの状態を知ることができます。これは、問題を把握するのに十分な手がかりを与えてくれるでしょう。

CodeProjectには約MiniDumpsのものがありますが、これが役に立つ例です。 MSDNにも同様の情報があります。

+0

ミニダンプを作成するためにアプリをクラッシュさせる必要はありません。いつでもMiniDumpWriteDump()を呼び出すことができます。 –

2

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

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

ところで、ハングを内部的に認識してプロセスをクラッシュさせる方法が見つかった場合は、Windows Error Reportingに登録して、クラッシュダンプが送信されるようにします(ユーザーが許可した場合)。

1

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

関連する問題