我正在尝试在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...
我不知道从这里去哪里。