【问题标题】:StackTrace from Exception on different thread?StackTrace 来自不同线程上的异常?
【发布时间】:2023-04-10 16:09:02
【问题描述】:

StackTrace 上有一个构造函数,它接受一个异常作为参数。一切都很好,但是我注意到所有其他构造函数都说它将从当前线程获取 StackTrace,但是接受异常的构造函数除了

生成的堆栈跟踪描述 时的堆栈 例外。

我只是想确保我将获得正确的异常 StackTrace,即使当我从另一个线程中的异常创建 StackTrace 时,我在创建异常的不同线程上创建 StackTrace。

有人可以确认一下吗?

【问题讨论】:

    标签: .net exception multithreading stack-trace


    【解决方案1】:

    似乎很容易尝试,除非我错过了什么。这将为我打印正确的堆栈跟踪。

    static Exception threadEx;
    
    static void Main()
    {
        Thread worker = new Thread(DoWork);
        worker.Start();
        worker.Join();
    
        if (threadEx != null) {
            StackTrace trace = new StackTrace(threadEx);
            Console.WriteLine(trace);
        }
    }
    
    static void DoWork()
    {
        try {
            throw new Exception("Boom!");
        }
        catch (Exception ex) {
            threadEx = ex;
        }
    }
    

    【讨论】:

    • 感谢 Mattias,我终于也亲自测试了这个,你说得对,它确实打印了正确的堆栈跟踪。
    【解决方案2】:

    它将为调用它的线程创建 StackTrace(在内部,它使用参数“targetThread”调用“CaptureStackTrace”,表示当前线程被请求)。为另一个线程创建的唯一 ctor 是接受 Thread 实例的那个。

    【讨论】:

    • 这与 Mattias 和我的测试相矛盾。我只是在 Reflector 中查看了它,并将 null 作为 targetThread 传递给“CaptureStackTrace”。然后它调用传入异常的“GetStackFramesInternal”。不过,我看不到“GetStackFramesInternal”的来源。
    • 是的,这很奇怪。在 Win32 中,NULL 表示“当前线程”,但在这里它似乎意味着别的东西。 GetStackFramesInternal 是在 MSCOREE.dll 中实现的...我查看了 SSCLI 源代码,在文件 \clr\src\vm\debugdebugger.cpp 中找到了实现: if (pException == NULL) { // Thread is NULL if这是当前线程。 data.TargetThread = pStackFrameHelper->TargetThread; GetStackFrames(NULL, (void*)-1, &data); } else { GetStackFramesFromException(&pException, &data); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2023-01-03
    • 1970-01-01
    • 2015-10-13
    相关资源
    最近更新 更多