【发布时间】:2016-10-06 13:11:18
【问题描述】:
当我在等待的方法主体中设置断点时,Visual Studio 调试器会显示一个调用堆栈,其中没有任何 C# 编译器生成的代码。
请看下图,它显示了我简单的async 方法和调用堆栈。
请注意,在调用堆栈中没有调用MoveNext 或初始化状态机对象或TaskAwaiter<TResult> 或AsyncTaskOfTMethodBuilder。
为什么会这样?就像 IL Spy 中的一样,Visual Studio 中是否有一些设置可以切换,以便在调试会话正在进行时让它在调用堆栈和编辑器中显示状态机代码?
我突然想起在重写的按钮单击处理程序代码中有一个DebuggerStepThroughAttribute,用于实例化状态机。但我不确定这是否是它对调试器隐藏的原因。这不应该只是将调用堆栈中编译器生成的方法的堆栈框架变灰吗?
DebuggerHiddenAttribute 不是让代码对调试器不可见吗?
【问题讨论】:
-
你的断点在另一个线程上运行的任务中,为什么会有创建那个线程的调用堆栈的证据?您是否检查了可以在调试器中获得的单独线程窗口?我不记得名字了,但是你可以打开一个窗口/窗格来显示程序中所有线程的状态。
-
但是,问题是按钮单击事件处理程序方法暂时完成了。它已经返回,这可能发生在额外线程启动期间的前几毫秒,这意味着不仅运行任务的线程的调用堆栈不会显示按钮事件处理程序,而且您正在寻找的方法很可能已经返回。
标签: .net visual-studio async-await visual-studio-2015