C# VS2012断点未被命中

C# VS2012断点未被命中,c#,debugging,visual-studio-2012,visual-studio-debugging,C#,Debugging,Visual Studio 2012,Visual Studio Debugging,我有一个类似这样的类: public class MyService { private MyService(){} public static string GetStuff() { var stuffDid = new MyService(); return stuffDid.DoStuff(); } private string DoStuff() { //do stuff }

我有一个类似这样的类:

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();
}
我在单元测试上设置了断点,我可以看到
结果
中有数据。然而,我在MyService的
MyService
上都设置了断点,除非我将断点放在大括号中,否则任何断点都不会被击中。我不明白,因为
结果
有数据,我在
MyService
中的
return
语句应该会被点击,对吗

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

我甚至尝试过将
MyService
constructor
public
和去掉所有
static
方法,但它仍然不起作用

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


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

您需要使DoStuff为静态

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

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

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

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

打开项目属性后,选择“生成”选项卡。注意选项卡页面底部的“高级…”按钮。(在“输出”组内)

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

一些想法

  • 确保它是调试版本,而不是发布版本
  • 如果项目属性中的优化处于启用状态,请关闭它们
  • 尝试在代码中插入
    Debugger.Break()
    ,而不是断点 在VS中
  • 确保已启用断点(调试->窗口->断点工具栏),并且断点符号应为实心
  • 执行您的应用程序加载调试->窗口->模块窗口。检查程序集以查看是否加载了符号。如果没有,它可能会给出相关的状态消息
  • 你一直在调整你电脑上的日期吗?这真的会把构建过程搞砸。如果是这样,请手动删除所有obj/bin文件夹并重新编译。

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

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

      • 这可能是因为您只调试了一个项目,而不是同时调试
        测试
        核心

        您可以将VS设置为一次调试多个项目,方法是
        右键单击解决方案>属性>公共属性>启动项目

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


        只需将
        Core
        Test
        设置为启动。这可能会解决你的问题。

        我最近也遇到同样的问题,头撞在墙上

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


        <> P.S.S.S.S.S.B.P.S.S.S.B.P.S.S.,甚至调试程序:调试器进入一个库函数,但是在中间部分跳过了一行。

        < P>可以尝试添加<代码>线程。在代码< GetStuff > <代码>方法中使用休眠(5000)<代码>,并使用附加到进程


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

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

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

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

        VS使用.pdb文件时的行为与您描述的完全相同(没有命中断点,命中了您在单步执行时不希望命中的代码),该文件是使用与调试时使用的代码不同的源代码生成的。我不能保证这是你的
        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 ;-)