ミニダンプと一致するモジュール

簡単な紹介

アプリケーションをデバッグする場合、デバッガ必須シンボルは、意味のあるコールスタック、電流源線、タグ値を表示することができるように実行可能モジュールをロードされます。あなたは別のシステムで作成された小型ダンプをチューニングしている場合、あなたはすでにシンボルに加えて、デバッガはまた、ダンプを作成アプリケーションモジュールによってロードされているのと同じバージョンにアクセスする必要があることを知っています。デバッガは、モジュール(すなわち、マッチングモジュール)の全く同じバージョンを見つけることができない場合、モジュールはひどく成功した試運転の可能性を制限し、ロードされたシンボル、することができません。この記事では、我々は、VS.NETのWinDbgデバッガを議論し、マッチング規則モジュールを識別して検索するために使用されます。私たちは、どこマッチングモジュールを見つけるにデバッガを伝えるためにどのように表示されます。我々はまた、状況がマッチングモジュールを見つけることができない議論し、解決策を見つけようとします。

マッチングモジュール

どのようにデバッガモジュールが一致するかどうかを決定しますか?彼らはどのようにモジュールの必要性のどのバージョンを知っていますか?ミニダンプの内部で見てみましょう。各モジュールはロードされたミニダンプダンププロセスのリストが含まれています。このリストは小さなダンプモジュール構造(例えば、文書DbgHelp)のアレイとして記憶されます。次のようにこの構造体は宣言されています。

typedefは構造体_MINIDUMP_MODULE {
    ULONG64 BaseOfImage;
    ULONG32 SizeOfImage;
    ULONG32チェックサム;
    ULONG32 TimeDateStamp;
    RVA ModuleNameRva;
    VS_FIXEDFILEINFOのVersionInfo;
    MINIDUMP_LOCATION_DESCRIPTOR CvRecord;
    MINIDUMP_LOCATION_DESCRIPTOR MiscRecord;
    ULONG64 Reserved0;                          // 将来の使用のために予約。
    ULONG64 Reserved1;                          // 将来の使用のために予約。
} MINIDUMP_MODULE、* PMINIDUMP_MODULE。

以下の表は、構造体のメンバについて説明します。

メンバー 説明
BaseOfImage メモリ内のモジュールのベースアドレス。
SizeOfImage (バイト単位)モジュールのサイズは、モジュールのオプションヘッダ(IMAGE_OPTIONAL_HEADER.SizeOfImage)に格納された値に等しいです。
チェックサム モジュールのチェックサムは、モジュールのオプションヘッダ(IMAGE_OPTIONAL_HEADER.CheckSum)に格納された値に等しいです。モジュールは/リリースオプションでリンクされていない限り、この値は、0することができます。
TimeDateStamp モジュールの時刻/日付スタンプ、モジュールのファイルヘッダ(IMAGE_FILE_HEADER.TimeDateStamp)の値に等しいです。
ModuleNameRva これは、モジュールのファイル名(およびパス)が含まれMINIDUMP_STRING構造の(ミニダンプの先頭からの)相対アドレスです。
VersionInfo この構造は、(ファイルバージョンと製品版を含む)モジュールのバージョン情報を含みます。この構造体の内容の詳細については、プラットフォームSDKのドキュメントに記載されています。
CvRecord これは、いわゆるデバッグ・レコードを含む構造です。あなたは、その内容の詳細については見つけることができますこの記事を(CV_INFO_PDB20とCV_INFO_PDB70構造を参照してください)。この構造は、モジュールのデバッグ情報が.PDBファイルに格納されている場合にのみ存在しています。
MiscRecord この構造はまた、デバッグレコードが含まれていますが、別の形式(IMAGE_DEBUG_MISC)インチ この構造は、モジュールのデバッグ情報が.DBGファイルに格納されている場合にのみ存在しています。

あなたはモジュール情報ミニダンプを表示したい場合は、ミニダンプビューツールを使用することができます。たとえば、以下の情報がkernel32.dllのモジュールです。

