Атрибуты сборки дампа в пользовательском правиле 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...

Я не уверен, куда идти отсюда.

0 ответов

Другие вопросы по тегам