【问题标题】:Visual Studio 2010 debugger steps over methods and doesn't stop at breakpointsVisual Studio 2010 调试器跳过方法并且不会在断点处停止
【发布时间】:2011-06-06 15:39:42
【问题描述】:

我的 Visual Studio 2010 调试器有时会出现非常奇怪的行为...

有时它不会在断点处停止,但当它停止时,我想单步执行一个方法,调试器就会跳过它。那些过步方法中的断点也会被忽略。

当这种奇怪的行为发生时,它也不会因异常而中断,而只是忽略它们。

我尝试重建我的项目,重置 Visual Studio 设置并禁用调试器设置,例如“仅在我的代码中中断”,但没有任何效果。

我该如何解决这个问题?

【问题讨论】:

  • 发布调试配置?在发布配置中,您的一些代码可以被优化器删除,因此调试看起来很奇怪
  • 这是在一种调试会话中发生的,还是随机的。例如,如果您尝试通过附加到进程来调试正在运行的服务,或者您只是尝试在调试器中运行代码?
  • @robin hood 配置设置为调试 @Jesse McCulloch 我只是在调试器中运行代码,但它是随机发生的
  • 这也是 VS2008 SP1 中的一个问题。有一个修补程序,但不是所有的修补程序都检查回主干。 Service Pack 1 即将推出,现在处于测试阶段。您现在可以尝试,但请避免在生产机器上这样做。

标签: visual-studio-2010 debugging


【解决方案1】:

这里是 WAG,但我想说您通过浏览 dll (project/bin/debug/mydll.dll) 而不是通过添加“项目引用”来引用解决方案中的另一个项目。如果您的解决方案中有多个项目,请删除对每个项目的所有引用。然后,在“添加引用”对话框中,点击“添加项目引用”选项卡并选择您要引用的项目。

项目引用总是在新版本上更新。但是,如果你浏览到 bin/release 并在该目录中添加对 dll 的引用,当你切换到调试模式并添加代码并尝试调试它时,旧版本的 dll 会加载到 appdomain 中,并且VS 将无法命中任何断点(您会注意到断点是空圆圈,并且工具提示会说明代码未加载)。

