C# Visual Studio,调试多个线程之一

C# Visual Studio,调试多个线程之一,c#,multithreading,visual-studio-2010,C#,Multithreading,Visual Studio 2010,我有一个应用程序,有4个线程使用相同的代码。然而,当我跨步时,它会在不同的线程之间跳跃。如何将其锁定到一个线程,以便在调试时忽略其他线程 是的 在“线程”窗口(调试->窗口->线程)中右键单击所需的线程并选择“切换到线程” 您还可以对不想调试的线程选择“冻结”,以阻止它们运行。但是,如果你希望他们工作,别忘了“解冻”他们 这与VisualStudio2008 SP1中的一个非常类似的问题非常相似。它已通过后SP修补程序修复。但是还有其他证据表明修补程序没有被纳入代码库,这也是一个问题。热修复程

我有一个应用程序,有4个线程使用相同的代码。然而,当我跨步时,它会在不同的线程之间跳跃。如何将其锁定到一个线程,以便在调试时忽略其他线程

是的

在“线程”窗口(调试->窗口->线程)中右键单击所需的线程并选择“切换到线程”

您还可以对不想调试的线程选择“冻结”,以阻止它们运行。但是,如果你希望他们工作,别忘了“解冻”他们


这与VisualStudio2008 SP1中的一个非常类似的问题非常相似。它已通过后SP修补程序修复。但是还有其他证据表明修补程序没有被纳入代码库,这也是一个问题。热修复程序无法重新集成并不是什么稀奇的事情

至少我能找到,没有一个反馈项目能准确描述你的问题。我建议你提交一份。考虑到像这样的复制bug的常见问题,我强烈建议您包括一个显示此问题的复制项目,以及关于如何复制此问题的说明

对于您的问题,有一种解决方法,您可以进入Debug+Windows+Threads,右键单击您不想调试的线程,然后选择Freeze。以后别忘了把它们解冻


这些错误在Visual Studio 2010 Service Pack 1中再次修复。

单线程单步执行在VS 2012中似乎基本上已修复(您可以在下面的链接中看到一些注意事项)。断点是一种痛苦

正如前面的回答所述,冻结和解冻线程是常见的解决方法,但这很繁琐,而且当线程等待另一个冻结的线程时,它可能会导致挂起。如果你不失去在你感兴趣的线索中的位置,这些可能很难恢复

另一个有用的工作流是在断点上应用线程过滤器,这在一些答案中也有说明:

创建一个断点,右键单击断点,单击Filter,然后输入ThreadId=7740(threads窗口中的线程id)

这可能非常乏味

我给微软的建议是,修复单步执行(及其变体),除非在另一个线程中命中显式断点,否则决不切换线程。他们还应该添加一个快捷方式(可能是Ctrl-F9)来创建一个断点,并将当前线程id作为其筛选器。这将使第二个工作流更加方便

如果您同意这一建议会有用,请投票支持该建议,或者添加您自己的建议:


对于简单的案例,有一种更快的解决方法-请参见Steve链接中的注释

调试器将只在发起该步骤的线程上完成该步骤。因此,如果遇到断点,请禁用它,然后开始单步执行,不应在其他线程上停止。如果您的应用程序中有其他断点,而另一个线程命中了一个断点,那么您将在混合线程状态下进行调试,如下所述

因此,在我的例子中,一旦不同的线程开始命中我的断点,我只需点击Continue几次,直到我识别出我正在寻找的调用,然后删除断点并逐步遍历代码的其余部分,同时保持在同一线程上,而不会受到其他线程的干扰


如果要保留多个断点,这显然会成为一个问题,等等。但是对于简单的情况,这更容易做到。

我使用的是Visual Studio Professional 2017,我使用“线程”窗口有选择地冻结和解冻线程。通常我有多个相同代码的线程,我只想冻结它们,不想冻结其他线程。实际上,我喜欢MS Threads窗口,因为我可以选择要冻结的线程子集。我按名称对线程进行分组,然后可以冻结所有在调试时运行相同代码的线程,同时让其余线程运行。我尝试使用Erwin Mayer扩展,它工作得很好,但它冻结了除我正在运行的线程之外的所有线程,有时我会遇到调试没有达到断点的情况,我认为应该这样做,因为所有其他线程都已停止,应用程序似乎已停止。点击“暂停”按钮,然后在“线程”窗口中解冻线程,可以修复该问题

5。单步执行一个线程,不要跳转

当您点击 第一个断点,迈出一步,然后突然停止 另一根线上的黄色箭头?意外的行为来自于 断点仍在设置中,因此被命中。默认情况下, 调试器将在遇到断点时停止。这意味着 当您执行一个步骤时,所有线程都可以运行,其中一个 您正在运行的线程在上的步骤完成之前到达此断点 您当前的线程。下次遇到这种情况时,请尝试以下方法:

  • 禁用或删除被调试器切换到的新线程命中的断点
  • 继续(F5)
  • 观察第一个线程上的第一步是如何完成的,现在是活动调试上下文
  • 由于断点已被删除或禁用,因此您可以继续在该单个线程上执行操作而不会中断

  • 您使用的是哪个版本的Visual Studio?快车、专业车、终极车?然后jeffamaphone的链接会有所帮助,也许这也会为调试时切换到另一个线程提供更多信息,请参阅相关讨论:谢谢Charles,这很有帮助(不知道您可以这么做)。然而,对我来说,最有效的调试方法是使用jeffamaphone