How to get non-current thread's stacktrace?

前端 未结 6 1705
别那么骄傲
别那么骄傲 2020-12-05 02:28

It is possible to get stacktrace using System.Diagnostics.StackTrace, but thread has to be suspended. Suspend and Resume function are obsolete, so I expect that better way e

6条回答
  •  一整个雨季
    2020-12-05 03:13

    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%.

提交回复
热议问题