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

Posted

技术标签:

【中文标题】调试时如何让 Visual Studio 保持在一个线程上?【英文标题】:How do I get Visual Studio to stay on one thread when debugging? 【发布时间】:2010-11-07 04:42:56 【问题描述】:

当我在 Visual Studio 中调试时,出于某种原因,在调试某个线程时,Visual Studio 会跳转到不同的线程。

如何更改行为以使其位于同一线程上?

【问题讨论】:

【参考方案1】:

这里所有的答案都是关于冻结线程,但是当线程很多时它会变得很麻烦,而且你不知道要冻结哪一个。我找到了一个更简单的技巧。

当断点被线程 i 击中时,说 jk 等在某些情况下会击中相同的时间,然后暂时禁用断点并开始调试线程i。我看到调试器不会跳到其他线程,因为对于这些线程,没有断点可以中断。完成调试后启用断点。

【讨论】:

问题是,如果您正在调试一个线程将数据传递给另一个线程的东西......【参考方案2】:

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

当程序“实时”运行时,它会不断在线程之间切换,因此如果调试器不这样做,程序的行为就会不同。

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

【讨论】:

这是有道理的......但并没有改变它非常烦人的事实。 :) 如果MS添加了一个配置选项以在断点被命中时留在当前线程中,这将对调试很有帮助......这样,当时正在执行的逻辑可以被调试,而没有繁琐和关联调试具有冻结线程的程序时出现延迟。 我不反对,但一个明显的反驳论点是,当你在调试时,你也不是在使用你真正的生产应用程序,因为你可能没有编译你的调试版本应用程序上的优化。如果您正在寻找一个逻辑问题,更好地控制调试器比学究式的正确要有用得多。【参考方案3】:

当您说“在调试某个线程时,Visual Studio 将随机跳转到不同的线程”,您的意思是当您单步执行特定线程上的代码时,您可能会在另一个线程上遇到断点?

如果是这样,您可以使用“线程”窗口“冻结”除您有兴趣调试的线程之外的线程:

来自http://msdn.microsoft.com/en-us/library/w15yf86f.aspx:

在“线程”窗口中,您可以设置 活动线程。此外,你 可以冻结或解冻执行 每个单独的线程。冷冻 阻止线程的执行。 解冻使其能够继续。二 垂直的蓝色条表示冻结 线程。

对此的支持可能取决于您拥有的 Visual Studio 版本(例如,我认为 Express 版本不支持线程窗口)。

【讨论】:

在调试时,当我遇到断点时,我进入线程窗口,冻结所有线程,只解冻当前线程。像这样,我只能继续调试我正在处理的线程。 如果找不到此窗口,请转到工具栏 > 调试 > 窗口 > 线程(或 Ctrl + Alt + H)。从那里你可以右键单击一个线程并冻结/解冻它。【参考方案4】:

通常,我通过在线程面板中单击鼠标右键来冻结其他线程。我不知道这是否理智。

【讨论】:

以上是关于调试时如何让 Visual Studio 保持在一个线程上?的主要内容,如果未能解决你的问题,请参考以下文章

在调试模式下执行控制台应用程序后,如何让 Visual Studio 暂停?

加载 Visual Studio 2015 C++ 项目时出错,如何调试

如何让 Visual Studio 在调试时使用嵌入式源代码?

程序终止时如何让 Visual Studio 不关闭终端窗口?

在Visual Studio 2013中进行调试时,Azure Compute Emulator无法启动,保持关闭状态

visual studio 2008 在编写C程序语言时,为啥调试窗口自动瞬间关闭?