Можно ли реализовать GC.GetAliveInstancesOf <T>() (для использования при отладке)? - PullRequest
2 голосов
/ 07 июня 2010

Я знаю, что на ответили раньше , но я бы хотел задать несколько иной вопрос.

Есть ли какой-нибудь мыслимый способ реализации GC.GetAliveInstancesOf (), который можно оценить в окне Visual Studio Debug Watch? Саша Гольдштейн показывает одно решение в этой статье , но требует, чтобы каждый класс, который вы хотите запросить, наследовал от определенного базового класса.

Подчеркну, что я хочу использовать этот метод только во время отладки, поэтому мне все равно, что GC может изменить адрес объекта в памяти во время выполнения.

Одна идея может заключаться в том, чтобы каким-то образом использовать команду ! Dumpheap –type SOS и выполнить магический трюк, чтобы создать временную переменную и указать ей адрес памяти, напечатанный SOS.

У кого-нибудь есть решение, которое работает?

Ответы [ 2 ]

2 голосов
/ 23 июня 2012

Похоже, что-то очень похожее на это было реализовано Алоисом Краусом в проекте WMemoryProfiler .

1 голос
/ 07 июня 2010

Нет ничего, что могло бы затянуть сборщик мусора больше, чем необходимость предположить, что какой-то пользовательский код может быть заинтересован в поиске корней, которые ему не принадлежат. Поддержание его как можно более быстрым является решающим. В этом отношении единственный способ, с помощью которого вы можете когда-либо с уверенностью увидеть, на что ссылаются, - это заморозить все потоки, которые могут выделять память из кучи собранной мусором.

Ну, это возможно, отладчики делают это. Вы уже знаете, как Windbg делает это. Однако он не был разработан как инструмент, оптимизированный для отслеживания управляемых объектов. Есть и другие инструменты: профилировщики памяти. Есть из чего выбирать, не пытайтесь создать свой собственный. От бесплатного (и тратящего время) CLR Profiler до сторонних предложений, таких как Ants и dotTrace и многие другие. Пару сотен баксов, чтобы решить вашу проблему, и вы не сможете сделать лучше сами за меньшие деньги.

...