如何在调试时让Visual Studio保持在一个线程上?

42

当我在Visual Studio中进行调试时,出现某个线程的调试时,Visual Studio会自动跳到不同的线程。

如何更改这种行为使其停留在同一线程?

4个回答

29
当您说“在调试某个线程时,Visual Studio会随机跳转到不同的线程”,您是指在特定线程上逐步执行代码时,可能会在不同的线程上命中断点吗?
如果是这样,您可以使用“线程”窗口来“冻结”除您要调试的线程之外的其他线程:
http://msdn.microsoft.com/en-us/library/w15yf86f.aspx
从“线程”窗口,您可以设置活动线程。此外,您还可以冻结或解冻每个单独的线程的执行。冻结会阻止线程的执行。解冻使其继续。两个垂直蓝条标识一个冻结的线程。
对此的支持可能取决于您所拥有的Visual Studio版本(例如,我认为Express版本不支持“线程”窗口)。

2
在调试时,当我遇到断点时,我会进入线程窗口,冻结所有线程,然后只解冻当前线程。这样,我就可以继续调试我正在处理的线程。 - Dominique
1
对于那些找不到此窗口的人,请转到工具栏 > 调试 > 窗口 > 线程(或 Ctrl + Alt + H)。从那里,您可以右键单击线程并冻结/解冻它。 - Mr.Z

10
所有的答案都谈论了冻结线程,但当有很多线程时,冻结它们变得麻烦,而且你不知道应该冻结哪一个。我发现了一个更简单的技巧。
当线程i触发断点时,例如j、k等线程将在某个时间内也会触发同样的断点,然后暂时禁用断点并开始调试线程i。我发现调试器不会跳到其他线程上,因为对于这些线程没有断点可以进入。完成调试后启用断点。

1
问题在于,如果您正在调试某个线程将数据传递给另一个线程的情况... - stu

7

我认为这是默认设置,因为在调试器中运行程序不应该改变程序的结果。

当程序正在“实时”运行时,它不断地在线程之间切换,所以如果调试器没有做同样的事情,程序就会表现出不同的行为。

无论如何,我知道防止这种情况的唯一方法是打开线程窗口,右键单击除当前线程以外的所有其他线程,然后选择freeze。(记得之后再thaw它们)


2
这很有道理...但并不改变它非常令人恼火的事实。 :) 如果微软添加了一个配置选项,在断点被触发时保持在当前线程内,那么对于调试会很有帮助...这样,在执行逻辑时可以进行调试,而不必为调试冻结线程的程序而感到繁琐和延迟。 - Jon
1
我并不反对,但一个显而易见的反驳是,在调试时,你也没有使用真正的生产应用程序,因为你可能还没有使用优化编译你的调试版本应用程序。如果你正在寻找逻辑问题,更好地控制调试器比严谨正确更有用。 - stu

4

通常,我通过在线程面板上右键单击来冻结其他线程。不过,我不确定这样做是否合理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接