40

我有一个看起来像这样的类:

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由于有数据,我无法理解,我的return陈述MyService应该受到打击,对吗?

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

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

我的测试和“核心”代码在同一个解决方案中,但不同的项目(分别是Test和)。Core其他测试在 中打断点没有问题Core,只有在特定测试中(唯一的测试是 testing MyService)。

我已经删除了我的 PDB 文件并清理了解决方案。依然没有。

4

24 回答 24

61

一些想法。

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

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

于 2012-12-28T19:59:35.960 回答
11

这可能是因为您只调试 1 个项目而不是Test两者Core

您可以将 VS 设置为一次调试多个项目,您可以通过right-click your solution > Properties > Common Properties > StartUp Project

在这里可以设置“多个启动项目” 在此处输入图像描述

只需设置两者CoreTest开始。这可能会解决您的问题。

于 2012-12-31T00:16:21.197 回答
9

事实证明这与代码覆盖率有关。

关闭它可以解决问题。

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

禁用代码覆盖

于 2013-02-05T19:48:04.167 回答
5

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

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

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

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

于 2013-12-22T08:41:29.020 回答
3

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

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

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

于 2012-12-31T05:53:12.207 回答
3

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

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

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

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

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

于 2012-12-24T22:03:48.890 回答
1

您需要将 DoStuff 设为静态。

private static string DoStuff()
{
    //do stuff
}
于 2012-12-24T21:16:32.283 回答
1

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

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

2)您可以尝试明确包含 pdb 文件的部署项吗?

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

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

于 2013-01-03T18:17:54.960 回答
1

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

  • 检查任务管理器中可能的违规者(可能托管您的服务的进程)。在调试时杀死它们以确认调用失败。
  • 尝试使用 Debugger.Break();
  • 创建调试日志文件,在将输出加载到日志时输入进程和程序集名称。确保您的日志每次都是不同的文件以避免异步访问问题。
于 2012-12-28T20:42:39.043 回答
1
  1. 清理解决方案并重建并执行启动项目。

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

  3. 即使不是开发模式,您也可以执行第二步

于 2013-09-17T06:33:31.313 回答
1

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

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

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

于 2016-06-16T00:48:53.890 回答
0

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

于 2013-01-02T17:25:24.183 回答
0

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

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

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

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

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

于 2013-01-02T23:21:27.317 回答
0

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

于 2013-01-02T06:05:30.363 回答
0

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

于 2013-01-02T20:54:24.673 回答
0

愚蠢的我没有设置测试项目:

在此处输入图像描述

于 2013-10-22T09:09:20.007 回答
0

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

于 2015-01-23T07:56:52.017 回答
0

这个很晦涩:

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

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

于 2014-04-06T08:20:54.617 回答
0

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

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

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 文件,这些是调试符号)

于 2014-10-23T07:55:27.723 回答
0

您可以尝试添加一个Thread.Sleep(5000)inGetStuff方法并使用 Attach to Process

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

于 2012-12-31T07:27:54.907 回答
0

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

图片

于 2014-09-16T15:45:08.427 回答
0

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

于 2013-01-02T20:14:44.017 回答
0

还有一些东西可以尝试:

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

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

于 2013-01-03T15:53:37.123 回答
0

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

于 2016-01-26T15:56:31.597 回答