4

私は自分のプログラムで深刻な問題に直面しています。それは顧客の場所でしか再現されません。サードパーティのdllで障害が発生しているとは思えないので、ログを記録しても役に立ちません。なんらかの理由で、図書館の提供者から助けを得ることができませんでした。オフラインで分析できるように、障害発生時にダンプを作成することを考えています。これは推奨される方法ですか?または他の選択肢はありますか?

4

5 に答える 5

5

はい、これはすべてのプログラムが持つべきものであり、可能な限り頻繁に利用する必要があります。

サードパーティのライブラリは使用しないことをお勧めします。代わりに、独自のダンプを作成してください。とてもシンプルで簡単です。基本的に次のことを行う必要があります。

プログラムはdbghelp.dllにアクセスする必要があります。これは、人間が読める形式のコールスタックなどを作成できるWindows dllです。デバッガーはこのdllを使用して、プロセス内のデータを表示します。また、事後デバッグ、つまりある種のダンプも処理します。このdllは、ソフトウェアとともに安全に配布できます。Windows用のデバッグツールをダウンロードしてインストールすることをお勧めします。これにより、あらゆる種類のツールにアクセスできるようになり、最高のツールWinDbg.exeと最新のdbghelp.dllもそのディストリビューションに含まれています。

dbghelp.dllでは、たとえばMiniDumpWriteDump()を呼び出します。これにより、ダンプファイルが作成され、多かれ少なかれそれが作成されます。完了です。そのファイルを手に入れたらすぐに使い始めることができます。Visual Studio Debugger(おそらく.dmpファイル拡張子に関連付けられている可能性もあります)またはWinDbgのいずれかです。

さて、あなたがそれにいる間、考えるべきことがいくつかあります。このようなダンプファイルをチェックする場合、実行可能ファイルをコンパイルしてリンクするときに.pdbファイルを生成する必要があります。そうしないと、ダンプデータを人間が読める形式のデータにマッピングする可能性がありません。たとえば、適切なコールスタックや変数の値を取得する場合などです。これは、これらの.pdbファイルを保存する必要があることも意味します。それらをまさにそのリリースと正確に一致させることができる必要があります。ダンプファイルには実行可能ファイルの日付スタンプが付けられているため、デバッガーには正確なpdbファイルが必要です。コードが1ビット変更されていないかどうかは関係ありません。.pdbファイルが別のコンパイルセッションに属している場合は、乾杯します。

すべてのWindowsWin32開発者に、OlegStarodumovのサイトDebugInfo.comをチェックすることをお勧めします。多くのサンプルとチュートリアル、およびダンプファイルの生成を構成および調整する方法が含まれています。もちろん、特定のデータを除外したり、ダンプに添付するカスタムデバッグメッセージを作成したりする方法は無数にあります。

ミニダンプには、例外時のアプリケーションの状態に関する非常に限られた情報が含まれることに注意してください。トレードオフは小さなファイルです(設定に応じて約50〜100 kB)。ただし、必要に応じて、アプリケーション全体の状態、つまりグローバルオブジェクトやカーネルオブジェクトを含む完全なダンプを作成できます。これらのファイルは巨大になる可能性があり、極端な場合にのみ使用する必要があります。

法的な側面がある場合は、顧客があなたのしていることを認識していることを確認してください。私はあなたがビジネスの秘密や他の法的側面を明らかにすることになっていないいくつかの契約をすでに持っているに違いありません。顧客から不満がある場合は、バグを見つけることがいかに重要であるか、そしてこれによりソフトウェアの品質が大幅に向上することを顧客に納得させてください。何も犠牲にせずに多かれ少なかれより高い品質。それが彼らに何の費用もかからないのであれば、それも良い議論です:)

最後に、クラッシュダンプ分析について詳しく知りたい場合は、もう1つの優れたサイトがあります:dumpanalysis.org

お役に立てれば。もっと説明してほしい場合はコメントしてください。

乾杯 !

編集:

MiniDumpWriteDump()には、MINIDUMP-EXCEPTION-INFORMATION(アンダースコア付き)構造体へのポインターが必要であることを追加したかっただけです。ただし、GetExceptionInformation()マクロは、例外ハンドラー(構造化例外処理またはSEH)での例外時にこれを提供します。

__try {

}
__except (YourHandlerFunction(GetExceptionInformation())) {

}

YourHandlerFunction()は、ミニダンプ(または呼び出しチェーンの下流にある他の関数)の生成を処理する関数になります。また、プログラムにカスタムエラーがある場合、たとえば、発生してはならないが技術的には例外ではない何かが発生した場合は、RaiseException()を使用して独自のエラーを作成できます。

GetExceptionInformation()は、このコンテキストでのみ使用でき、プログラムの実行中は他の場所では使用できません。

于 2009-05-23T09:25:22.873 に答える
4

クラッシュダンプは非常に一般的なトラブルシューティング方法であり、特に顧客のサイトでのみ再現される問題に対して非常に効果的です。

顧客/クライアントがあなたがしていることを理解し、あなたが許可を得ていることを確認してください。クラッシュダンプには、顧客がドアから出たり、ネットワークを介して出たりすることを望まない(または許可されない)機密情報が含まれている可能性があります。

于 2009-05-23T05:40:05.187 に答える
1

それよりも、クラッシュ データをアップロードするライブラリがあることをお勧めします。

BugDumpBugSplat

そして、Microsoft の方法があります。

http://msdn.microsoft.com/en-us/library/aa936273.aspx

于 2009-05-23T06:10:19.990 に答える
0

免責事項: 私は弁護士ではありません。

ログとクラッシュ ダンプに含めることができるデータは、作業しているドメインによっても異なります。たとえば、医療機器や患者情報システムには、多くの場合、患者に関する機密データが含まれており、許可されていない人には見えないようにする必要があります。

HIPAA プライバシー規則は、「対象となるエンティティ」が保持する特定の情報の使用と開示を規制します (...) 保護された医療情報 (PHI) の使用と開示に関する規則を確立します。PHI は、健康状態、医療の提供、または個人に関連付けることができる医療の支払いに関する、対象となるエンティティによって保持される任意の情報です。[10] これはかなり広く解釈され、個人の医療記録または支払い履歴のあらゆる部分が含まれます。--ウィキペディア

健康情報を個人に関連付けることはできません。クラッシュ ダンプとログは、匿名化して機密情報を削除するか、まったく送信しないようにする必要があります。

これは特定のケースには当てはまらない可能性があるため、これは一般的な注意事項です。軍事や金融など、機密情報を扱う他のドメインにも当てはまると思います。

于 2009-05-23T06:44:28.233 に答える
0

基本的に、ダンプファイルを生成する最も簡単な方法は、adplus を使用することです。コードを変更する必要はありません。

上記の記事で説明したように、Adplus は Windows 用のデバッグ ツールの一部です。Adplus は基本的に、windbg の巨大な vbscript 自動化です。

adplusを使用するために必要なこと:

  1. Windows 用のデバッグ ツールを c:\debuggers にダウンロードしてインストールします。
  2. アプリケーションを開始する
  3. コマンドラインを開き、c:\debuggers に移動します
  4. この行「adplus -crash your_exe.exe」を実行します
  5. クラッシュを再現

必要なすべての情報を含むミニダンプが得られます。お気に入りのデバッガーでクラッシュ ダンプを開くことができます。Windbg では、コマンド「analyze -v」は、顧客のサイトでのみ発生し、社内で再現できなかったすべてのクラッシュの少なくとも 40% で役立ちました。

于 2009-05-26T15:29:36.070 に答える