質問

Visual Studio 2005を使用して構築されたネイティブC ++ Win32 .exeがあり、(XP 32ビット、Vista 32ビット、Windows 7 64ビット)で社内でテストしたすべてのマシンで完璧に機能します。しかし、もちろん、クライアントの32ビットビスタマシンで繰り返しクラッシュします。

いくつかのWebサイトで掘り下げて、PDBファイルを出荷するかどうかを示すTidbitsを見つけました(vc80.pdb& ProjectName.pdb)顧客への実行可能ファイルのリリースビルドとともに、クラッシュが発生したときにミニダンプを生成する方法があります。その後、クラッシュダンプをVisual Studioにロードして、スタックトレースやその他の有用な情報を取得できます。 MicrosoftのDr. Watson Utilityもこのプロセスに関与しているようです。

しかし、これを実現するために従うための手順に明確な指示が見つかりません

  • 出荷するファイルは何ですか?
  • クラッシュダンプを生成する方法は?
  • そして、これをVSにロードする方法は?

誰かがこのプロセスを説明してもらえますか?

役に立ちましたか?

解決

リリースからクラッシュダンプを取得することができ、フィールドにビルドアウトされており、PDBファイルを製品で出荷する必要はありません。

MinidumpWritedump()を使用して、トップレベルの例外ハンドラーでクラッシュダンプファイルを作成するためのコールを作成します。しかし、それがなくても、ここで述べたように私が信じているタスクマネージャーを使用して、クラッシュのポイントでユーザーにクラッシュファイルを生成させることができます。 ダンプファイルを作成するためのMSDN手順.

ダンプファイルを手に入れると、顧客はそれを郵送して郵送し、Visual Studioにドロップします。 VS内で、デバッグミックスまたはデバッグネイティブを選択すると、PDBのローカルコピーを使用してコールスタックなどを表示します。

Example from a dump I just created from a MS process

他のヒント

あなたが持つべきプロセスは次のようになります:

  1. 実行可能ファイルをコンパイルし、PDBファイルを生成します。実行可能ファイルに使用されるコードに変更を加えないか、バックアップを保持しないようにしてください。
  2. 実行可能ファイルをクライアントに出荷します。 PDBファイルを出荷する必要はありません。出荷する唯一の理由は、クライアントのマシンでデバッグしたい場合、またはプロセスエクスプローラーなどのツールを使用して、ある時点で関数名でスタックトレースを取得する場合です。どちらもあなたの場合には適用できないようです。
  3. XP/2003マシンの場合は、DRWTSN32を使用してクラッシュダンプの作成を構成します。 Vista/7/2008の場合、drwtsn32が廃止され、構成する必要があります 代わりに. 。別のオプションが使用されています adplus アプリを起動するには。
  4. クラッシュが発生したら、ダンプを返信し、Visual Studioにロードします。スムーズにデバッグするには、まったく同じコード、実行可能ファイル、PDBを手元に用意する必要があります。

ノート:

  • WindBGは、生産環境でのデバッグに役立ちます。それは非常に強力なデバッガーであり、ポータブルですが、VSに慣れている場合は、より快適に使用できます。
  • Minidumpを作成すると、スタックトレースといくつかの変数値が表示されます。フルダンプを作成すると、すべての変数を含む完全なヒープとはるかに大きなダンプファイルが得られます。転送が問題でない場合は、フルダンプを使用します。
  • もし、あんたが Microsoftに登録します, 、プログラムがクライアントサイトでクラッシュするときに作成されたダンプにアクセスできます。それは迷惑な「情報をマイクロソフトに送る?」ダンプをMSに送信するプロセスがクラッシュすると、ウィンドウが表示され、アクセスできます...

あなたの痛みが分かります。少し前にそれをしなければなりませんでした。

とにかく、Google BreakPadを試しましたか?

BreakPadは、コンパイラが提供するデバッグ情報を削除し、コンパクトな「Minidump」ファイルでクラッシュを記録し、サーバーに送り返し、これらのMinidumpsからCおよびC ++スタックトレースを生成して、コンパイラが提供するデバッグ情報を使用してユーザーにアプリケーションを配布できるライブラリおよびツールスイートです。 。 BreakPadは、クラッシュしていないプログラムのリクエストに応じてMinidumpsを作成することもできます。

BreakPadは現在、Google Chrome、Firefox、Google Picasa、Camino、Google Earth、およびその他のプロジェクトで使用されています

ここで見つけることができます: http://code.google.com/p/google-breakpad/

それは他の答えが言及されているのと同じことをしますが、それは自動的にそれを行います、あなたに多くの時間と努力を救います

私はしばらく前にこれをしました、そして私はフォローしたと思います このガイド. 。うまくいかない場合は、WindBGユーティリティをチェックしてください。USBスティックからでも、コピーして実行する必要がないことを思い出します

私はDDJに死後のデバッグについて2つの記事を書きました。それはあなたに役立つかもしれません。

死後のデバッグhttp://drdobbs.com/tools/185300443

および死後のデバッグの再訪http://drdobbs.com/architecture-and-design/227900186

2番目の記事には、MAPまたはPDBファイルから取得されたシンボリック情報を使用して、クライアントマシンからスタックダンプを入力するソースコードが含まれています。

クライアントがVista SP1以降を使用している場合、アプリケーションがクラッシュするたびにローカルダンプファイルを生成するようにシステムを構成できます。で完全なドキュメントを見つけることができます MSDNサイト.

すべてのPDBをプライベートに保つことができます。これらは、ダンプファイルを実際に分析する場合にのみ必要です。出荷する製品のバージョンに対応するPDBを追跡したい場合は、シンボルサーバーの使用を強く検討する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top