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
}
}
Sto utilizzando WinDbg dal 2010 e non ho mai visto i nomi di thread del genere –
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)) –