6

シンボルで構築されたネイティブリリースdllがあります。dllを変更するビルド後の手順があります。ビルド後のステップでは、ある程度の圧縮が行われ、おそらくいくつかのデータが追加されます。pdbファイルは引き続き有効ですが、WinDbgもVisual Studio 2008も、ビルド後の手順の後にdllのシンボルをロードしません。リリースdllが参照されているダンプをロードするときにWinDbgまたはVisualStudioのいずれかがシンボルをロードするようにするには、pdbファイルまたはdllのどのビットを変更する必要がありますか?

重要なのはファイルサイズですか?チェックサムまたはハッシュ?タイムスタンプ?

ダンプを変更しますか?またはpdbを変更しますか?出荷前にdllを変更しますか?

(pdbは、リリースされたdllを参照するダンプコールスタック内のアドレスのシンボル名を手動で取得するために使用できるため、有効であることがわかっています。* ssで、コールスタック内のすべてのアドレスに対して手動で行うのは非常に面倒です。すべてのスレッド。)

4

2 に答える 2

12

この投稿は私をchkmatchに導きました。処理されたdllで、chkmatchは次の情報を表示します。

実行可能:
TimeDateStamp:4a086937
デバッグ情報:2(CodeView)
タイムスタンプ:4a086937特性:0メジャーバージョン:0マイナーバージョン:0
サイズ:123 RVA:00380460 FileOffset:00380460
CodeView署名:sUar

デバッグ情報ファイル:
フォーマット:PDB 7.00
結果:一致しません(理由:互換性のないデバッグ情報形式)

前処理されたdllに対して同じpdbを使用すると、次のように報告されます。

実行可能:
TimeDateStamp:4a086937
デバッグ情報:2(CodeView)
タイムスタンプ:4a086937特性:0メジャーバージョン:0マイナーバージョン:0
サイズ:123 RVA:00380460 FileOffset:00380460
CodeView形式:RSDS
署名:(私のGUID)年齢:19
PdbFile :(私のパス)

デバッグ情報ファイル:
フォーマット:PDB 7.00
署名:(私の一致するGUID)年齢:19

両方のバージョンのdllを開いて、オフセット00380460に移動しました。元のバージョンでは、pdbの名前が十分にわかりますが、後処理されたバージョンでは、そのオフセットにpdb情報がありません。pdbパスを検索したところ、まったく同じブロックが見つかりました。オフセットが異なります。次に、元のdllのバイト「38 006004」をbin検索しました。処理されたdllの同じオフセットを見ると、同じバイトが見つかりました。そこで、RVAとオフセット(バイトを一致させることによって配置)を調整しました。ビンゴ!これで、chkmatchは、処理されたdllについて、元のdllとまったく同じ結果を報告します(変更したRVAとFileOffsetを除く)。

編集:確認済み。VisualStudioは、処理されたdllを参照するダンプのシンボルをロードします。

于 2009-05-16T20:50:21.687 に答える
2

Windbg で.symopt +40を使用してみてください。これにより、pdb が強制的に読み込まれます。

于 2009-05-16T20:38:39.950 に答える