Какой поток использует данный объект? - PullRequest
1 голос
/ 29 ноября 2011
  1. Я запускаю команду dumpheap -type MyObjectType, чтобы получить таблицу методов для MyObjectType. Показывает три объекта в куче.
  2. Я запускаю dumpheap -mt <method table address>, чтобы получить адрес.
  3. Я запускаю команду !gcroot <address>, чтобы найти ссылки на эти объекты, ничего не найти
  4. !do <address> и предоставляет подробные сведения о полях для этого объекта и т. Д.

Как я могу найти, какой поток ссылается или использует объект? Любая команда, чтобы узнать это?

Ответы [ 2 ]

1 голос
/ 01 декабря 2011

Нет простого способа сделать это, но вы можете запустить !dso для каждого потока (то есть ~*!dso).Это скажет вам, на какие объекты ссылается каждый из потоков.Чтобы облегчить навигацию по выводу, я обычно записываю его в файл и использую grep или приличный текстовый редактор для поиска результатов.

0 голосов
/ 29 ноября 2011

Вы можете попытаться использовать CLR Profiler от Microsoft , чтобы узнать, какой поток выделил и получил доступ к вашему объекту. Я не уверен, что !gcroot показывает объекты, ожидающие финализатор, но CLR Profiler определенно показывает. Ваш объект также может вообще не ссылаться на какой-либо корень GC, и он просто ожидает сбора. Это может занять некоторое время, особенно если оно размещено в куче больших объектов. Попробуйте заставить несколько сборщиков мусора (и посмотрите, действительно ли коллекции gen0-2 имели место) и посмотрите, выживет ли ваш объект.

...