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

3
我正在使用Microsoft Visual C# 2008 Express Edition编写一个多线程的Windows应用程序。最近,调试器的表现很奇怪。
当我使用F10逐行步过代码时,有时它会把我的Step Over(F10)命令解释成继续运行(F5)命令,然后程序就会继续运行,调试会话也结束了。
有人知道为什么会出现这种情况吗?在什么情况下,Step Over命令会导致调试器停止工作?
这不是被调试的代码的问题:它并不只发生在特定的代码行上。每次运行调试器时,它都会在不同的随机行上发生。
这不是我的键盘的问题:当我只是单击Debug工具栏中的Step Over时,同样的事情也会发生。
可能是我的程序中的其他线程有问题。也许其中一个线程随机执行某些操作,导致调试器中断。这种情况可能吗?
先谢谢啦!
4个回答

4
我已经看到这种情况几次了。通常发生在切换上下文到另一个线程时。因此,您可能正在步进带有ID 11的线程,按F10键,就会出现抢占式上下文切换,现在您正在运行线程ID 12,因此Visual Studio可以愉快地让代码继续执行。
这里有一些很好的调试提示:这里
提示:仅在特定线程调用方法时中断:要设置每个线程的断点,您需要使用其Name属性唯一标识特定线程。您可以通过创建条件表达式(例如“ThreadToStopOn”== Thread.CurrentThread.Name)为线程设置条件性断点。您可以在监视窗口中手动更改线程的名称,方法是观察变量“myThread”,并在值窗口中输入Name值。如果没有当前线程变量可用,则可以使用Thread.CurrentThread.Name来设置当前线程的名称。Thread类中还有一个私有整数变量DONT_USE_InternalThread,这对于每个线程都是唯一的。您可以使用Threads窗口访问要停止的线程,并在Watch窗口中输入Thread.CurrentThread.DONT_USE_InternalThread以查看它的值,以便创建正确的条件性断点表达式。
编辑:这里也有一些很好的提示:这里。我通过搜索“visual studio prevent thread switch while debugging”找到了这个。

1
Express 版本没有线程窗口。不过,对线程名称的条件断点听起来很有趣。 - Don Kirkby

4

你应该看一下这个知识库文章,并考虑使用其相应的热修复程序。

编辑:该热修复程序确实解决了这些调试问题。不幸的是,热修复程序的源代码更改没有被合并到主分支中,VS2010仍然存在完全相同的问题。这在其服务包1中得到了纠正。


谢谢!我还没有确认这个热修复是否有效,但是它似乎应该有效,因为他们提到了我遇到的完全相同的问题。 - David Grayson

1

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

调试线程就像海森堡原理一样 - 观察得太仔细会改变结果!


0

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