【讨论】:

    【解决方案2】:

    要检查的最重要的事情是,当尝试在它拒绝进入的方法中放置一个新断点时,该断点是否像其他断点一样被填充为红色,或者半填充或具有特殊的“外观”。如果是这样,请将鼠标悬停在您创建的断点上以找出它不工作的原因。

    如果断点看起来正常,但您似乎仍无法进入该方法,请尝试清除卷影副本缓存:http://weblogs.asp.net/mreynolds/archive/2003/08/11/23576.aspx

    要尝试的另一件事是确保您确实在使用刚刚重建的 DLL,方法是向您似乎无法停止的方法添加 MessageBox.Show(或类似的东西),并确保您拿到盒子。

    【讨论】:

    • 我用消息框试过你的建议,确实,当我运行程序时没有出现任何消​​息框。现在我将尝试找出为什么没有正确调用该方法。
    • 正如 Jared 所建议的,监视这些问题的最佳方法是使用“模块”窗口(调试器 -> Windows -> 模块)来检查加载的 DLL 确实是您刚刚构建的那个 -通过查看 DLL 的最后修改日期来验证这一点。遇到此类问题时,对我来说非常有用的方法是使用 Everything(voidtools.com,程序员必备的免费工具)来搜索 DLL 名称,并按修改日期排序。您可能会找到刚刚重建的 DLL 的路径,以及您的应用正在加载的 DLL 的陈旧副本的路径。
    • 调试器 -> Windows -> 模块为我工作——由于最近其他团队对其项目的更改以及一些旧版本的 DLL 被拾取,我的 DLL 最终出现在一个奇怪的地方。
    【解决方案3】:

    以下是 Visual Studio 避免进入特定方法的几个原因和解决方法。

    • Just My Code 已启用。在某些情况下,“仅我的代码”设置会阻止您进入方法/属性。为避免这种情况,您可以在调试器选项页面中禁用“仅我的代码”(工具 -> 选项 -> 调试器 -> 取消选中“仅我的代码”)
    • 没有为目标方法加载符号。如果目标方法是另一个 DLL 的一部分,则可能没有为该 DLL 加载符号,因此默认情况下 Visual Studio 将无法进入它。要强制加载符号,请打开模块视图(调试器 -> Windows -> 模块),导航到包含该方法的 DLL,右键单击并加载符号。
    • 该方法显式标记有调试器属性,例如DebuggerNonUserCode,这会导致调试器跳过该方法。
    • 该方法实际上是一个属性或运算符,并且您启用了“跳过属性和运算符”设置(这是默认设置)。这可以通过调试器选项对话框禁用。

    【讨论】:

    • 在 Visual Basic Express 2005(不要问)中,“工具 -> 选项 -> 调试器 -> '只是我的代码'”似乎不可用。一种解决方案是将文件“C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\VBExpress\Profiles\VBExpress.vssettings”中包含“JustMyCode”的行中的“1”更改为“0”并将文件导入 Visual Basic Express 2005。详细信息在 Josh Dannemann'sHow to Disable “Just My Code” in Visual Studio 2005 的评论中,可能在 Stack Overflow 的某个地方。
    • 另一种添加到列表的可能性是 DebuggerStepThrough 属性,生成器经常将其添加到生成的代码(例如 XML 生成的代码)
    【解决方案4】:

    我最近也有同样的经历。不知道我到底做了什么。尝试以物理方式清理您的解决方案,即从解决方案的所有项目中删除所有 bin 目录。这通常有助于解决很多问题。

    【讨论】:

      【解决方案5】:

      我已经找到了问题的解决方案,而且非常简单:

      在我的解决方案的构建配置中,未选中方法所在项目的“构建”复选框,这些复选框会被过度执行。我检查了它,现在一切正常。

      【讨论】:

      • 构建配置在哪里,我在 vs 1013
      【解决方案6】:

      我为此苦苦挣扎了一段时间。给出的答案都不适合我。我终于通过执行以下操作使其工作:

      1. 确保项目处于调试模式(所有项目)
      2. 从 Windows 转到命令提示符并确保以管理员身份运行
      3. 导航到c:\windows\syswow64\(或gacUtil.exe所在的文件夹)
      4. 运行以下命令(将下面的路径替换为 DLL 的调试输出版本所在的位置。

      gacutil /i "C:\Users\John\Documents\Visual Studio 2008\Projects\Project1\Project1\bin\Debug\MyAppDLL.dll"

      你应该得到“程序集成功添加到缓存”

      现在运行您的项目,您应该能够单步执行 DLL 代码。

      【讨论】:

        【解决方案7】:

        在我的情况下,它是“工具”->“选项”->“调试器”中的“跳过属性和运算符”。只需取消选中它,然后一切都很好,我可以进入。

        【讨论】:

          【解决方案8】:

          我刚刚找到了问题的另一个原因,并进行了修复。我正在使用 Visual Studio 2010 中的 C++ 创建 Windows 窗体应用程序。我正在使用 FreeType 库和一些依赖于它的代码,由于各种原因,必须在选择“无公共语言运行时支持”的情况下编译此代码(属性 - >配置属性 -> 常规)。在这个非 CLR 代码中,我无法获得要命中的断点。

          修复方法是必须使用“公共语言运行时支持 (/clr)”而不是“纯 MSIL 公共语言运行时支持) (/clr:pure)”来编译主应用程序。这立即解决了问题。我现在可以调试非 CLR 代码(包括 FreeType C 代码)并在其中设置断点。

          【讨论】:

            【解决方案9】:

            我的解决方案是创建一个新项目并将我的所有 .vb 文件加载到新项目中。解决了我所有的问题。

            【讨论】:

              【解决方案10】:

              尝试在工具->选项->调试->常规中禁用“要求源文件完全匹配”选项。

              【讨论】:

                【解决方案11】:

                另一个混淆的来源是使用 yield return 运算符的迭代器方法,因为它们被 C# 编译器重写,因此单步执行 (F11) 是有点像“no-op”。

                您必须等待迭代发生才能进入方法的代码。

                【讨论】:

                  【解决方案12】:

                  我的问题很简单。我的解决方案中有多个项目,我只需要将我正在使用的项目设置为设置为启动项目。

                  【讨论】:

                    猜你喜欢
                    • 2011-07-02
                    • 1970-01-01
                    • 2011-06-16
                    • 2019-03-19
                    • 1970-01-01
                    • 2020-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多