2011-10-01 6 views
9

Tengo un proceso que aloja un WCF ServiceHost. Se filtra maneja como loco de acuerdo con ProcessExplorer. Revisé el código y no puedo encontrar nada obvio que esté causando los identificadores filtrados.¿Cómo puedo diagnosticar una fuga de la manija?

Lo más parecido que puedo encontrar es la lista de identificadores proporcionados por ProcessExplorer, pero la utilidad de eso parece limitada. ¿Hay alguna otra herramienta para ayudar a diagnosticar de dónde vino un identificador, como a través de un seguimiento de pila o algo así?

EDITAR

Tengo el WinDbg instalado. Cuando lo uso para enumerar las manijas, me está mostrando que 914 mangos son de tipo "Evento" -

Si tomo algunos de éstos, y la salida utilizando !handle x f consigo una salida similar a esta en la mayoría:

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

¿Hay alguna manera de profundizar más para determinar más sobre el evento?

+2

Visual Studio análisis de código (o FxCop) le dirá si está fallando en desechar adecuadamente los recursos. –

+0

John, tengo curiosidad, ¿por qué publicaste tu respuesta como un comentario y no como una respuesta? –

+1

No creo que haya sido una buena respuesta. Esperaba que alguien más hiciera un mejor trabajo con la idea. –

Respuesta

12

Disculpe por la respuesta incorrecta anterior (ahora eliminada, parece).

El paquete Herramientas de depuración para Windows incluye WinDbg y sus amigos. WindDbg es un depurador completo como Visual Studio, pero cada vez más sencillo y más capaz de muchas maneras. Ejecute WinDbg, adjunte a su proceso (F6) y escriba !handle en la ventana de comandos. Obtendrás una lista de todos los identificadores y algunas estadísticas. Si te desplazas hacia arriba y ves un identificador que parece ser uno de los que tienen fugas, puedes hacer !handle <handlenum> f para mostrar más información al respecto. Por ejemplo, adjuntando a iexplore.exe en mi sistema:

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 

EDITAR

Para obtener más información, puede utilizar el comando htrace windbg!. Para usarlo, conéctelo a su proceso usando windbg, y escriba !htrace -enable, luego escriba g para reanudar el proceso. Ejercite el proceso por un tiempo y luego divida usando CTRL-Break (es decir, CTRL-Pause). Tipo !htrace -diff. Debería ver una lista de rastreos de pila que muestran los identificadores abiertos y la pila de llamadas en el momento en que se abrieron. Si no tiene configurados los símbolos de Windows, las únicas direcciones que tendrán sentido serán su propio código, pero eso debería ser suficiente para obtener las pistas que necesita.

<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> 
+0

Pregunta tonta ... Encontré lo que pensé que era las herramientas de depuración para el paquete de Windows, pero después de la instalación, no hay mención de WinDbg, ¿dónde lo instalo oficialmente para obtenerlo? – bugfixr

+0

Entendido, tuvo que instalar la versión de 64 bits antes de instalar las herramientas de depuración. – bugfixr

Cuestiones relacionadas