Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot switch to managed thread in WinDbg

Tags:

.net

windbg

sos

I am exploring a minidump of an ASP.NET process with WinDbg, using SOS. If I list the managed threads I see a normal looking list of threads:

0:000> !threads
ThreadCount: 8
UnstartedThread: 0
BackgroundThread: 8
PendingThread: 0
DeadThread: 0
Hosted Runtime: no
                                              PreEmptive                                                Lock
       ID OSID        ThreadOBJ     State   GC     GC Alloc Context                  Domain           Count APT Exception
XXXX    1 12bc 00000000001441f0   1808220 Disabled 0000000140b10fc8:0000000140b12f20 000000000017f6e0     0 Ukn (Threadpool Worker)
XXXX    2 1334 0000000000152f90      b220 Enabled  0000000000000000:0000000000000000 0000000000121b90     0 Ukn (Finalizer)
XXXX    3 138c 000000000017b100    80a220 Enabled  0000000000000000:0000000000000000 0000000000121b90     0 Ukn (Threadpool Completion Port)
XXXX    4  81c 000000000017eb40      1220 Enabled  0000000000000000:0000000000000000 0000000000121b90     0 Ukn
XXXX    5  5e4 00000000001bccd0   880a220 Enabled  0000000000000000:0000000000000000 0000000000121b90     0 Ukn (Threadpool Completion Port)
XXXX    6 11e4 0000000004bee280   180b220 Disabled 0000000000000000:0000000000000000 0000000000121b90     0 Ukn (Threadpool Worker)
XXXX    7  73c 0000000004c267e0   180b220 Disabled 0000000140b0f158:0000000140b10f20 000000000017f6e0     3 Ukn (Threadpool Worker) System.StackOverflowException (000000007fff0138) (nested exceptions)
XXXX    8  21c 00000000001ad1c0   180b220 Enabled  0000000000000000:0000000000000000 0000000000121b90     0 Ukn (Threadpool Worker)

However, if I try to switch to thread 7 (the one with the exception), I get this:

0:000> ~7s
        ^ Illegal thread error in '~7s'

This happens when trying to switch to any managed thread. I'm not sure where to proceed from here. What I really need to do is see the stack trace from that managed thread.

like image 463
andypaxo Avatar asked Jul 10 '12 15:07

andypaxo


People also ask

How do you switch the thread you’re examining?

Quick hint for today: how do you switch the thread you’re examining in Windbg? If you know the thread number you can type the command ~<thread number>s (e.g. ~21s to switch to thread 21). But what about if you only know the ThreadID (which is an hexadecimal value)?

What is the use of the thread extension command?

This command can be used only during kernel-mode debugging. This extension command is not the same as the .thread (Set Register Context) command. Displays summary information about the process that owns the thread. When this option is included, Address is the thread ID, not the thread address.

How do I debug managed code in Windows?

You can use the Windows debuggers (WinDbg, CDB, and NTSD) to debug target applications that contain managed code. To debug managed code, you must load the SOS debugging extension (sos.dll) and a data access component (mscordacwks.dll).

How is managed code executed?

Managed code is executed together with the Microsoft .NET Common Language Runtime (CLR). In a managed-code application, the binary code that the compiler produces is in Microsoft Intermediate Language (MSIL), which is platform-independent.


1 Answers

The output from !threads show three different IDs for threads (WinDbg's ID, the managed ID and the native ID). The one you need to use is the leftmost. As you can see all the threads in the dump have been marked as XXXX meaning that they are no longer available. This is normal, but I do find it odd that all the threads are marked like that. Was the dump taken during process shutdown?

UPDATE based on comment

You should definitely be able to get a useful dump with adplus -crash, but clearly everything is a bit messed up here since even the finalizer thread is being terminated. I noticed that one of the threads has a StackoverflowException, which is probably what you're after. To get that you could create dumps on first chance exceptions and see if you get something more useful that way. Adplus has a FullOnFirst flag for that.

Additional UPDATE

Okay, that is weird. A couple of other things to try.

  • Attach to the process before the crash and just let it g. That should break in to the debugger on exceptions. If you want, you can set up an event to just print any exceptions to the console. Use sxe -c "!pe; !clrstack; gn" clr.

  • Adplus used to be a vbs script but it was rewritten as an executable a while back. I've seen a few minor issues with the new version, but nothing like this. You could try the old script which is still available as adplus_old.vbs.

  • Try procdump from sysinternals. It supports the same kind of dump options as Adplus (plus a few more).

like image 172
Brian Rasmussen Avatar answered Sep 19 '22 20:09

Brian Rasmussen