我正在Microsoft Visual C#2008 Express Edition中编写一个多线程Windows应用程序。最近,调试器一直表现得很奇怪。
当我使用F10踩过代码行时,有时它会像继续命令(F5)一样解释我的Step Over(F10)命令,然后程序将继续运行并且调试会话将完成。 / p>
有谁知道为什么会这样?在什么情况下Step Over命令会导致调试器停止?
调试代码不是问题:它不仅仅发生在特定的代码行上。它发生在每次运行调试器的随机行上。
我的键盘不是问题:当我在调试工具栏中单击Step Over时会发生同样的事情。
我的程序中的其他线程可能有问题。也许其中一个是随机做一些有中断调试器的副作用的东西。这可能吗?
提前致谢!
答案 0 :(得分:4)
我已经看过几次了。它通常发生在上下文切换到另一个线程时。因此,您可能正在使用ID 11进入线程,您点击F10,并且有一个先发制人的上下文切换,所以现在您在线程ID 12上运行,因此Visual Studio允许代码继续。
有一些很好的调试技巧here:
提示:仅当特定线程调用方法时才中断:要设置每个线程断点,您需要唯一地标识已为其Name属性指定名称的特定线程。您可以通过创建条件表达式为线程设置条件断点,例如“ThreadToStopOn”== Thread.CurrentThread.Name。
您可以通过观察变量“myThread”并在值窗口中为其输入Name值来手动更改Watch窗口中线程的名称。如果您没有要使用的当前线程变量,则可以使用Thread.CurrentThread.Name来设置当前线程的名称。 Thread类中还有一个私有整数变量DONT_USE_InternalThread,这对每个线程都是唯一的。您可以使用Threads窗口访问要停止的线程,并在Watch窗口中输入Thread.CurrentThread.DONT_USE_InternalThread以查看它的值,以便您可以创建正确的条件断点表达式。
编辑:还有一些很好的提示here。我发现这是通过谷歌搜索'visual studio防止线程切换调试'。
答案 1 :(得分:4)
您应该查看此KB article并考虑其匹配的修补程序。
编辑:修补程序确实解决了这些调试问题。不幸的是,这个修补程序的源代码更改没有让它回到主分支和VS2010出现完全相同的问题。这已通过其Service Pack 1再次得到纠正。答案 2 :(得分:1)
我发现使用日志文件在处理多个线程时非常方便。
调试线程就像Huysenberg原则 - 过于密切观察,你会改变结果!
答案 3 :(得分:0)
试试这个http://support.microsoft.com/kb/957912。为我工作。