How to get non-current thread's stacktrace?
Here's what's worked for me so far:
StackTrace GetStackTrace (Thread targetThread){ StackTrace stackTrace = null; var ready = new ManualResetEventSlim(); new Thread (() => { // Backstop to release thread in case of deadlock: ready.Set(); Thread.Sleep (200); try { targetThread.Resume(); } catch { } }).Start(); ready.Wait(); targetThread.Suspend(); try { stackTrace = new StackTrace (targetThread, true); } catch { /* Deadlock */ } finally { try { targetThread.Resume(); } catch { stackTrace = null; /* Deadlock */ } } return stackTrace;}
If it deadlocks, the deadlock is automatically freed and you get back a null trace. (You can then call it again.)
I should add that after a few days of testing, I've only once been able to create a deadlock on my Core i7 machine. Deadlocks are common, though, on single-core VM when the CPU runs at 100%.
This is an old Thread, but just wanted to warn about the proposed solution: The Suspend and Resume solution does not work - I just experienced a deadlock in my code trying the sequence Suspend/StackTrace/Resume.
The Problem is that StackTrace constructor does RuntimeMethodHandle -> MethodBase conversions, and this changes a internal MethodInfoCache, which takes a lock. The deadlock occurred because the thread I was examining also was doing reflection, and was holding that lock.
It is a pity that the suspend/resume stuff is not done inside the StackTrace constructor -then this problem could easily have been circumvented.
According to C# 3.0 in a Nutshell, this is one of the few situations where it is okay to call Suspend/Resume.