2013-05-23 11 views
5

Guardando un crash dump in windbg, posso vedere che tutti i fili attuali sono bloccate alDeterminare quali oggetti ZwWaitForMultipleObjects è nell'attesa

> ~2k 
ChildEBP RetAddr 
00d2fcc8 7d4e27dc ntdll_7d600000!ZwWaitForMultipleObjects+0x15 

o variazioni SingleObject della stessa.

come maniglia per l'oggetto di aspettare è passato a ZwWaitForMultipleObjects, ho pensato che avrei potuto capire quale oggetto si stava usando una variazione di

!do <address> 

con l'indirizzo giusto - ma io don' so come costruire l'indirizzo giusto Suppongo di aver bisogno di un po 'di compensazione da ChildEBP?

+2

'! Do' è per oggetti gestiti (.NET) ma ZwWFMO è probabilmente in attesa su handle nativi. Usa '~ 2kb' per ottenere un frame Win32 ben documentato più in alto nello stack (si spera WaitForMultipleObjects) e i suoi primi tre argomenti. Dovrai deref il secondo arg per ottenere le maniglie. Quando ottieni i valori di handle usa '! Handle f' ottieni informazioni su un particolare handle. Pubblica l'output su '~ 2kb' se hai bisogno di aiuto per scavare i valori dell'impugnatura. –

risposta

11

Prova questi passaggi:

  1. utilizzare il comando "~ 2s" per cambiare contesto per infilare 2 # (questo passaggio è probabilmente ridondante ma trovo più facile far funzionare nel contesto filettatura destrorsa)

  2. Utilizzare il comando "kb" per visualizzare lo stack di chiamate del thread, compresi i primi tre argomenti di ciascuna funzione. Otterrete qualcosa di simile a:

     
    ChildEBP RetAddr Args to Child 
    0dc7fa30 768b0962 00000004 0dc7fa80 00000001 ntdll!ZwWaitForMultipleObjects+0x15 
    0dc7facc 73c61339 0dc7fa80 0dc7fb14 00000000 KERNELBASE!WaitForMultipleObjectsEx+0x100 
    
  3. Prendendo lo stack di chiamate di cui sopra come un esempio, si può vedere che il numero di handle passati a ZwWaitForMultipleObjects è 4 (il valore del primo argomento). L'indirizzo dell'array di handle è il secondo argomento. Nell'esempio precedente l'indirizzo è 0dc7fa80

  4. Utilizzare il comando "dd" per visualizzare il contenuto dell'array di handle. Nel caso dello stack di chiamate di cui sopra, usare "dd 0dc7fa80" che darà qualcosa di simile:

     
    0dc7fa80 000001f0 000001f8 0000020c 000001ec 
    0dc7fa90 73a53c1b 00000000 0d462f70 00000001 
    0dc7faa0 0cf7afe0 00000003 0dc7fac8 00000004 
    

    Supponendo che questo è un processo a 32 bit, le maniglie sono i primi quattro DWORD singoli: "1F0", "1F8" , "20c" e "1ec".

  5. È possibile visualizzare i dettagli di ogni gestire utilizzando il "manico!" Estensione WinDbg in questo modo:! gestire 1F0 F La bandiera F mostrerà ulteriori dettagli sul manico, tra cui il conteggio e il nome (se ha uno ad esso associati)

Se si sospetta che le maniglie sono state approvate nel dal codice gestito, allora avrete bisogno di caricare SOS o PSSCOR e utilizzare il comando! clrstack per visualizzare i dettagli dello stack delle chiamate gestite.

+0

Eccellente, grazie Aeham (e Marc per il commento). È perfetto. –

Problemi correlati