Hello,

It´s been a while since my last post.

I´ve decided to start a new topic regarding debugging posts. It´s called quick tips debugging code and here is my first post on the series.

Sometimes while debugging an issue I have to related different threads. (E.g: on a thread there is a reference to another thread object).

 

So the question is: how to easily identify a thread in a thread object ?

 

Below is the result of issuing !do on a thread object ( my sample is based on clr2.0)

 

0:777> !do 00000000c0559e38

Name: System.Threading.Thread

MethodTable: 00000642788c2360

EEClass: 00000642788c21c0

Size: 104(0x68) bytes

GC Generation: 2

(C:\WINDOWS\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)

Fields:

              MT            Field           Offset                 Type VT             Attr            Value Name

00000642788e1428  4000685        8 ....Contexts.Context  0 instance 00000000cfff6a68 m_Context

00000642788cfa38  4000686       10 ....ExecutionContext  0 instance 0000000000000000 m_ExecutionContext

00000642788c1ad0  4000687       18        System.String  0 instance 0000000000000000 m_Name

00000642788c35f0  4000688       20      System.Delegate  0 instance 0000000000000000 m_Delegate

0000064278915788  4000689       28    System.Object[][]  0 instance 000000015001a888 m_ThreadStaticsBuckets

0000064278909f18  400068a       30       System.Int32[]  0 instance 000000015001a9d0 m_ThreadStaticsBits

00000642788cb5f0  400068b       38 ...ation.CultureInfo  0 instance 0000000000000000 m_CurrentCulture

00000642788cb5f0  400068c       40 ...ation.CultureInfo  0 instance 0000000000000000 m_CurrentUICulture

00000642788c0cd8  400068d       48        System.Object  0 instance 0000000000000000 m_ThreadStartArg

00000642788c9618  400068e       50        System.IntPtr  1 instance 793781312 DONT_USE_InternalThread

00000642788ca770  400068f       58         System.Int32  1 instance                2 m_Priority

00000642788ca770  4000690       5c         System.Int32  1 instance              741 m_ManagedThreadId

00000642788e1708  4000691      2d0 ...LocalDataStoreMgr  0   shared           static s_LocalDataStoreMgr

                                 >> Domain:Value  000000000018d100:0000000140003108 000000003cb6dd50:0000000160039a18 000000003d34c6d0:00000001502d7a60 <<

00000642788c0cd8  4000692      2d8        System.Object  0   shared           static s_SyncObject

                                 >> Domain:Value  000000000018d100:00000000cfff2d40 000000003cb6dd50:00000000900eefb0 000000003d34c6d0:00000001402e0e50 <<

 

You can see there is a System.IntPtr by the name DON’T_USE_InternalThread.

Lets convert its value to hex

 

 

0:777> ?0n793781312

Evaluate expression: 793781312 = 00000000`2f502440

 

Now it´s only necessary to do a match between this hex value and the object from !threads output.

 

752   ea 3a60 000000002efeda40       220 Enabled  0000000000000000:0000000000000000 000000000018d100     0 Ukn

753  2e3 2618 000000002ef3bcd0       220 Enabled  0000000000000000:0000000000000000 000000000018d100     0 Ukn

XXXX  2e4    0 000000006912de70      9820 Enabled  0000000000000000:0000000000000000 000000000018d100     0 Ukn

XXXX  2e5    0 000000002f502440      9820 Enabled  0000000000000000:0000000000000000 000000000018d100     0 Ukn

XXXX  2e6    0 000000002ea9a080      9820 Enabled  0000000000000000:0000000000000000 000000000018d100     0 Ukn

 

In my case, it was a thread that had already died. Otherwise you would then proceed to look at thread number (first column)

 

Till next time

Bruno