Visual Studio 2010调试器单步调试出现问题?

4
当我进行托管的多线程代码调试时,如果我在Main/UnitTestRunner线程中设置断点并开始单步执行,有时调试器会切换到另一个线程并开始执行它的代码。我该如何停止这个操作?使用VS2010 + Resharper 5.1(如果相关的话)。更新1:在单步执行(F10)命令后,更仔细地查看堆栈显示,在调试器决定停止执行之前实际上执行了许多(10-30)个步骤。这种情况经常发生,使得调试几乎不可能。这与Hans所提到的问题非常相似。更新2:我在Microsoft Connect上提交了错误报告。如果您也遇到此问题,请“投票”支持。更新3:

微软已确认这是一个需要在下一个“服务发布”中修复的错误。解决方法是将单元测试定位到.NET 3.5,如此处所述。


我也偶尔见过这种情况,谢谢你的提问。 - Aaron Anodide
1
这也是在VS2008 SP1中出现的问题,可以通过热补丁解决。请在connect.microsoft.com上报告此问题。 - Hans Passant
3个回答

7

您可以转到线程视图并冻结其他线程。

调试 -> 窗口 -> 线程

然后右键单击要冻结的线程,选择“冻结”。当您想再次使用该线程时,请右键单击该线程并选择“解冻”。


Freeze会阻止调试器进入线程,还是完全停止线程运行?我需要后台线程继续运行,只是不想对它们进行调试。 - David Lynch
@David Lynch: 线程不能继续在后台运行,因为您可能会遇到在调试中无法复制实际程序执行的竞争条件。看起来 Visual Studio 试图在调试器中以与实际程序执行相同的顺序保持线程运行 - 您可以冻结您不使用的线程,但您的程序可能期望这些线程已经完成某些任务(或者反过来,如果它们保持运行,它们可能期望正在进行调试的内容完成某些任务),因此在进行调试时应谨慎。 - SqlRyan
@rwmnau:多线程应用程序本质上是异步的,即使在调试器中,线程也会以此方式运行。 - David Lynch
我无法冻结相关的线程,因为它们必须运行才能让主线程进入我正在调试的代码。 - David Lynch
@David:您应该能够根据需要冻结和解冻。也许可以参考上面Hans Passant的注释。 - Brian R. Bondy

0
除了Brian的答案之外 - 如果你的线程中的代码不重叠,你可以点击想要停止的下一行,然后点击“运行到光标处”。

0

如果你正在使用64位操作系统,请确保调试器设置默认为64位进程。在“调试 -> 选项和设置 -> TestDriven.Net -> 通用”下,确保“任何CPU测试”设置为在64位进程中运行。


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