Как найти все экземпляры типов, которые реализуют данный интерфейс во время отладки - PullRequest
12 голосов
/ 20 августа 2009

Я ищу способ найти все текущие экземпляры в куче типов, которые реализуют данный интерфейс (во время отладки WinDbg, которая есть). Поскольку интерфейсы не являются типами в том смысле, что вы можете создавать экземпляры интерфейса, они, очевидно, не отображаются при проверке кучи. То есть !dumpheap здесь мало поможет.

Однако, !dumpmt -md на данном МТ перечисляет число IFaces в IFaceMap. Насколько я могу судить, это число указывает на то, реализует ли тип один или несколько интерфейсов или нет. При использовании флага -md для типа также указываются.

К сожалению, !dumpmd, насколько я могу судить, не привязывает данный метод к интерфейсу, поэтому его нельзя использовать для установки реализованных интерфейсов.

Я предполагаю, что эта информация доступна где-то в памяти, но я не уверен, где искать. Любой вклад высоко ценится.

Ответы [ 4 ]

1 голос
/ 25 августа 2009

Несколько лет назад я отчаянно нуждался в такой информации. Я закончил тем, что создал древовидную структуру, которая появлялась бы только тогда, когда вы использовали непонятную опцию для запуска приложения. Когда я нажал «обновить», он использовал бы отражение, чтобы просмотреть все свойства экземпляра корневого класса. Если он найдет свойство, которое является коллекцией, или содержит другие свойства, он рекурсивно вызовет их. Конечным результатом было то, что дерево данных экземпляра в этой точке было доступно для прочтения.

Основными моментами этого подхода являются

  1. Убедитесь, что у вас есть только один экземпляр объекта верхнего уровня, или вы точно знать, сколько и какие экземпляры верхнего уровня имеются. (Также не забывайте о статических значениях.)
  2. Узнайте, как использовать отражение для просмотра соответствующих битов информации.
  3. Отображать его при необходимости и в удобочитаемом виде.
0 голосов
/ 22 августа 2009

Вы пробовали

! IFHs типа dumpheap

Также будут показаны таблицы методов. Вы можете копать глубже оттуда.

0 голосов
/ 22 августа 2009

Лучше всего начать с Crack.NET, которая делает то, что вы хотите (хотя она нацелена на приложения wpf и winforms). Проект с открытым исходным кодом, поэтому вы должны иметь возможность получить метод, используемый для получения необходимой информации из источника. Он имеет плагин для Reflector, который позволяет вам также проверять детали объекта в памяти.

Страница проекта: http://joshsmithonwpf.wordpress.com/cracknet/

CodePlex: http://cracknetproject.codeplex.com/

0 голосов
/ 21 августа 2009

Если вам не нужно создавать собственную программу, попробуйте NDepend .

...