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

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

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

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

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


person Brian Rasmussen    schedule 20.08.2009    source источник
comment
Почему голосование против? Пожалуйста, объясните, чтобы у меня был шанс улучшить свой вопрос. Спасибо.   -  person Brian Rasmussen    schedule 19.09.2009
comment
Вы когда-нибудь это решали? Ищу то же самое, но в живом процессе без отладчика.   -  person Hefaistos68    schedule 08.04.2021


Ответы (4)


Ты пытался

! dumpheap -type IFaces

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

person Dominic Zukiewicz    schedule 22.08.2009
comment
Нет, здесь перечислены экземпляры типов, для которых IFaces является частью их имени. Параметр типа использует обычное текстовое соответствие для имен типов и, таким образом, не имеет ничего общего с интерфейсами. - person Brian Rasmussen; 22.08.2009

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

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

  1. Убедитесь, что у вас есть только один экземпляр объекта верхнего уровня или вы точно знаете, сколько их и какие экземпляры верхнего уровня. (Также не забывайте о статических значениях.)
  2. Выясните, как использовать отражение для просмотра соответствующих фрагментов информации.
  3. Отображайте его при необходимости и в удобочитаемой форме.
person John Fisher    schedule 24.08.2009
comment
Что ж, информация доступна в исходном коде. Я просто хотел бы узнать, как раскопать информацию во время отладки. Поскольку среда выполнения должна где-то располагать этой информацией, остается лишь раскопать детали. Но все равно спасибо за ваш вклад. - person Brian Rasmussen; 30.08.2009

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

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

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

person apiguy    schedule 22.08.2009

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

person Dipen Bhikadya    schedule 21.08.2009
comment
Я не понимаю, чем здесь может быть полезен NDepend. У меня есть весь исходный код, поэтому при необходимости я могу найти разработчиков. Мне интересно найти экземпляры в памяти во время выполнения. - person Brian Rasmussen; 21.08.2009