Visual Studio,调试多个线程之一

Osk*_*lin 121 c# multithreading visual-studio-2010

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

i_a*_*orf 102

是.

在Threads窗口(Debug - > Windows - > Threads)中,右键单击所需的线程,然后选择"切换到线程".

您还可以选择"冻结"您不想调试的线程,以防止它们运行.但是,如果您希望它们能够工作,请不要忘记"解冻"它们.

进一步阅读.

  • 我糊涂了.答案是"不能做到的?" 问题是如何保持锁定到特定线程,以便调试器不会在它们之间跳转.切换到一个线程很好,但只要另一个线程执行某些操作,调试器就会跳转到它.如果我不能冻结另一个线程,因为它需要做的东西,那么我如何保持锁定只是我关心的线程? (22认同)

Ste*_*eve 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

  • “单步执行单个线程似乎在 VS 2012 中大部分已修复” - 不是真的,它在 VS2017 中仍然被破坏。 (2认同)

Cha*_*ana 10

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


Bor*_*ris 7

对于简单的情况,存在更快的解决方法 - 请参阅史蒂夫链接中的评论。

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

因此,在我的情况下,一旦各个线程开始命中我的断点,我只需按“继续”几次,直到确定我正在寻找的调用 - 然后删除断点并单步执行代码的其余部分,同时保持在同一线程上,不受来自其他线程的干扰其余的人。

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