【问题标题】:Why does Microsoft Visual C# 2008 Express Edition debugger randomly exit?为什么 Microsoft Visual C# 2008 Express Edition 调试器随机退出?
【发布时间】:2008-11-22 02:56:24
【问题描述】:

我正在用 Microsoft Visual C# 2008 Express Edition 编写一个多线程的 Windows 应用程序。最近调试器出现了奇怪的现象。

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

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

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

这不是我的键盘的问题:当我在“调试”工具栏中单击“跳过”时也会发生同样的事情。

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

提前致谢!

【问题讨论】:

    标签: c# visual-studio visual-studio-2008 multithreading debugging


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!我没有机会确认此修补程序是否有效,但似乎应该可以,因为他们提到了与我遇到的完全相同的问题。
    【解决方案2】:

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

    有一些不错的调试技巧here

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

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

    编辑:还有一些很好的提示here。我通过谷歌搜索“Visual Studio 防止在调试时切换线程”发现了这一点。

    【讨论】:

    • 速成版没有线程窗口。不过,线程名称上的条件断点听起来很有趣。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多