3

ターゲットのアプリケーションクラッシュからのmindmpファイルがあります。あるバージョンのソフトウェア用にdll/pdbファイルを再構築し、windbgにシンボルを正しくロードさせることは可能ですか?

私の問題は、pdbファイルがメジャーリリースでのみ保持されることです(残念ながら)。これはデイリービルドであり、自分で再構築できますが、エラーが発生します。

!sym noisyがオンの場合:「画像ヘッダーがメモリ画像ヘッダーと一致しません。」

DBGENG:  C:\...\XXX.dll image header does not match memory image header.
DBGENG:  XXX.dll - Partial symbol image load missing image info
DBGHELP: Module is not fully loaded into memory.
DBGHELP: Searching for symbols using debugger-provided data.
DBGHELP: C:\...\XXX.pdb - mismatched pdb

dllを使用してpdbをビルドしたことに注意してください。これらは、同じRELEASEディレクトリからのものです(デバッグをビルドする必要がありますか?)

これらはリリースビルドです(リリースビルドがターゲットにインストールされてクラッシュするため)、どういうわけかデバッグビルドdllを使用してより多くのシンボル情報を取得する必要がありますか?

4

5 に答える 5

11

ChkMatchユーティリティは、まさにこのシナリオ向けに設計されています。元の .EXE がある限り、ソースを (同じコンパイラとコンパイラ設定で) 再コンパイルし、古い .EXE と一致するように新しい .PDB にパッチを適用できます。

この例では、OriginalExecutable.exeは .PDB ファイルがなくなった実行可能ファイルであり、RebuiltPDB.pdbは元のソースを再構築して生成されたものです。

chkmatch -m OriginalExecutable.exe RebuiltPDB.pdb

ここで、2 つのファイルが元の名前である限り、デバッガーはそれらを一致するペアとして受け入れる必要があります。

于 2008-10-02T03:47:42.300 に答える
8

私の経験ではおそらくそうではありません。

正確なビルドディレクトリがあり、まったく同じコンパイラ設定でビルドする場合、これは機能する可能性があります。リリースクラッシュダンプに対してデバッグビルドからシンボルをロードすることは間違いなくできません。

windbgにタイムスタンプの違いを無視させるには、「何でもロード」オプションをオンにする必要があります:.symopt+0x40。

于 2008-09-25T18:05:06.943 に答える
2

イメージがコンパイルされた正確なソース コードがまだある場合は、それを再構築して新しい pdb ファイルを生成し、クラッシュ ダンプを開くときにこの pdb を強制的にロードするように WinDbg に指示します。

于 2008-10-24T12:31:25.903 に答える
1

PDB ファイルは、GUID と「年齢」(シーケンス番号) によって EXE ファイルに関連付けられています。これらはEXEとPDBに埋め込まれています。GUID はビルドが完了するたびに再生成され、「年齢」は増分ビルドごとに変更されます。

デバッガーはこれらを使用して、EXE ファイルの正しい PDB を調べていることを確認します。

SteveMan が言及した「chkmatch」ツールについては知りませんでしたが、GUID/age にパッチを当てて一致させることで機能すると思われます。

于 2008-10-14T16:10:24.153 に答える
0

これは Doug を助けるには遅すぎますが、この質問に出くわした人のために、別のスレッド ( Visual Studio で不一致のシンボルをロードすることは可能ですか? ) は、WinDbg が不一致の .PDB ファイルを受け入れるようにする方法を指摘しました。

.symopt_0x40
于 2014-01-13T19:32:21.960 に答える