Подтвердить что ты не робот

Как найти все экземпляры типов, которые реализуют данный интерфейс во время отладки

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

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

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

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

4b9b3361

Ответ 1

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

Основные моменты этого подхода:

  • Убедитесь, что у вас есть только один экземпляр объекта верхнего уровня, или вы точно знать, сколько и какие экземпляры верхнего уровня есть. (Кроме того, не забывайте о статических значениях.)
  • Узнайте, как использовать отражение, чтобы просмотреть соответствующие биты информации.
  • Показать его при необходимости и читаемым способом.

Ответ 2

Вы пробовали

! dumpheap -type IFaces

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

Ответ 3

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

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

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

Ответ 4

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