Атрибуты сборки дампа в пользовательском правиле DebugDiag 2.0
Я пытаюсь создать собственное правило анализа дампа в DebugDiag 2.0. Наш код представляет собой управляемое приложение C# со многими сборками. Каждая сборка имеет свои собственные пользовательские атрибуты, которые содержат информацию о ревизии исходных файлов, скомпилированных для создания сборки.
Я знаю, что можно извлечь модули в файл с помощью команд WinDbg !savemodule
или! сохранить все модули. Затем я могу использовать такой инструмент, как 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...
Я не уверен, куда идти отсюда.