有没有办法查看跨多个线程的完整堆栈跟踪?

Is there any way to see the full stack trace across multiple threads?

在C#多线程编程中,方法A()在新线程中调用方法B()时,例如通过使用这样的东西:

Task A()
{
    // ...

    // I want B to run in parallel, without A() waiting for it.
    Task.Factory.StartNew(B); 
}

void B()
{
     // I attach a debugger here to look at the Call Stack.
     // But that is empty and I can't see that A() actually called it (logically).

     // Also Environment.StackTrace is pretty much empty of that path.
}

换句话说,在方法 B() 内部,堆栈跟踪对方法 A() 的调用路径一无所知,后者又触发了方法 B().[=18 的执行=]

有没有办法查看完整的逻辑堆栈跟踪,例如在异常的情况下 B() 你可以看全文知道 A() 实际上调用了吗?

一般答案是No,因为根据定义StackTrace不能包含来自其他堆栈的信息。但是,如果您在 Visual studio 中调试您的应用程序,它会为您做一些工作(这是 C++,但所有语言都相似):

这里,外部代码比你的暗淡,你可以查看一些“父”线程信息。但是,通常此屏幕并没有太大帮助。 Visual studio 创建 vshost.exe 文件以收集尽可能多的调试信息。

此外,如果您创建任务时将它们附加到父级,并且存在一些异常,您将获得带有异常 ToString 方法的完整堆栈跟踪,但这仍然不是您想要的。