3

在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()这反过来又触发execute方法B()的东西。

是否有任何方法可以看到全逻辑堆栈跟踪,例如,在B()的例外情况下,您可以看到完整的故事,知道A()实际上被称为它吗?

+0

@SimonPrice,这就是一般调试多线程程序的方法。 OP正在寻找一种方法来找出哪个线程(和调用堆栈到那个点)开始另一个线程/计划一个任务,如果该任务抛出异常。有什么更具体的? –

+0

我已经更新了更多的细节问题。您可以在Visual Studio中轻松创建这个场景以自行查看。 – Paymon

+0

我在UWP应用程序中测试这个,如果有帮助的话。 – Paymon

回答

1

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

enter image description here

这里,外部代码比你的调光器,并你可以查看一些“父母”线程信息。但是,通常这个屏幕并没有太大的帮助。 Visual Studio创建vshost.exe文件以收集尽可能多的调试信息。另外,如果您创建任务并将它们附加到父项,并且存在一些异常,则将得到完整的堆栈跟踪,但是异常的ToString方法仍然存在,但仍不完全符合您的要求。

+1

我最终创建了自己的SynchronizationContext来跟踪嵌套的线程调用。 – Paymon

+0

@Paymon你能详细解释一下你最终得到的结果吗? –

+0

这有点太复杂,无法解释。我几乎在我们的框架中围绕多线程设计了一个完整的API来使其工作。我怀疑你想去那里。 – Paymon

相关问题