DebugDiag 2.0でカスタム ダンプ分析ルールを作成しようとしています。このコードは、多数のアセンブリを含むマネージ C# アプリケーションです。各アセンブリには、アセンブリを作成するためにコンパイルされたソース ファイルに関するリビジョン情報を含む独自のカスタム属性があります。
WinDbgコマンド!savemodule
または !saveallmodulesを使用して、モジュールをファイルに抽出できることを知っています。その後、JetBrains DotPeek などのツールを使用してアセンブリ属性を検査できます。
DebugDiag 分析中にこれらの属性を見つけて、属性情報を DebugDiag レポートにダンプしたいと考えています。自動分析レポートにこれらの属性があると、チームの効率が向上します。
DebugDiag 2.0 オブジェクトを使用してメモリ ダンプからマネージ アセンブリ属性を抽出するにはどうすればよいですか?
デバッガー オブジェクトからモジュールを取得しようとしましたがNetDbgObj
、そこから属性を取得する便利な方法がわかりません。
var module = debugger.GetModuleByModuleName("MyModule");
ClrModule オブジェクトが NetDbgObj.ClrRuntime オブジェクトを介して利用可能であることを確認できます。ClrModule オブジェクトを取得できましたが、どうすればよいかわかりません。MetadataAddress
、MetadataLength
、 のプロパティがありますがMetadataImport
、それらをどうするかわかりません。
foreach (var module in debugger.ClrRuntime.EnumerateModules())
{
object o = module.MetadataLength.MetadataImport;
// now what?
}
これらの属性オブジェクトはマネージド ヒープ上にないため、!dumpheap -type MyAttribute
返されません。
アセンブリ属性は、アセンブリ データのどこかにメタデータとして格納されます。!DumpModule の出力を見てきました。
0:000> !DumpModule /d 0974f888
Name: E:\MyProject\Output\Debug\MyAssembly.dll
Attributes: PEFile
Assembly: 0be8f198
LoaderHeap: 00000000
TypeDefToMethodTableMap: 0119077c
TypeRefToMethodTableMap: 01190794
MethodDefToDescMap: 01190810
FieldDefToDescMap: 01190878
MemberRefToDescMap: 00000000
FileReferencesMap: 011908a8
AssemblyReferencesMap: 011908ac
MetaData start address: 08112e20 (5576 bytes)
dc のようなコマンドを使用してメタデータをダンプできることはわかっています。
0:000> dc 08112e20 L5576
08112e20 424a5342 00010001 00000000 0000000c BSJB............
08112e30 302e3476 3330332e 00003931 00050000 v4.0.30319......
...lots of output...
ここからどこへ行けばいいのかわからない。