我有一个应用程序与4个线程工作相同的代码。但是,当我单步执行时,它会在不同的线程之间跳转。如何将其锁定到一个线程,以便忽略其他线程进行调试?
是的。
在“线程”窗口(Debug-> Windows-> Threads)右键单击所需的线程,并选择“切换到线程”。
还可以选择“冻结”不想调试的线程,以防止它们运行。但是,如果你希望他们工作,别忘了“解冻”他们。
进一步阅读。
您还可以在代码中放置一个条件断点,并将 thread.Id == [someValue]或 Thread.Name == "[Somename]"放置在断点条件中..。
thread.Id == [someValue]
Thread.Name == "[Somename]"
这非常类似于 VisualStudio2008SP1中的一个非常类似的问题。这是固定的后 SP 修补程序。但是还有其他证据表明修补程序没有被合并到代码库中,这个 反馈项目也是一个问题。修补程序没有被集成回来并不罕见。
没有一个反馈条目能准确描述你的问题,至少我能找到。我建议你提交一份。考虑到像这样重现 bug 的常见问题,我强烈建议您包含一个重现项目,该项目展示了这个问题,并提供了如何重现这个问题的说明。
对于你的问题有一个解决方案,你可以进入 Debug + Windows + Threads,右键单击你不想调试的线程,然后选择急冻。别忘了待会儿把它们解冻。
这些 bug 在 VisualStudio2010ServicePack1中再次修复。
在 VS2012中,单步执行单个线程似乎大部分是固定的(附带一些警告,你可以在我下面的链接中看到)。断点是一种痛苦。
冻结和解冻线程是通常的解决办法,正如以前的答案所述,但它是乏味的,并且当您的线程等待另一个被冻结的线程时,它可能会导致挂起。这些可能很难恢复,而不失去你的地位,在你的利益线索。
另一个有用的工作流程是在断点上应用一个线程过滤器,在一些答案中也有提到:
创建一个断点,右键单击该断点,单击 Filter,然后输入 ThreadId = 7740(线程窗口中的线程 ID)。
这会很无聊的。
我对微软的建议是,修正单步执行(及其变体) ,除非在另一个线程中碰到明确的断点,否则永远不要切换线程。它们还应该添加一个快捷方式(可能是 Ctrl-F9) ,以创建一个断点,并将当前线程 ID 作为其筛选器。这将使第二个工作流程更加方便。
如果你认为这个建议有用,请投票表决,或者加上你自己的建议:
Https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/8543248-make-the-debugger-stick-to-the-current-thread-inst
对于简单的案例,有一个更快的解决方案——请参阅 Steve 链接中的评论。
调试器只会完成发起步骤的线程上的一个步骤。因此,如果遇到断点,禁用它,然后开始单步执行,则不应在另一个线程上停止。如果您的应用程序中有其他断点,并且另一个线程命中了一个断点,那么您将处于所描述的混合线程状态进行调试
所以在我的例子中,一旦不同的线程开始到达我的断点,我只需要点击“继续”几次,直到我确定了我正在寻找的调用——然后移除断点,逐步通过剩下的代码,同时保持在同一个线程上,不受其他线程的干扰。
如果你想保留多个断点等等,这显然会成为一个问题-但是对于简单的情况,这是很容易做到的。
我正在使用 VisualStudioProfessional2017,并且使用 Threads 窗口选择性地冻结和解冻线程。通常我有相同代码的多个线程,我只想冻结它们,而不是其他线程。我实际上喜欢 MSThreads 窗口,因为我可以选择要冻结的线程子集。我按名称对线程进行分组,然后可以在调试时冻结所有运行相同代码的线程,同时让剩余的线程运行。我尝试使用 Erwin Mayer 扩展,它工作得非常好,但是它冻结了所有线程,除了我正在运行的那个线程,有时我会遇到一种情况,当调试没有达到我认为应该达到的断点时,然后因为所有其他线程都停止了,应用程序似乎停止了。按下暂停按钮,解冻线程窗口中的线程就可以解决这个问题。
5. 只穿过一根线,不要跳来跳去 多久调试一次多线程代码 第一个断点,走一步,然后突然停止 另一个线程上的黄色箭头? 意想不到的行为来自 仍在设置并因此命中的断点。默认情况下, 调试器每次命中断点时都会停止。这意味着 当您执行一个步骤时,所有线程都可以运行,其中一个线程 上运行的线程在步骤完成之前到达此断点 下次你遇到这种情况的时候试试这个: 禁用或删除被调试器切换到的新线程命中的断点。 按 继续(F5) 观察第一个线程上的第一个初始步骤是如何完成的,现在是活动调试上下文。 由于已删除或禁用断点,因此可以继续单步执行该线程,而不会中断。
5. 只穿过一根线,不要跳来跳去
多久调试一次多线程代码 第一个断点,走一步,然后突然停止 另一个线程上的黄色箭头? 意想不到的行为来自 仍在设置并因此命中的断点。默认情况下, 调试器每次命中断点时都会停止。这意味着 当您执行一个步骤时,所有线程都可以运行,其中一个线程 上运行的线程在步骤完成之前到达此断点 下次你遇到这种情况的时候试试这个:
7个较少为人所知的在 VisualStudio 中进行调试的技巧