VS2012断点没有被击中

时间:2012-12-24 21:13:23

标签: 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
    }
    //other private helpers

}

显然我离开了很多,但这就是一般的外壳。

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

[Test]
public void MyTest()
{

    var results = MyService.GetStuff();
}

我在单元测试中设置了断点,我可以看到results有数据。但是,我在整个MyService的字面上设置了断点,除非我把它们放在大括号上,否则什么都不会被击中。由于results有数据,我无法理解,return中的MyService语句会受到影响,对吗?

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

我甚至尝试过制作MyService构造函数public并取消所有static方法,但它仍无效。

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

编辑2:

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

24 个答案:

答案 0 :(得分:61)

一些想法。

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

答案 1 :(得分:11)

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

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

执行此操作

您可以在这里设置"多个启动项目" enter image description here

只需设置CoreTest即可。这可以解决您的问题。

答案 2 :(得分:9)

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

关闭它解决了问题。

您可以通过以下链接

了解如何禁用代码覆盖率

Disable code coverage

答案 3 :(得分:5)

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

由于此处没有其他答案提到它,我将添加我的机会,它将帮助有同样问题的人。

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

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

答案 4 :(得分:3)

请确保使用调试器符号构建程序集。

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

右键单击包含代码文件的项目,其中的断点不会被命中。选择“属性”。

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

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

答案 5 :(得分:3)

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

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

P.S。它甚至更加危险:调试器进入了库函数,但不知何故在它的中间跳过了一行。

答案 6 :(得分:1)

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

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

我为什么与纯粹的运气分道扬铛的最佳解释是,我们多年来多次将项目从一个版本的VS迁移到另一个版本,并且可能其中一个迁移导致了这个问题。

答案 7 :(得分:1)

您需要将DoStuff设为静态。

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

答案 8 :(得分:1)

  1. 清理解决方案并重建并执行启动项目。

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

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

答案 9 :(得分:1)

这听起来好像pdb文件未在测试沙箱中更新。

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

2)您是否可以尝试显式包含pdb文件的部署项目?

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

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

答案 10 :(得分:1)

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

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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

尝试在Test项目中重新添加引用:

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

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

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

答案 13 :(得分:0)

要尝试的更多内容:

  • 检查加载的符号是否与调试的可执行文件匹配:
    打开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 :(得分:0)

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

答案 15 :(得分:0)

据我所知,Visual Studio没有明确的调试服务方法,特别是Windows服务。尝试添加一些代码到GetStuff打印到文本文件,这样你至少知道代码被击中。在创建服务时,我经常会依赖这种方法进行测试。

答案 16 :(得分:0)

如果处于释放模式,请将其切换到调试模式。

答案 17 :(得分:0)

愚蠢的我测试项目还没有建成:

enter image description here

答案 18 :(得分:0)

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

Visual Studio>工具>附加到流程,看看该行下面的断点是否被击中。

答案 19 :(得分:0)

这个很晦涩:

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

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

答案 20 :(得分:0)

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

Image

答案 21 :(得分:0)

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

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

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

答案 22 :(得分:0)

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

答案 23 :(得分:0)

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