为什么Microsoft Visual C#2008 Express Edition调试器会随机退出?

我正在使用Microsoft Visual C#2008 Express Edition编写一个multithreadingWindows应用程序。 最近,调试器一直表现得很奇怪。

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

有谁知道为什么会这样? 在什么情况下,Step Over命令会导致调试器停止?

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

这对我的键盘来说不是问题:当我在Debug工具栏中单击Step Over时,会发生同样的事情。

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

提前致谢!

您应该查看此知识库文章并考虑其匹配的修补程序。

编辑:该修补程序确实解决了这些调试问题。 不幸的是,这个修补程序的源代码更改没有让它回到主分支和VS2010出现完全相同的问题。 这已通过其Service Pack 1再次得到纠正。

我已经看过几次了。 它通常发生在上下文切换到另一个线程时。 因此,您可能正在使用ID 11进入线程,您点击F10,并且有一个先发制人的上下文切换,所以现在您在线程ID 12上运行,因此Visual Studio欢迎代码继续。

这里有一些很好的调试技巧:

提示:仅当特定线程调用方法时才中断:要设置每线程断点,您需要唯一标识已为其Name属性指定名称的特定线程。 您可以通过创建条件表达式为线程设置条件断点,例如“ThreadToStopOn”== Thread.CurrentThread.Name。

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

编辑:这里也有一些很好的提示。 我发现这是通过谷歌搜索’visual studio防止线程切换调试’。

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

调试线程就像Huysenberg原则 – 过于密切观察,你会改变结果!

试试这个http://support.microsoft.com/kb/957912 。 为我工作。