2010-10-10 66 views
93

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

+0

您正在使用哪个版本的Visual Studio? Express,Pro,Ultimate ..? – Mark 2010-10-10 19:06:47

+0

@Mark我正在使用终极 – 2010-10-10 19:09:06

+0

然后jeffamaphone的链接将有所帮助,也许这也是为了进一步的信息切换到另一个线程,同时调试http://msdn.microsoft.com/en-us/library/bb157786.aspx – Mark 2010-10-10 19:10:57

回答

85

是的。

在线程窗口(调试 - >视窗 - >线程)右键单击你想要的线程,然后选择“切换到线程”。

您也可以选择你不想为了调试,让他们从运行的线程“冻结”。但是,如果你期望他们能够工作,不要忘记“解冻”他们。

Further reading

+14

我困惑。答案是“它不能做到?”该问题询问如何保持锁定到特定的线程,以便调试器不会在它们之间跳来跳去。切换到一个线程是好的,但是一旦另一个线程执行了某个操作,调试器就会跳转到该线程。如果我无法冻结另一个线程,因为它需要做些什么,那么我该如何锁定我所关注的线程? – bubbleking 2016-02-10 16:32:41

+0

Incomeplete:|你必须始终点击切换到,每次发生什么事 – deadManN 2017-01-07 06:20:45

9

你也可以把你的代码条件断点,并把thread.Id == [someValue]Thread.Name == "[Somename]"在断点条件...

+0

谢谢查尔斯,这是有帮助的(不知道你可以做到这一点)。然而,我调试的最有效方式是jeffamaphone编写的,因为我不知道它的名字,然后它遇到了断点,并且看到了一些值 – 2010-10-10 19:17:44

2

这非常类似于在Visual Studio中  2008年  SP1中的一个非常类似的问题。它是用SP后修补程序修复的。但是还有其他证据表明这个修补程序没有被纳入代码库,这个feedback item也是一个问题。修复程序无法集成回来并不罕见。

没有一个反馈产品,恰好说明你的问题,至少,我可以找到。我建议你申请一个。考虑到重现此类错误的常见问题,我强烈建议您包含一个展示此问题的复制项目,并说明如何重现问题。

有各种各样的对您的问题解决方法,你可以进入调试+的Windows +主题,用鼠标右键单击您不想调试线程并选择冻结。不要忘记稍后解冻它们。

这些错误是通过一个单独的线程在Visual Studio再次固定2010 Service Pack 1的

14

单步执行似乎大多固定VS 2012(有一些注意事项,你可以在我下面的链接查看)。断点是一种痛苦。

冷冻和解冻线程是通常的解决方法,因为以前的答案都表示,但它是单调乏味的,当你的线程上被冻结另一个线程等待它可能会导致挂起。这些可能很难从你感兴趣的话题中失去你的位置而恢复。

另一个有用的工作流程是:在你的断点,在一些问题的答案还指出应用线程过滤器:

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

+0

“在VS 2012中单步执行单个线程似乎大部分都是固定的” - 不是真的,它在VS2017中仍然存在。 – user626528 2018-01-25 22:46:20

0

一个快得多的解决方法存在简单的情况 - 看到史蒂夫的环评。

调试器将只能完成步骤的源头所在的线程上的一个步骤。所以如果你打到一个断点,禁用它,然后开始步进,你不应该停在另一个线程上。如果您还有其他的断点在您的应用程序,而另一个线程命中一个,那么你将在混合线程状态调试为在我的情况描述

所以一旦各个线程开始打我的断点,我刚打继续几直到我确定了我正在寻找的调用 - 然后删除断点,并在保持同一线程的同时逐步完成代码的其余部分,而不受其余部分的干扰。

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