How to get non-current thread's stacktrace? How to get non-current thread's stacktrace? multithreading multithreading

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.