Как диагностировать утечку ручки?

У меня есть процесс, который размещает WCF ServiceHost. По словам ProcessExplorer, он теряет ручки как сумасшедшие. Я просмотрел код и не могу найти ничего очевидного, что вызывает утечку ручек.

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

РЕДАКТИРОВАТЬ

У меня установлен Windbg. Когда я использую его для отображения дескрипторов, он показывает мне, что 914 дескрипторов имеют тип "Событие" -

Если я выберу несколько из них, и вывод с помощью !handle x f Я получаю вывод, похожий на этот на большинстве:

Type           Event
Attributes     0 
GrantedAccess  0x1f0003
HandleCount    2
PointerCount   3
Object Specific Information
    Event Type Manual Reset
    Event is Set

Есть ли способ углубиться, чтобы узнать больше о событии?

2 ответа

Решение

Извините за ранее плохой ответ (теперь удален, кажется).

Пакет средств отладки для Windows включает в себя WinDbg и друзей. WindDbg - это полноценный отладчик, подобный Visual Studio, но более скромный, более скромный и более функциональный во многих отношениях. Запустите WinDbg, присоединитесь к процессу (F6) и введите !handle в командном окне. Вы получите список всех ручек и некоторую статистику. Если вы прокрутите вверх и увидите ручку, которая выглядит так, как будто это одна из утечек, вы можете сделать !handle <handlenum> f показать больше информации об этом. Например, при подключении к iexplore.exe в моей системе:

0:019> !handle 1bc f
Handle 1bc
  Type          Key
  Attributes    0
  GrantedAccess 0x2001f:
         ReadControl
         QueryValue,SetValue,CreateSubKey,EnumSubKey,Notify
  HandleCount   2
  PointerCount  3
  Name          \REGISTRY\USER\S-1-5-21-498032705-2416727736-2837886327-1001\Software\Microsoft\Windows\CurrentVersion\Internet Settings
  Object Specific Information
    Key last write time:  11:04:51. 9/4/2011
    Key name Internet Settings

РЕДАКТИРОВАТЬ

Чтобы узнать больше информации, вы можете использовать команду! Htrace windbg. Чтобы использовать его, присоедините его к процессу с помощью windbg и введите !htrace -enableзатем введите g возобновить процесс. Осуществите процесс немного, а затем прекратите использование CTRL-Break (т.е. CTRL-Pause). Тип !htrace -diff, Вы должны увидеть список трасс стека, показывающих открытые дескрипторы и стек вызовов во время их открытия. Если у вас не установлены символы Windows, единственными адресами, которые будут иметь смысл, будет ваш собственный код, но этого должно быть достаточно, чтобы получить необходимые подсказки.

<snip>
ModLoad: 00000000`75020000 00000000`7504d000   WINTRUST.dll
ModLoad: 00000000`75160000 00000000`7527d000   CRYPT32.dll
ModLoad: 00000000`757d0000 00000000`757dc000   MSASN1.dll
(2fd0.1ce4): Break instruction exception - code 80000003 (first chance)
ntdll!DbgBreakPoint:
00000000`77440530 cc              int     3
0:019> !htrace -enable
Handle tracing enabled.
Handle tracing information snapshot successfully taken.
0:019> g
(2fd0.2c88): Break instruction exception - code 80000003 (first chance)
ntdll!DbgBreakPoint:
00000000`77440530 cc              int     3
0:019> !htrace -diff
Handle tracing information snapshot successfully taken.
0x360 new stack traces since the previous snapshot.
Ignoring handles that were already closed...
Outstanding handles opened since the previous snapshot:
--------------------------------------
Handle = 0x000000000000070c - OPEN
Thread ID = 0x0000000000000c44, Process ID = 0x0000000000002fd0

