2

私の C++ MFC アプリケーションの 1 つが、一部の Windows (7、XP) コンピュータでランダムにクラッシュします。このアプリケーションはいくつかのサード パーティ ライブラリ (Apache 軸) を使用しており、依存関係ウォーカーで確認すると、このサード パーティ ライブラリに関連する DLL をロードした後にアプリケーションの終了が表示されます。

したがって、このアプリケーションのクラッシュの原因を検出する方法が必要です。これを行う方法はありますか?

  • .pdbファイルをホストしてクラッシュの問題を特定するファイルを使用できることを読みました.exeが、いつものように Microsoft には使用方法に関する明確なドキュメントがありません。
  • IBM purify試用版を使ってみました。しかし、有効な情報は表示されません。
  • 使ってみましたWinDbg。しかし、私はそれを使用する方法を見つけることができませんでした。

どんなアシストも本当に感謝しています。

編集:クラッシュレポートが追加されました

Problem Event Name:                        APPCRASH
  Application Name:                             installer.exe
  Application Version:                           5.0.1.0
  Application Timestamp:                     51ac0bdc
  Fault Module Name:                          AxisXMLParserXerces.dll
  Fault Module Version:                        1.0.0.0
  Fault Module Timestamp:                  51ac0016
  Exception Code:                                  c0000005
  Exception Offset:                                0000161d
  OS Version:                                          6.1.7601.2.1.0.256.4
  Locale ID:                                             18441
  Additional Information 1:                  0a9e
  Additional Information 2:                  0a9e372d3b4ad19135b953a78882e789
  Additional Information 3:                  0a9e
Additional Information 4:  0a9e372d3b4ad19135b953a78882e789`
4

3 に答える 3

5

以下は、問題の原因を特定するために実行できるいくつかの手順です。

  1. アプリケーションのリリース バージョンをビルドします。PDB ファイルの生成が有効になっていることを確認します。
  2. クライアントに送信します。「ソリューションの確認」設定を変更していることを確認してください (以下を参照)。
  3. クラッシュした場合は、[プログラムの詳細を表示] を選択する必要があります。
  4. 「障害モジュール名」、「障害実行コード」、「障害実行オフセット」を記録してもらいます。
  5. 送信したのとまったく同じバージョンを開始します。実行可能ファイルと PDB ファイルは、ビルド時に最初に保存されたディレクトリにある必要があります。(例: ソリューション\プロジェクト\リリース)。ファイルを送信する前に、"Release" ディレクトリ全体を圧縮してどこかに隠しておくことをお勧めします。このようにして、ファイルを変更するクリーンまたはその他の操作を誤って実行した場合に備えて、正確なコピーを取得できます。
  6. Visual Studio で、デバッガーを使用してプロセスにアタッチします。(「デバッグ」メニュー内)
  7. アプリケーションの実行を中断します。(繰り返しますが、「デバッグ」メニューにあります)
  8. 分解ウィンドウを開きます。(もう一度、「デバッグ」メニューで)
  9. 逆アセンブリ ウィンドウの上部にある [アドレス] 入力行に、モジュールの現在のロード アドレスと、クラッシュ レポートによって提供される [実行オフセット] に基づいて、クラッシュのアドレスを入力します。モジュールがロードされていない場合は、起動時に強制的にロードするようにアプリケーションを変更する必要があります (これには、新しいバージョンを送信して手順 1 からやり直す必要があります)。クラッシュは DLL ロードの失敗の結果である可能性があるため、エラーを確認してください。

ここからは、アプリケーションとサード パーティのライブラリに関する知識と経験に基づいて、それを実行する必要があります。クラッシュが発生すると予想される場所にブレークポイントを配置します。ブレークポイントにヒットしたときはいつでも、コール スタックを見て、コールの発信元を確認します。問題は、コードまたはサード パーティのライブラリ (おそらくコード) にある可能性があります。

クラッシュを再現するように努力する必要があります。クラッシュが発生したときに実行していたアクションをユーザーに記録してもらいます。また、アプリケーションまたはライブラリが生成するログも含めてください。

これにより、問題を特定する可能性が高くなりますが、上で述べたように、アプリケーションとライブラリに関する知識に頼る必要があります。

開始する前に、アプリケーションにコードを追加して強制的にクラッシュさせ、これらの手順を自分で実行して、慣れておくことをお勧めします。正しく理解できるようになるまでに数回の試行が必要な場合があり、手順を少し調整して、環境とアプリケーションに合わせて調整する必要がある場合があります。ユーザーに送信する前に、必ずクラッシュ コードを削除してください。

これは、デバッガーを使用する最初の露出のように思われるため、フラストレーションの準備をしてください。それは正常です。

*これらの手順の一部は、Visual Studio を使用していることを前提としています。WinDbg のインターフェイスは異なりますが、概念は同じです。

**これらの手順は、Windows 7 も想定しています。Windows XP では、アプリケーションがクラッシュしたときに同様の情報を含むウィンドウが表示され、再構成する必要はありません。

. .
.

ソリューション設定のチェックの変更

  1. コントロールパネルを開く
  2. アクション センターを開く
  3. 「アクションセンター設定の変更」をクリック
  4. 「問題報告設定」をクリック
  5. 「問題が発生するたびに、解決策を確認する前に確認する」を選択します。
于 2013-05-31T06:04:04.233 に答える
0

CrashRptは、MFC アプリケーションに使用する優れたオープン ソース ツールです。ユーザーは、クラッシュが発生した後に CrashSender ウィンドウを表示でき、MS Visual Studio で開くことができるミニダンプ ファイルを含むクラッシュ レポートを送信できます。もちろん、VS でクラッシュ ダンプを実行しているときに正しいコール スタックを取得するには、特定のビルドのバイナリと対応する .pdb ファイルを保持する必要があります。

サードパーティのソフトウェアでもいくつかのクラッシュが発生します。このような場合は、お客様に通知することができます。

于 2015-10-06T11:41:31.967 に答える
0

この正確な状況を処理するために設計されたツールであるAQtraceのコピーを取得することを検討できます。WinTask などの自動化ツールを使用してクライアントを設定し、最初に問題を引き起こすために使用している手順をキャプチャすることも検討できます。これにより、その再現と排除が大幅に簡素化されます。

于 2013-05-31T06:15:49.460 に答える