3

我正在Microsoft Visual C#2008 Express Edition中编写多线程Windows应用程序。最近,调试器一直在奇怪地行事。为什么Microsoft Visual C#2008速成版调试器随机退出?

当我使用F10跨越代码行时,有时它会像继续命令(F5)一样解释我的Step Over(F10)命令,然后程序将继续运行并完成调试会话。

有谁知道为什么会发生这种情况? Step Over命令会在什么情况下导致调试器停止运行?

调试的代码不是问题:它不仅发生在特定的代码行上。它发生在每次运行调试器时不同的随机行上。

这不是我的键盘问题:同样的事情发生时,我只需点击调试工具栏中的跳过。

这可能是我的程序中的其他线程的问题。也许其中之一是随机做一些有中断调试器的副作用。那可能吗?

在此先感谢!

回答

4

你应该看看这个KB article并考虑它的匹配修补程序。

编辑:修补程序确实解决了这些类型的调试问题。不幸的是,该修补程序的源代码更改没有将其重新带回到主分支,而VS2010也出现了完全相同的问题。这再次通过其Service Pack 1纠正。

+0

谢谢!我没有机会确认此修补程序的工作原理,但似乎应该是因为他们提到了我遇到的完全相同的问题。 – 2009-04-22 19:22:06

4

我已经看过几次了。它通常发生在有上下文切换到另一个线程时。因此,您可能正在通过ID 11的线程,您按F10,并且有一个先发制人的上下文切换,因此您现在正在线程ID 12上运行,因此Visual Studio快乐地允许代码继续。

有一些很好的调试技巧here

提示:打破只有当特定线程调用的方法:要设置每个线程断点,需要唯一标识你给特定线程一个带有Name属性的名字。您可以通过创建条件表达式(如“ThreadToStopOn”== Thread.CurrentThread.Name)来设置线程的条件断点。

您可以通过观察变量“myThread”并在值窗口中输入名称值来手动更改监视窗口中的线程名称。如果您没有当前线程变量可以使用,则可以使用Thread.CurrentThread.Name来设置当前线程的名称。 Thread类中还有一个私有整数变量DONT_USE_InternalThread,这对每个线程都是唯一的。您可以使用“线程”窗口访问要停止的线程,并在“监视”窗口中输入Thread.CurrentThread.DONT_USE_InternalThread以查看其值,以便创建正确的条件断点表达式。

编辑:也有一些很好的提示here。我发现这一点通过搜索'视频工作室在调试时防止线程切换'。

+1

快速版没有“线程”窗口。不过,线程名称的条件转折点听起来很有趣。 – 2008-11-22 06:12:50

1

我发现使用日志文件处理多个线程时非常方便。

调试线程就像Huysenberg原则 - 仔细观察,你会改变结果!