WinDbg + SOS: Как просмотреть объект .NET, оборачивающий дескриптор? - PullRequest
2 голосов
/ 03 июня 2019

Я импортировал файл дампа из .NET Core процесса в WinDbg.Существует дескриптор события

0:000> !handle 3760 f
Handle 0000000000003760
  Type          Event
  Attributes    0
  GrantedAccess 0x1f0003:
         Delete,ReadControl,WriteDac,WriteOwner,Synch
         QueryState,ModifyState
  HandleCount   2
  PointerCount  65534
  Name          <none>
  Object specific information
    Event Type Auto Reset
    Event is Waiting

Как я могу использовать расширение SOS для анализа этого события?Чтобы увидеть, где это создается в управляемом коде?

1 Ответ

4 голосов
/ 03 июня 2019

Поскольку тип события - автоматический сброс, имхо вы должны посмотреть на экземпляры класса AutoResetEvent.Не уверен насчет Core, но в Framework вы можете взять расширение NetExt и выполнять запросы в кучу.AutoResetEvent имеет приватное поле waitHandle с IntPtr для дескриптора, который вы наблюдаете.

Итак, после запуска! Windex NexExt-запрос будет выглядеть так:

!wfrom -type System.Threading.AutoResetEvent where (waitHandle == 0000000000003760)  select $addr(), $tohexstring(waitHandle)

Если NetExt не работает сЯдро вы можете сбросить все экземпляры AutoResetEvents в текстовый файл, как это, а затем найти ваше событие там.

.logopen c:\temp\autoresetevents.txt
.foreach (obj {!dumpheap -type AutoResetEvent -short}) {!do obj}
.logclose

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

...