モジュール:C:\ WINNT \ SYSTEM32 \ KERNEL32.DLL
住所:7c4e0000
サイズ:000b9000
チェックサム:000bdbb3
TimeDateStamp:3ef274dc
ファイルのバージョン:5.0.2195.6688
製品バージョン:5.0.2195.6688 
MISCレコード:利用可能

私たちが見てきたように、ミニダンプは、非常に正確な識別モジュールを可能にします。我々は、モジュールのファイルと製品バージョン、ファイルシステム内のその位置を決定することができ、情報ファイルをデバッグの負荷に一致するのに十分な情報があります。しかし、デバッガは、実際にモジュールが行う特定するために、このすべての情報を使用できますか?その結果、彼らはしないでください。VS.NETのデバッガは、モジュール一致するかどうかをチェックするためにのみ、以下のデータを使用しています:

  • ファイル名(MINIDUMP_MODULE.ModuleNameRva)
  • モジュールサイズ(MINIDUMP_MODULE.SizeOfImage)
  • モジュールのタイムスタンプ(MINIDUMP_MODULE.TimeDateStamp)

それはモジュールのチェックサムを使用しているためのWinDbgは、より正確です。以下は、モジュールのWinDbg一致するかどうかを確認するために使用されるデータのリストです。

  • ファイル名(MINIDUMP_MODULE.ModuleNameRva)
  • モジュールサイズ(MINIDUMP_MODULE.SizeOfImage)
  • モジュールのタイムスタンプ(MINIDUMP_MODULE.TimeDateStamp)
  • モジュールのチェックサム(MINIDUMP_MODULE.CheckSum)

興味深いことに、バージョン情報(MINIDUMP_module.VersionInfo)モジュールは、単純に考慮されません。

モジュールの検索パス

VS.NETのデバッガ

マッチングモジュールを見つけるために、デバッガ?彼らは、ディレクトリの事前定義されたセットを検索します。ここでは、モジュール検索パスのVS.NETのデバッガを記録しました。これは、デバッガが二つの最も重要な位置を検討することは注目に値します。

  • 最小メモリダンプディレクトリ(およびそのサブディレクトリ)
  • ダンプモジュールシステム上のディレクトリを作成します。

我々は、検索モジュール別のディレクトリを指定したい場合は、我々はこれを行うことができます。レジストリおよびプロジェクト設定で- 2つの方法があります。次のレジストリ設定は、指定されたシステム全体のディレクトリ内で使用することができます。マイクロソフトではHKLM \ SOFTWARE \ \ VisualStudioを\ xxx.xxx \ NativeDE \ダンプGlobalModPath = REG_SZこの設定は、セミコロンで区切られたディレクトリのリストを含めることができます。同様の設定モジュールは、ユーザーが検索パスを指定することができます。

:「プロジェクトの設定」で、我々は次のように設定入力したディレクトリの一覧を表示する必要が|構成プロパティ|デバッグ|コマンドの引数プロジェクトプロパティを。プレフィックスのディレクトリリストは、「= MODPATH」でなければなりません。:例えば= C内のすべてMODPATH:\モジュール\でTestApp; D:\ binに\でTestApp。下記に示すように、

 

 あなたは両方の方法を使用している場合は、モジュール検索パス(レジストリ項目や設定)を指定し、検索パス生成モジュールは、これらの2つの方法を組み合わせたものです。最初のチェック、プロジェクトの設定ディレクトリ。

WinDbgの

WinDbgを、コマンド-.exepath -iコマンドラインオプションと_NT_EXECUTABLE_IMAGE_PATH環境変数をモジュール検索パスを指定するために、より自然な方法。私は、デフォルトではどのようなパスWinDbgを覚えていませんが、簡単に次のコマンドで確認できた場合:

!SYM騒々しいです
.reload / F yourmodule.dl

我々はモジュールと一致しない場合、どのようにしますか?

あなたが構築し、すべてのモジュールを安全な場所に保管されていることを確認し、これらのモジュールをデバッグする必要があるためには、ときにクラッシュダンプを見つけることは難しいことではありません。しかし、システムはそれをdllを?どのように我々は、クライアントシステムのdllにインストールされたシステムの同じバージョンを確認することを確認していますか?特に、のようなホットフィックス何かを考えますか?

