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

时间:2017-01-28 10:15:23

标签: c# multithreading async-await task-parallel-library visual-studio-debugging

在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()的执行。

有没有办法查看完整逻辑堆栈跟踪,例如对于B()中的例外情况,您可以看到实际上知道A()的完整故事吗?

1 个答案:

答案 0 :(得分:1)

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

enter image description here

在这里,外部代码比你的更暗,你可以查看一些" parent"线程信息。但是,通常这个屏幕没什么用处。 Visual Studio创建vshost.exe文件以收集尽可能多的调试信息。

此外,如果您创建任务并将其附加到父级,并且存在一些异常,那么您将使用异常ToString方法获得完整的堆栈跟踪,但仍然可以使用#{1}}方法。不完全是你想要的。