1

我正在尝试在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,但我不知道如何处理这些。MetadataLengthMetadataImport

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...

我不知道从这里去哪里。

4

0 回答 0