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.
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)?
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.
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).
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.
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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With