【问题标题】:VS2012 Breakpoints are not getting hitVS2012断点没有被击中
【发布时间】:2012-12-11 03:14:11
【问题描述】:

我有一个如下所示的课程:

public class MyService
{
    private MyService(){}
    public static string GetStuff()
    {
        var stuffDid = new MyService();
        return stuffDid.DoStuff();
    }
    private string DoStuff()
    {
        //do stuff
    }
    //other private helpers

}

显然我遗漏了很多,但这是一般的外壳。

现在,我有一个单元测试:

[Test]
public void MyTest()
{

    var results = MyService.GetStuff();
}

我在单元测试中设置了断点,我可以看到results 有数据。但是,我确实在MyService 上设置了断点,除非我将它们放在花括号上,否则什么都不会受到影响。我无法理解,因为results 有数据,我在MyService 中的return 语句应该受到打击,对吧?

我错过了什么吗?我是否完全忘记了一些最基本的规则?为什么MyService 中什么都没有被击中?如果我用F11 手动进入它,它只会跳来跳去,甚至不会像我预期的那样遍历每一行。此外,当我手动单步执行时,我倾向于在最初应该点击某些代码之后点击它。并且任何switch 语句似乎默认为第一个选项,即使正在切换的值应该明确输入不同的case

我什至尝试过创建MyService 构造函数public 并删除所有static 方法,但它仍然不起作用。

我的测试和“核心”代码在同一个解决方案中,但项目不同(分别为TestCore)。其他测试在Core 中遇到断点没有问题,只有在特定测试中才会出现这个问题(唯一正在测试MyService 的测试)。

我已经删除了我的 PDB 文件并清理了解决方案。还是什么都没有。

【问题讨论】:

  • 你的测试中是否有一个圆圈(不确定它是否仅适用于 NUnit)?如果你这样做了,点击它,然后点击调试。然后它应该可以工作了。
  • 代码在同一个解决方案中吗? Visual Studio 的调试器有一个“只是我的代码”选项。不确定它是如何工作的。
  • 导入是否正确?你的单元测试能看到项目代码还是只看到编译好的dll?
  • 是的,所有代码都在同一个解决方案中。我的测试在一个单独的项目中(称为测试),但其他测试似乎没有在 Core 中遇到断点问题(其中的代码不会被命中)。
  • 我不确定,但调试符号似乎已关闭:您可以在执行以下步骤后再次尝试调试吗:(1)首先构建“Core”项目。 (2) 然后运行测试溶液。看看它是否命中断点。

标签: c# debugging visual-studio-2012 visual-studio-debugging


【解决方案1】:

我在 25 个项目中的 1 个项目中发生了这种情况,这些项目都在同一个解决方案中。其他项目尊重断点,但这个 1 没有。我从解决方案中删除了该项目(删除,而不是卸载),它破坏了对它的所有引用,然后将其添加回解决方案并且有效!

如果这不起作用,您可能需要从头开始重新创建问题项目并将该新项目添加到解决方案中。

除了纯粹的运气之外,我对为什么这样做的最佳解释是,多年来我们将项目从一个版本的 VS 迁移到另一个版本很多很多次,也许其中一个迁移导致了这个问题。

