2015-07-22 16 views
8

Windbg should understand il MS exception protocol utilizzato per passare nomi di thread a un debugger.Can Windbg può visualizzare i nomi dei thread?

Non riesco a farlo funzionare. Guardando in rete ci sono molti esempi che mostrano gli elenchi di thread "~" senza nomi di thread, ed è quello che vedo. Sto eseguendo il debug di un processo .NET x86 e ho provato le versioni WDK 8.1 x86 e x64 di Windbg.

Qualcuno sa se questa funzione è ancora disponibile? Cosa mi manca?

+0

Sto utilizzando WinDbg dal 2010 e non ho mai visto i nomi di thread del genere –

+0

Il post è a partire dal 2005, così si potrebbe provare con WinDbg 6.4.0007.0 (si trova in [ Windows 2003 SDK] (http://download.cnet.com/Windows-Server-2003-R2-Platform-SDK-ISO-Download/3000-10248_4-10731094.html)) –

risposta

7

Per filetti .NET, i seguenti lavori per "normali" Thread s (thread creati manualmente, dal momento che non conosco un modo per citarne threadpool discussioni):

Un Thread è una classe e quindi può essere trovato in .NET gestito mucchio:

0:000>.loadby sos clr 
0:000> !dumpheap -stat -type Thread 
     MT Count TotalSize Class Name 
... 
725e4960  11   572 System.Threading.Thread 

si noti che non v'è altra uscita e, dal momento !dumpheap guarda per le parti di nomi di classi. Il Tavolo Method (MT), tuttavia, identifica una classe in modo univoco, in modo che è quello che usiamo da ora in poi:

0:000> !dumpheap -short -mt 725e4960 
023123d0 
02312464 
02313c80 
... 

Questi sono gli indirizzi di Thread oggetti. Dal momento che è uscita pulita, siamo in grado di usarlo in un ciclo:

0:000> .foreach (address {!dumpheap -short -mt 725e4960}) {.echo ${address} } 
023123d0 
02312464 
02313c80  
... 

All'interno del ciclo, possiamo utilizzare l'indirizzo per ottenere ulteriori informazioni sul thread. In primo luogo, cerchiamo di scoprire come un thread sembra internamente:

0:000> !do 023123d0 
Name:  System.Threading.Thread 
... 
Fields: 
     MT Field Offset     Type VT  Attr Value Name 
... 
725e3e18 400076e  c  System.String 0 instance 02313c0c m_Name 
... 

all'offset +0xC, c'è il membro m_Name (a seconda del numero di bit!). Questa è una stringa. Scopriamo come una stringa assomiglia:

0:000> !do poi(023123d0+c) 
Name:  System.String 
... 
Fields: 
     MT Field Offset     Type VT  Attr Value Name 
... 
725e4810 40000ac  8   System.Char 1 instance  4d m_firstChar 

Così, il primo carattere della stringa è all'offset +0x08. Le stringhe in .NET sono Unicode, in modo che possiamo vederlo con du:

0:000> du poi(023123d0+c)+8 
02313c14 "My named thread 0" 

Combina tutte queste conoscenze in un unico comando:

.foreach (address {!dumpheap -short -mt 725e4960}) 
{ 
    du poi(${address}+c)+8 
} 

(formattato per la leggibilità, ha messo tutto in una sola riga)

Se si prova che, ci si accorge che esso può emettere qualcosa di simile

00000008 "????????????????????????????????" 

Ciò accade quando m_Name è null.Se vi preoccupate per questo, è possibile aggiungere un controllo per nulla:

.foreach (address {!dumpheap -short -mt 725e4960}) 
{ 
    .if (poi(${address}+c) != 0) { 
     du poi(${address}+c)+8 
    } 
} 

(formattato per la leggibilità, ha messo tutto in una sola riga)

Altri miglioramenti:

  • fare lo stesso per l'ID filo
  • uscita Prettify (utilizzare .printf anziché dd e du)

Risultato finale:

.foreach (address {!dumpheap -short -mt 725e4960}) 
{ 
    .if (poi(${address}+c) != 0) 
    { 
     .printf "%d ",poi(${address}+28); 
     .printf "%mu\r\n", poi(${address}+c)+8 
    } 
} 
+0

I thread del pool di thread non sono diversi dai normali thread, ma la loro denominazione è in genere inutile dal momento che vengono riutilizzati. –

+0

Sembra che .NET non usi il protocollo di eccezioni first-chance per i nomi dei thread, sebbene non abbia avuto il tempo di verificarlo. Grazie per il tutorial. Ho aggiunto il tuo script al mio cheat sheet WinDbg raramente usato! –

+0

Vorrei poter revocare questa risposta più di una volta. – mark

0

Qualcuno sa se questa funzione è ancora disponibile?

Sì, questa funzione è ancora disponibile. Almeno per le applicazioni native.

Per il metodo di app .NET da 'How to: Set a Thread Name in Managed Code' può essere preferito per il lancio di un'eccezione.

+2

Di quale funzione stai parlando? Denominare i thread o mostrare thread denominati in WinDbg? Si prega di estendere un po 'su come mostrare i nomi dei thread in WinDbg. –