我有一个4个线程使用相同代码的应用程序。但是,当我步进时,它会在不同线程之间跳转。如何将其锁定到一个线程,以便其他线程在调试时被忽略?
我有一个4个线程使用相同代码的应用程序。但是,当我步进时,它会在不同线程之间跳转。如何将其锁定到一个线程,以便其他线程在调试时被忽略?
Answers:
是。
在“线程”窗口(调试-> Windows->线程)中,右键单击所需的线程,然后选择“切换到线程”。
您也可以在不想调试的线程上选择“冻结”,以防止它们运行。但是,如果您希望它们能够工作,请不要忘记对其进行“解冻”。
在VS 2012中,单步执行单个线程似乎已基本修复(有些注意事项可以在下面的链接中看到)。断点很痛苦。
如先前的回答所述,冻结和解冻线程是通常的解决方法,但这很繁琐,当您的线程等待另一个被冻结的线程时,它可能导致挂起。在不失去自己感兴趣的位置的情况下,很难恢复这些。
另一个有用的工作流程是在断点上应用线程过滤器,一些答案中也提到了这一点:
创建一个断点,右键单击该断点,单击“筛选器”,然后输入ThreadId = 7740(您从线程窗口中获得的线程ID)。
这可能非常乏味。
我对Microsoft的建议是修复单步执行(及其变体),以免切换线程,除非在另一个线程中遇到显式断点。他们还应该添加一个快捷方式(可能是Ctrl-F9)以使用当前线程ID作为其过滤器来创建断点。这将使第二个工作流程更加方便。
如果您同意此建议会有用,请投票建议,或添加自己的建议:
您还可以在代码中添加条件断点,然后将thread.Id == [someValue]
或设置Thread.Name == "[Somename]"
为断点条件...
这非常类似于Visual Studio 2008 SP1中的一个非常类似的问题。它已通过SP后修补程序修复。但是还有其他证据表明此修补程序未合并到代码库中,此反馈项也是一个问题。不将修补程序重新整合回原来的情况并不罕见。
至少没有我能找到的反馈项目能够准确描述您的问题。我建议您提出一个。鉴于此类重现bug的常见麻烦,我强烈建议您包括一个重现此问题的重现项目,并提供有关如何重现此问题的说明。
有一个针对您问题的解决方法,您可以进入Debug + Windows + Threads,右键单击您不想调试的线程,然后选择Freeze。不要忘记稍后解冻。
这些错误已在Visual Studio 2010 Service Pack 1中再次得到修复。
我正在使用Visual Studio Professional 2017,并且使用``线程''窗口有选择地冻结和解冻线程。通常,我有多个具有相同代码的线程,我只想冻结它们,而不冻结其他线程。我实际上很喜欢“ MS线程”窗口,因为我可以选择要冻结的线程子集。我按名称对线程进行分组,然后可以冻结所有与我调试时运行相同代码的线程,同时让其余线程运行。我尝试使用Erwin Mayer扩展,效果很好,但是它冻结了除我正在运行的线程之外的所有线程,有时我遇到一种情况,即调试没有达到我认为应该的断点,然后,因为所有其他线程已停止,应用程序似乎已停止。点击暂停按钮,然后在“线程”窗口中解冻线程可解决此问题。
5.单步执行一个线程而不用跳来跳去
当您遇到第一个断点并执行某个步骤,然后突然停下另一个线程上的黄色箭头时,您将调试多线程代码多久进行一次?意外行为来自仍然设置的断点,因此被命中。默认情况下,调试器将在命中时在断点处停止。这意味着当您执行一个步骤时,所有线程都可以运行,并且其中一个正在运行的线程会在该步骤在当前线程上完成之前达到此断点。下次遇到这种情况时,请尝试以下操作:
- 禁用或删除调试器切换到的新线程所命中的断点。
- 按继续(F5)
- 观察在第一个线程上完成的第一步的第一步,现在是活动的调试上下文。
- 由于您的断点已被删除或禁用,因此您可以继续踩单线程而不会受到干扰。