有没有办法查看跨多个线程的完整堆栈跟踪?
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
方法的完整堆栈跟踪,但这仍然不是您想要的。
在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
方法的完整堆栈跟踪,但这仍然不是您想要的。