Visual Studio,调试多个线程之一

时间:2010-10-10 19:03:23

标签: c# multithreading visual-studio-2010

我有一个4个线程的应用程序使用相同的代码。但是,当我迈步时,它会在不同的线程之间跳转。如何将其锁定到一个线程,以便其他线程被忽略进行调试?

7 个答案:

答案 0 :(得分:102)

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

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

Further reading

答案 1 :(得分:16)

通过单个线程的单步执行似乎主要在VS 2012中修复(您可以在下面的链接中看到一些警告)。断点很痛苦。

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

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

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

这可能非常繁琐。

我对Microsoft的建议是将单步执行(及其变体)修改为永不切换线程,除非在另一个线程中遇到显式断点。他们还应该添加一个快捷方式(可能是Ctrl-F9)来创建一个断点,当前线程id作为其过滤器。这将使第二个工作流程更加方便。

如果您同意这项建议有用,请投票通知该建议,或添加您自己的建议:

https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/8543248-make-the-debugger-stick-to-the-current-thread-inst

答案 2 :(得分:10)

您还可以在代码中放置一个条件断点,并将thread.Id == [someValue]Thread.Name == "[Somename]"置于断点条件中...

答案 3 :(得分:2)

这非常类似于Visual Studio 2008 SP1中的一个非常类似的问题。它是使用SP后修复程序修复的。但还有其他证据表明此修补程序没有合并到代码库中,这feedback item也是一个问题。对于修补程序而言,集成回来并不是很常见。

没有一个反馈项能准确描述您的问题,至少我能找到。我建议你提交一个。鉴于重现此类错误的常见问题,我强烈建议您包含一个展示此问题的复制项目以及如何重现该问题的说明。

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

对于简单案例,存在更快的解决方法 - 请参阅Steve链接中的评论。

  

调试器只会在创建步骤的线程上完成一个步骤。因此,如果您点击断点,禁用它,然后开始踩踏,您不应该停在另一个线程上。如果你的应用程序中有其他断点而另一个线程遇到一个断点,那么你将按照描述的混合线程状态进行调试

所以在我的情况下,一旦各个线程开始命中我的断点,我只是点击Continue几次,直到我找到了我正在寻找的调用 - 然后删除断点并逐步执行其余代码,同时保持在同一个线程不受其他人的干扰。

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

答案 6 :(得分:0)

5。单步执行一个线程而无需跳动

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

  1. 禁用或删除调试器切换到的新线程所命中的断点。
  2. 继续(F5)
  3. 观察第一个线程的第一步是如何完成,现在是活动的调试上下文。
  4. 由于删除或禁用了断点,因此您可以继续踩单线程而不会受到干扰。

7 lesser known hacks for debugging in Visual Studio