2011-10-01 10 views
9

Ho un processo che ospita un servizio di assistenza WCF. Maneggia maniglie come pazzo secondo ProcessExplorer. Ho passato il codice e non riesco a trovare nulla di ovvio che stia causando mance trapelate.Come diagnosticare una perdita Maniglia?

Il più vicino possibile è l'elenco degli handle forniti da ProcessExplorer, ma l'utilità di ciò sembra limitata. Ci sono altri strumenti là fuori per aiutare a diagnosticare da dove proviene un handle, come tramite una traccia stack o qualcosa del genere?

EDIT

Ho il Windbg installato. Quando lo uso per elencare le maniglie, mi sta dimostrando che 914 maniglie sono di tipo "evento" -

Se prendo un paio di questi, e l'uscita utilizzando !handle x f ottengo un risultato simile a questo per la maggior parte:

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

C'è un modo per approfondire ulteriormente per determinare di più sull'evento?

+2

Visual Studio analisi del codice (o FxCop) ti dirà se non riesci a smaltire correttamente le risorse. –

+0

John, sono curioso, perché hai postato la tua risposta come commento e non come risposta? –

+1

Non pensavo che fosse una gran bella risposta. Speravo che qualcun altro avrebbe fatto un lavoro migliore con l'idea. –

risposta

12

Ci scusiamo per la precedente risposta negativa (ora cancellata, appare).

Il pacchetto Strumenti di debug per Windows include WinDbg e gli amici. WindDbg è un debugger completo come Visual Studio, ma più snello e cattivo e più capace in molti modi. Eseguire WinDbg, allegare al processo (F6) e digitare !handle nella finestra di comando. Otterrai un elenco di tutte le maniglie e alcune statistiche. Se scorri verso l'alto e vedi una maniglia che sembra essere tra quelle che perdono, puoi fare !handle <handlenum> f per mostrare maggiori informazioni a riguardo. Ad esempio, il fissaggio a iexplore.exe sul mio 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 

EDIT

Per maggiori informazioni, è possibile utilizzare il comando htrace windbg!. Per utilizzarlo, allegare al processo utilizzando windbg e digitare !htrace -enable, quindi digitare g per riprendere il processo. Esegui il processo per un po ', quindi interrompi usando CTRL-Break (ad esempio CTRL-Pause). Digitare !htrace -diff. Dovresti vedere un elenco di tracce dello stack che mostrano maniglie aperte e lo stack di chiamate nel momento in cui sono state aperte. Se non hai impostato i simboli di Windows, gli unici indirizzi che avranno senso saranno il tuo codice personale, ma questo dovrebbe essere sufficiente per ottenere gli indizi necessari.

<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

Domanda stupida ... Ho trovato quello che pensavo fosse gli strumenti di debug per il pacchetto di Windows, ma dopo l'installazione, non si parla di WinDbg - dove installarlo ufficialmente per ottenerlo? – bugfixr

+0

Capito, ha dovuto installare la versione a 64 bit prima di installare gli strumenti di debug. – bugfixr

Problemi correlati