Я устраняю утечку памяти и обнаружил, что объект удерживается в памяти, потому что на него ссылается словарь.Когда я делаю! Gcroot для экземпляра словаря, единственный закрепленный дескриптор - это массив System.Object [], который сам по себе не рутирован:
0:025> !gcroot -nostacks 38ad01f8
DOMAIN(0000000002287D80):HANDLE(Pinned):11e15c0:Root: 00000000123c5018(System.Object[])->
0000000002f2ab20(System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[MyApp.MyObject, MyApp]])->
000000004223e6e0(System.Collections.Generic.Dictionary`2+Entry[[System.String, mscorlib],[MyApp.MyObject, MyApp]][])->
0000000038ad01f8(MyApp.MyObject)
Это приводит меня к выводу, что экземпляр Dictionary удерживаетсястатическим полем в некотором классе (.NET хранит все ссылки на статические поля в массиве объектов).
Однако теперь я застрял, потому что! gcroot и! refs (из sosex) не видят ссылки на статические поля.
Я могу искать в куче указатель на адрес 2f2ab20:
0:025> s-q 0 L?0xbfffffff 2f2ab20
00000000`123c76f8 00000000`02f2ab20 00000000`02f2ab78
Так что я вижу, что какая-то структура около адреса 123c76f8 ссылается на мой словарь.Но куда мне идти отсюда?Структура около 123c76f8 должна указываться структурой EEClass, но sos / sosex, кажется, не предоставляет способ определить, какой EEClass является релевантным.
Без этой информации, как я могу выяснить, какой объект содержитстатический словарь?