最も簡単な方法は、(あなたがMiniDumpWithFullMemory機能を使用する場合、MiniDumpWithFullMemoryメモリオプション、使用NTSDデバッガ「の.dump / MA」を使用し、ミニダンプを生成するために、完全なメモリの内容を使用するか、または『クラッシュダンプの種類』のワトソンの設定を確認することですこの設定はWindowsXPのみに存在した後、古いシステムは常に)、フルクラッシュダンプを生成します。ミニダンプのメモリモジュールの完全な内容ならば、理論的には、デバッガは他の場所でマッチングモジュールを探す必要はありません。実際には、それだけで唯一の小さなダンプのロード・モジュールから時々小さなダンプにWinDbgの内容.NETデバッガモジュールを使用することができるようですが、ディスクからロードされるほとんどの場合、それがそうすることを拒否し、マッチングモジュールを主張します(モジュールは、一致を見つけることができない場合は、ロード・シンボルを拒否)。

もちろん、メモリのミニダンプの内容と完全には重大な欠点を持っている-彼らは巨大です。私たちは、ミニダンプ開発者にクライアントからのデータの独自の輸送多くのメガバイトを買う余裕ができない場合、私たちはより良いオプションを探している必要があります。幸いなことに、Windows XPおよびWindows Server 2003オペレーティングシステムは、簡単な解決策がある-彼らはそれらをダウンロードすることができ、サーバー上で利用可能なモジュールのシンボルと同様に、(シンボルサーバーをサポートしている)シンボリックデバッガです。どのように我々は、シンボルサーバーからモジュールをダウンロードするようにデバッガを設定する必要がありますか?パスのシンボルサーバーは、環境変数_NT_SYMBOL_PATHで指定された、または.sympath / .symfixコマンドが指定されている場合は、追加のステップがWinDbgのではありません。VS.NETのデバッガは、モジュールのダウンロードを設定_NT_SYMBOL_PATHまたはシンボルパスを使用することはできません。代わりに、我々は、レジストリまたはプロジェクト固有のモジュール検索パスの設定を使用する必要があります。それが可能(作業)コマンドパラメータであるが、|シンボルサーバーのMODPATH設定のパスを指定しますが、私は、システム全体のレジストリ設定を使用すると、より便利であることがわかった:マイクロソフトでHKLM \ SOFTWARE \ \ VisualStudioを\ xxx.xxx \ NativeDE \ダンプGlobalModPath = "SRV * C:\記号* HTTP://msdl.microsoft.com/download/symbols"

アップグレードsymsrv.dll - 信頼性の高いダウンロードVS.NETモジュールを確実にするためのステップを繰り返すことをお勧めします。この記号は、最新バージョンでは、Windows用の小さなDLLのデバッグツールによって得ることができる、サーバへのアクセスを担当しています。私たちは、インストールディレクトリからコピーする必要があるDLLの古いバージョンを上書きし、<VSInstallDir> \ Common7 \ IDEディレクトリにデバッグツールsymsrv.dll。

残念ながら、古いオペレーティングシステム(Windows 2000およびそれ以前の)システムDLLのシンボルがサーバー上にありません。この場合、デバッガはほとんど無力であると思われます。でも、シンボルサーバー上のシステムDLLのシンボル場合、彼らはマッチングモジュールを見つけることができないので、デバッガはまた、それらをダウンロードすることはできません。WinDbgのは、パス上の任意の不一致.DBGと.PDBシンボルファイルを見つけることによって、少しの助けを提供していますが、どのような場合には多くの助けではありません。VS.NETのデバッガでもそれを行うことはできません。

モジュラー

幸いなことに、情報がシンボルからシンボルをダウンロードするには、デバッガサーバーを可能にするモジュールを生成し、手動でダンプする通常十分に小さいです、モジュールでも、実際の試合を見つけることができません。

おすすめ

転載: www.cnblogs.com/yilang/p/11896526.html