How do I find the lockholder (reader) of my ReaderWriterLock in windbg

I've got a dump of a .Net process that has hung due to a deadlock (the gui thread is no longer responding, and my logs show that some threads have stopped responding). I have taken a snapshot and am now looking through it in windbg, and all threads bar one are waiting for the last one. Looking at that one thread's stacktrace with !clrstack -p I can see that it is trying to aquire a write on a ReaderWriterLock

How do I tell which other thread holds that lock so I can start figuring out how the deadlock happened?


[edit] apparently there was a command !rwlocks in the .Net1.1 sos.dll to help with this, but it isn't there in the .Net2.0 version. The hunt continues


I'm not absolutely sure but you might be able to use !SyncBlk to look at the sync block objects, if you invoke it without any arguments I think you should see the sync blocks that are owned by a thread.

If you have a sync block deadlock, the extension SOSEX might be what you need. This extension offers the command !dlk that shows which threads are waiting for which locks. This only works for sync blocks though, deadlocks on other sync objects will not be detected, if you are using lock() (Monitor.Enter) this should not be a problem for you.

Try sosex and !dlk

I posted a simular topic a while back here,

I referenced a number of articles and such, but wait chain traversial (WCT) can help you, it's somewhat touchy but this msdn mag bugslayer article show's how to use WCT in windbg in a managed context.

Need Your Help

Extracting and executing an arbitrary sequence of Java bytecodes

java assembly bytecode bytecode-manipulation bcel

Given the .class file of Java Class A, is there a way (with BCEL, ASM, etc. for instance) to extract a given bytecode sequence (assuming it's a basic block), place it in a separate location, and then