【讨论】:

    【解决方案2】:

    在单元测试中,我没有遇到断点,并意识到我正在运行测试而不是调试测试。测试资源管理器的顶部是选项“全部运行”、“运行失败”、“运行通过”等。运行测试时,不会命中断点。要调试测试,请在测试资源管理器中右键单击测试或测试组,然后选择调试选定的测试。

    【讨论】:

    • “调试选定的测试”对我有用并触发断点:)。
    【解决方案3】:

    要逐步调试,您必须做两件事。首先必须设置断点,然后必须将调试器附加到运行代码的进程。如果您正在运行 IIS Express 并且您有 64 位计算机,那么您需要附加运行代码的 iisexpress.exe。如果按 CTRL + ALT + P,您将进入附加到进程窗口。附加后,如果代码匹配,应该打断点。

    【讨论】:

      【解决方案4】:

      首先尝试通过右键单击项目来重建您的项目>重建如果这不起作用,请尝试清理项目(鼠标右键单击项目>清理)

      如果这不起作用,请检查:

      Right mouse click your project
      select [Properties]
      select the [Build] tab
      make sure [Define DEBUG constant] and [Define TRACE constant] are checked
      Click the [Advanced] button at the bottom of the Build tabpage
      Make sure that [Debug Info:] is set to [full]
      Click [OK] and rebuild the project ;-)
      

      希望对你有用! (第6步生成.pdb文件,这些是调试符号)

      【讨论】:

        【解决方案5】:

        我也有同样的问题。也许我的解决方案可以帮助您解决问题。只需在“附加到进程”中为选项“附加到”选择值“Avtomatic:本机代码”。最好的问候。

        【讨论】:

          【解决方案6】:

          原来这与开启代码覆盖率有关。

          关闭它可以解决问题。

          您可以通过以下链接了解如何禁用代码覆盖

          Disable code coverage

          【讨论】:

          • 这不是一个真正的答案。您应该描述如何关闭代码覆盖率。
          【解决方案7】:

          这个很晦涩:

          确保您没有两个具有不同应用程序池的虚拟目录指向硬盘上的相同物理位置。在开发过程中,有时会因测试或错误而发生这种情况。

          我对技术细节不是 100% 清楚,但我有两个 AppPools 和两个虚拟目录,并且没有遇到断点,因为我认为物理路径在 IIS/Visual Studio 中以某种方式映射到另一个应用程序池,而不是那个这实际上正在执行。

          【讨论】:

            【解决方案8】:

            我有一个非常具体的场景,导致明显的“断点未命中”问题。

            由于这里没有其他答案提到它,我会添加我的,以帮助遇到同样问题的人。

            在我的情况下,解决方案是愚蠢的,并且使用尽可能多的 LINQ,我应该早点解决这个问题。当运行一个返回 IEnumerable 的方法时,其中包含的 return 语句实际上是 yield return 语句,那么当你调用它时,该方法将不会被执行。

            当您从该 IEnumerable 对象调用另一个方法时,它实际上会被执行,例如 ToList()Count()。只有 then 方法会被执行并到达断点。

            【讨论】:

            • 我总是忘记,然后谷歌,然后找到这样的答案,然后提醒自己不要忘记......
            【解决方案9】:

            我傻了,测试项目还没准备好:

            【讨论】:

            • 提示:你可以在你的代码中加入一个'throw new Exception()`而不是一个断点,以确保你的代码真的在编译。如果您的代码的最新版本没有运行,那么这可能是罪魁祸首
            【解决方案10】:
            1. 清理解决方案并重建,同时进行启动项目。

            2. 您能否快速查看一下“构建”> 配置管理器,以确定设置了哪些配置属性。如果是开发,那么您可能需要调整项目属性 -> 单击高级设置 -> 在 [输出选项卡] 中将调试信息更改为“完整”。

            3. 即使不是开发模式也可以按照第二步进行

            【讨论】:

              【解决方案11】:

              一些想法。

              1. 确保它是调试版本而不是发布版本
              2. 关闭项目属性中的优化(如果已启用)
              3. 尝试在代码中插入Debugger.Break() 而不是断点 在 VS 中
              4. 确保断点已启用(Debug->Windows->Breakpoints 工具栏),并且断点符号应该是实心的
              5. 执行您的应用程序。 Load Debug->Window->Modules 窗口。 检查你的程序集,看看是否加载了符号。如果没有,它可能会给出相关的状态消息。

              您是否一直在调整计算机上的日期?这真的会搞砸构建过程。如果是这样,请手动删除所有 obj/bin 文件夹并重新编译。

              【讨论】:

              • 我刚刚遇到了另一种情况:解决方案中程序集之间的 .NET Framework 版本不匹配。测试程序集是 .NET 4.5,测试程序集是 .NET 3.5,两者都无法设置断点。通过将测试程序集转换回 3.5 来修复。
              • 第五步没看懂。我可以打开 Debug > Window > Modules,但是从那里我该怎么办?如何检查我的程序集以查看是否加载了符号?
              • 删除 /obj 在弄乱系统日期后对我有用 - 谢谢!
              【解决方案12】:

              这听起来像您的测试沙箱中的 pdb 文件没有更新。

              1) 确保您处于调试模式。

              2) 您能否尝试为 pdb 文件显式包含部署项?

              • 您说过可以在测试项目中附加调试点。
              • 在测试项目中达到调试点后,请检查以确保具有最新时间戳的 pdb 文件存在于沙箱的 Out 文件夹中。

              3) 如果 1 和 2 失败,我发现有时 Visual Studio 需要重启 :)

              【讨论】:

                【解决方案13】:

                还有一些东西可以尝试:

                • 检查加载的符号是否与调试后的可执行文件匹配:
                  打开 VS 命令提示符并 cd 到您调试的可执行文件所在的目录。 然后执行dumpbin /PDBPATH:VERBOSE MyServiceExecutable.exe 并扫描输出以查找“PDB 年龄不匹配”(参考:http://msdn.microsoft.com/en-us/library/44wx0fef.aspx

                • 不确定 VS 2012,但旧版本的 VS 有一个错误,即显示错误的源文件,前提是您的项目中有两个具有相同的源文件 名称,即使它们位于不同的文件夹中。因此,如果您的项目包含另一个同名的源文件,请查看重命名其中一个是否有帮助。 (更新:似乎 VS 2012 is affected too。)

                【讨论】:

                  【解决方案14】:

                  也许您的 Test 项目引用的是较旧的 Core 二进制文件,而不是 Core(源代码)项目?

                  尝试在您的测试项目中重新添加引用:

                  转到您的 Test 项目并删除对 Core 项目的引用。

                  现在选择 References 文件夹并右键单击它并选择菜单选项以添加新参考。在“参考管理器”对话框中时,确保您选择了Solution,然后在左侧选择了Projects。然后在 Reference Manager 对话框的中间,选择(检查)Core 项目。

                  再次尝试调试,看看是否有帮助。

                  【讨论】:

                    【解决方案15】:

                    当 VS 使用 .pdb 文件时,它的行为与您所描述的完全一样(没有遇到断点,而是在单步执行时遇到您不希望遇到的代码)。调试时使用。我不能保证这是你的情况,但是当我需要进入作为预构建库提供的代码时,我已经多次观察到这种行为,该库是针对具有相同文件名的旧/不同代码生成的/符号。

                    【讨论】:

                      【解决方案16】:

                      我遇到了类似的问题。事实证明,对我来说,使用 *.testrunconfig 文件从 VS2010 迁移到 VS2012 是一次糟糕的迁移。我删除了旧的并设置了一个新的来解决问题。

                      【讨论】:

                        【解决方案17】:

                        我从经验中知道,Visual Studio 没有明确的调试服务的方法,尤其是 Windows 服务。尝试向 GetStuff 添加一些代码以打印到文本文件,这样您至少知道代码被命中了。在创建服务时,我经常使用这种方法进行测试。

                        【讨论】:

                          【解决方案18】:

                          如果它处于发布模式,请将其切换到调试模式。

                          【讨论】:

                            【解决方案19】:

                            您可以尝试在GetStuff 方法中添加Thread.Sleep(5000) 并使用附加到进程

                            Visual Studio > 工具 > 附加到进程并查看该行下方的断点是否被命中。

                            【讨论】:

                            • 使用System.Diagnostics.Debugger.Break() 方法在特定点附加进程会简单得多。
                            【解决方案20】:

                            我最近也遇到了同样的问题,头撞墙了。

                            结果很傻:不知何故,我的测试项目与主库项目不同步。我正在构建测试和库的调试版本,但测试项目从bin/Release 文件夹中复制了库。我刚刚重新创建了项目引用,一切都已修复。

                            附:更疯狂的是:调试器进入了一个库函数,但不知何故跳过了其中的一行。

                            【讨论】:

                              【解决方案21】:

                              这可能是因为您只调试 1 个项目而不是 TestCore

                              您可以设置 VS 一次调试多个项目,您可以通过right-click your solution > Properties > Common Properties > StartUp Project 进行此操作

                              这里可以设置“多个启动项目”

                              只需同时设置CoreTest 即可启动。这可能会解决您的问题。

                              【讨论】:

                                【解决方案22】:

                                您的代码表示“服务”,它可以作为单独的进程运行。如果是这种情况,您可以加载程序集,因此断点将是实心红色圆圈,但程序集的另一个副本,在单独的进程中运行实际上正在处理请求。

                                • 检查任务管理器中可能的违规者(可能托管您的服务的进程)。在调试时杀死它们以确认调用失败。
                                • 尝试使用 Debugger.Break();
                                • 创建调试日志文件,在将输出加载到日志时输入进程和程序集名称。确保您的日志每次都是不同的文件以避免异步访问问题。

                                【讨论】:

                                  【解决方案23】:

                                  只需确保您已使用调试器符号构建程序集。

                                  此选项必须填写“完整”:

                                  右键单击包含代码文件且断点未命中的项目。选择“属性”。

                                  打开项目属性后,选择“构建”选项卡。注意标签页底部的“高级...”按钮。 (在“输出”组内)

                                  单击此按钮并为“调试信息”属性选择“完整”。这应该是断点未命中的原因。 Visual Studio 使用保存在 pdb 文件中的符号来查找断点的确切位置。如果未创建这些文件,则不会命中断点。也许您禁用了这些文件的创建以整理您的项目文件结构。这是我意识到我需要这些文件的情况。

                                  【讨论】:

                                  • 您是否正在使用出现在 Windows 服务列表中的服务?如果是这样,您可能必须通过点击 Debug -> "Attach to process" 来进行调试,而不是简单的调试。
                                  • 这是我的问题。谢谢!
                                  【解决方案24】:

                                  您需要将 DoStuff 设为静态。

                                  private static string DoStuff()
                                  {
                                      //do stuff
                                  }
                                  

                                  【讨论】:

                                  • 抱歉,对我的代码进行了编辑,所以我不确定是否需要将 DoStuff 设为静态。
                                  • 现在你更新了你的代码来实例化一个类变量来调用方法;​​)还要注意你的构造函数是私有的,它应该是公共的,除非你只打算从静态调用它方法。
                                  • 构造函数是私有的,所以访问该类的唯一方法是通过静态公共方法(不幸的是,我需要遵循这种模式)。
                                  猜你喜欢
                                  • 1970-01-01
                                  • 2020-06-25
                                  • 1970-01-01
                                  • 2019-01-06
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2023-04-09
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多