0x000000007744232a: ntdll!NtOpenThread+0x000000000000000a
0x0000000074c83910: wow64!whNtOpenThread+0x00000000000000a0
0x0000000074c6cf87: wow64!Wow64SystemServiceEx+0x00000000000000d7
0x0000000074bf2776: wow64cpu!TurboDispatchJumpAddressEnd+0x000000000000002d
0x0000000074c6d07e: wow64!RunCpuSimulation+0x000000000000000a
0x0000000074c6c549: wow64!Wow64LdrpInitialize+0x0000000000000429
0x000000007746e707: ntdll! ?? ::FNODOBFM::`string'+0x0000000000029364
0x000000007741c32e: ntdll!LdrInitializeThunk+0x000000000000000e
0x00000000775f113a: ntdll_775d0000!ZwOpenThread+0x0000000000000012
0x0000000075ea2e32: KERNELBASE!OpenThread+0x0000000000000049
0x00000000755578df: iertutil!CIsoMalloc::AllocArtifact+0x0000000000000050
0x00000000755578b4:  iertutil!CIntraprocessMessageQueueSite::_QueryMessageThreadAffinityHelper_UntrustedSerializedIsoMessage+0x0000000000000055
0x0000000075557754: iertutil!CIntraprocessMessageQueueSite::QueryMessageThreadAffinity+0x000000000000004b
--------------------------------------
Handle = 0x0000000000000790 - OPEN
Thread ID = 0x00000000000019d4, Process ID = 0x0000000000002fd0

0x000000007744226a: ntdll!NtOpenKeyEx+0x000000000000000a
0x0000000074c8d205: wow64!Wow64NtOpenKey+0x0000000000000091
0x0000000074c8314f: wow64!whNtOpenKeyEx+0x0000000000000073
0x0000000074c6cf87: wow64!Wow64SystemServiceEx+0x00000000000000d7
0x0000000074bf2776: wow64cpu!TurboDispatchJumpAddressEnd+0x000000000000002d
0x0000000074c6d07e: wow64!RunCpuSimulation+0x000000000000000a
0x0000000074c6c549: wow64!Wow64LdrpInitialize+0x0000000000000429
0x000000007746e707: ntdll! ?? ::FNODOBFM::`string'+0x0000000000029364
0x000000007741c32e: ntdll!LdrInitializeThunk+0x000000000000000e
0x00000000775f101a: ntdll_775d0000!ZwOpenKeyEx+0x0000000000000012
0x0000000075ad2271: KERNEL32!LocalBaseRegOpenKey+0x000000000000010c
0x0000000075ad2416: KERNEL32!RegOpenKeyExInternalW+0x0000000000000130
0x0000000075ad2302: KERNEL32!RegOpenKeyExW+0x0000000000000021
--------------------------------------
Handle = 0x0000000000000788 - OPEN
Thread ID = 0x00000000000019d4, Process ID = 0x0000000000002fd0

0x000000007744226a: ntdll!NtOpenKeyEx+0x000000000000000a
0x0000000074c8d205: wow64!Wow64NtOpenKey+0x0000000000000091
0x0000000074c8314f: wow64!whNtOpenKeyEx+0x0000000000000073
0x0000000074c6cf87: wow64!Wow64SystemServiceEx+0x00000000000000d7
0x0000000074bf2776: wow64cpu!TurboDispatchJumpAddressEnd+0x000000000000002d
0x0000000074c6d07e: wow64!RunCpuSimulation+0x000000000000000a
0x0000000074c6c549: wow64!Wow64LdrpInitialize+0x0000000000000429
0x000000007746e707: ntdll! ?? ::FNODOBFM::`string'+0x0000000000029364
0x000000007741c32e: ntdll!LdrInitializeThunk+0x000000000000000e
0x00000000775f101a: ntdll_775d0000!ZwOpenKeyEx+0x0000000000000012
0x0000000075ad2271: KERNEL32!LocalBaseRegOpenKey+0x000000000000010c
0x0000000075ad2416: KERNEL32!RegOpenKeyExInternalW+0x0000000000000130
0x0000000075ad2302: KERNEL32!RegOpenKeyExW+0x0000000000000021
<snip>

Используйте профилировщик памяти - они могут помочь найти такие утечки, например:

Другие вопросы по тегам