Visual Studio,调试多个线程之一


127

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


您正在使用哪个版本的Visual Studio?Express,Pro,Ultimate ..?
标记

那么jeffamaphone的链接会有所帮助,也许这也有助于进一步信息,以便在调试msdn.microsoft.com/en-us/library/bb157786.aspx时
标记

Answers:


107

是。

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

您也可以在不想调试的线程上选择“冻结”,以防止它们运行。但是,如果您希望它们能够工作,请不要忘记对其进行“解冻”。

进一步阅读


24
我很困惑。答案是“无法完成?” 该问题询问如何保持锁定到特定线程,以便调试器不会在它们之间跳来跳去。切换到线程是可以的,但是只要另一个线程执行了某项操作,调试器就会跳转到该线程。如果由于需要执行其他操作而无法冻结另一个线程,那么如何仅将其锁定在所关注的线程上?
Bubbleking '16

收入:| 每当发生任何事情时,您都必须始终单击“切换到”
deadManN

16

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

如先前的回答所述,冻结和解冻线程是通常的解决方法,但这很繁琐,当您的线程等待另一个被冻结的线程时,它可能导致挂起。在不失去自己感兴趣的位置的情况下,很难恢复这些。

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

创建一个断点,右键单击该断点,单击“筛选器”,然后输入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


1
“单步执行单个线程似乎在VS 2012中已基本修复”-并非如此,在VS2017中仍然存在问题。
user626528

10

您还可以在代码中添加条件断点,然后将thread.Id == [someValue] 或设置Thread.Name == "[Somename]"为断点条件...


感谢Charles,这很有帮助(不知道您可以做到这一点)。但是,对我来说,调试的最有效方法是jeffamaphone编写的一种方法,因为我不知道该名称在到达断点之前就已经看到了一些值
Oskar Kjellin 2010年

3

对于简单的情况,存在一种更快的解决方法-请参阅Steve链接中的注释。

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

因此,在我的情况下,一旦各个线程开始到达我的断点,我就单击“继续”几次,直到我确定了我要寻找的呼叫-然后删除了断点并逐步执行了其余代码,同时保留在同一线程上,而不会受到干扰其余的。

如果您要保留多个断点,这显然会成为问题,等等。但是同样,对于简单的情况,这要容易得多。


2

这非常类似于Visual Studio 2008 SP1中的一个非常类似的问题。它已通过SP后修补程序修复。但是还有其他证据表明此修补程序未合并到代码库中,此反馈项也是一个问题。不将修补程序重新整合回原来的情况并不罕见。

至少没有我能找到的反馈项目能够准确描述您的问题。我建议您提出一个。鉴于此类重现bug的常见麻烦,我强烈建议您包括一个重现此问题的重现项目,并提供有关如何重现此问题的说明。

有一个针对您问题的解决方法,您可以进入Debug + Windows + Threads,右键单击您不想调试的线程,然后选择Freeze。不要忘记稍后解冻。

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


1

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


0

5.单步执行一个线程而不用跳来跳去

当您遇到第一个断点并执行某个步骤,然后突然停下另一个线程上的黄色箭头时,您将调试多线程代码多久进行一次?意外行为来自仍然设置的断点,因此被命中。默认情况下,调试器将在命中时在断点处停止。这意味着当您执行一个步骤时,所有线程都可以运行,并且其中一个正在运行的线程会在该步骤在当前线程上完成之前达到此断点。下次遇到这种情况时,请尝试以下操作:

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

在Visual Studio中进行调试的7种鲜为人知的技巧

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.