VS2012断点没有被击中

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

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

显然我留下了很多,但那是一般的壳。

现在,我有一个unit testing:

 [Test] public void MyTest() { var results = MyService.GetStuff(); } 

我在我的unit testing中设置了断点,我可以看到results有数据。 然而,我把所有断点设置在MyService ,除非我把它们放在一个大括号内, 我不明白,因为results有数据,我在MyService return语句应该会受到打击,对吧?

我错过了什么吗? 我完全忘记了一些最基本的规则吗? 如何在MyService没有被击中? 如果我用F11手动进入它,它只是徘徊,甚至不会像我所期望的那样通过每一行。 另外,当我通过手动步骤,我往往打一定的代码后,我本来应该打它。 而且任何switch语句似乎默认为第一个选项,即使被切换的值应该清除地input一个不同的case

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

编辑:我的testing和“核心”代码是在相同的解决scheme,但不同的项目( TestCore ,分别)。 其他testing在Core没有遇到中断点的问题,只有在特定的testing(唯一的testing是testingMyService

编辑2:

我删除了我的PDB文件并清理了解决scheme。 依然没有。

一些想法。

  1. 确保它是一个debugging版本,而不是发布
  2. 如果它们处于打开状态,请closures项目属性中的优化
  3. 尝试在你的代码中插入Debugger.Break() ,而不是在VS中的断点
  4. 确保启用了断点(Debug-> Windows-> Breakpoints工具栏),并且断点符号应该是固定的
  5. 执行你的应用程序。 加载Debug-> Window-> Modules窗口。 检查你的程序集,看是否加载了符号。 如果不是,可以给出相关的状态消息。

你一直在调整你电脑上的date吗? 这可以真的搞砸了一个构build过程。 如果是这样,请手动删除所有obj / bin文件夹并重新编译。

这可能是因为你只debugging1个项目不是TestCore

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

在这里你可以设置“多个启动项目” 在这里输入图像说明

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

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

把它关掉解决了这个问题。

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

禁用代码覆盖率

我有一个非常具体的情况,导致了“断点不被打”的明显问题。

既然这里没有其他答案提到它,我会加上我的机会,它会帮助有同样问题的人。

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

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

只要确保你已经用debugging器符号构build你的程序集。

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

用鼠标右键点击包含代码文件的项目,中断点没有被击中。 select“属性”。

项目属性打开后,select“Build”选项卡。 注意“高级…” – 标签页底部的button。 (在“输出”组中)

点击这个button,然后为“debugging信息”属性select“全部”。 这应该是断点不被击中的原因。 Visual Studio使用保存在pdb文件中的符号来查找断点的确切位置。 如果这些文件没有创build,则不会有中断点。 也许你禁用了这些文件的创build,以整理你的项目文件结构。 这是我认识到我需要这些文件的情况。

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

答案结果是非常愚蠢的:不知何故,我的testing项目与主库项目不同步。 我正在构buildtesting和库的debugging版本,但是testing项目从bin/Release文件夹中复制了库。 我刚刚重新创build项目的参考,一切都是固定的。

PS它甚至是criazier:debugging器进入一个库函数,但不知何故在它的中间跳过一行。

你需要使DoStuff静态。

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

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

  • 检查任务pipe理器可能的罪犯(可能托pipe您的服务的进程)。 在debugging时将其杀死,以确认通话失败。
  • 尝试使用Debugger.Break();
  • 创build一个debugging日志文件,加载输出到日志input过程和程序集名称。 确保您的日志是每次不同的文件,以避免asynchronous访问问题。

这听起来像在testing沙箱中没有更新pdb文件。

1)确保您处于debugging模式。

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

  • 你说你可以在testing项目中附加一个debugging点。
  • 在testing项目中点击debugging点之后,请检查确保带有最新时间戳的pdb文件出现在沙箱的Out文件夹中。

3)如果1和2失败,我发现有时视觉工作室需要重新启动:)

  1. 清理解决scheme和重build,也做启动项目。

  2. 您可以快速查看BUILD> Configuration Manager,以确定设置了哪些configuration属性。 如果是开发,则可能需要调整项目属性 – >单击高级设置 – >在[输出标签]中将debugging信息更改为“完整”。

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

我在25个项目中的一个项目中发生了这种情况,这些项目都在同一个解决scheme中。 其他项目兑现了断点,但这1没有。 我从解决scheme(删除,不卸载)的项目中删除了所有的引用,然后将其添加回解决scheme,并工作!

如果这不起作用,您可能需要重新创build问题项目,并将该新项目添加到解决scheme中。

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

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

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

如果处于释放模式,则将其切换到debugging模式。

我从经验中知道,Visual Studio没有明确的debugging服务的方法,特别是Windows服务。 尝试添加一些代码GetStuff打印到文本文件,这样你至less知道代码被击中。 在创build服务时,我经常回头testing这个方法。

我遇到了类似的问题。 事实certificate,对我来说,从VS2010到VS2012的错误是使用*.testrunconfig文件。 我删除了旧的,并build立了一个新的解决这个问题。

当它使用.pdb文件时,VS的行为与您描述的方式完全相同(不会碰到断点,点击您不希望碰到的代码),而使用源代码生成的.pdb文件不同于debugging时使用的代码。 我不能保证这是你的情况,但是当我需要进入代码时,我已经多次观察到这样的行为,这个代码是作为一个预先构build的库而提供的,它是针对具有相同文件名/符号。

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

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

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

现在selectReferences文件夹并右键单击它并select菜单选项来添加一个新的参考。 在“参考pipe理器”对话框中,确保select“ Solution ,然后select左侧的“ Projects ”。 然后在Reference Manager对话框的中间,select(检查) Core项目。

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

一些更多的东西来尝试:

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

  • 不知道VS 2012,但老版本的VS有一个错误的地方会显示错误的源文件,前提是你的项目中有两个源文件具有相同的名称,即使它们位于不同的文件夹中。 所以,如果你的项目包含另一个具有相同名称的源文件,请查看是否重命名其中一个有帮助。 ( 更新:似乎VS 2012 也受到影响 。)

愚蠢的我的testing项目没有设置build立:

在这里输入图像说明

这个很晦涩:

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

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

我有同样的问题。 也许我的解决scheme将帮助你解决你的问题。 只需在“附加到进程”中select“附加到”select值“Avtomatic:本机代码”。 最好的祝福。

图片

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

如果这不起作用检查这个:

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

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

在unit testing中,我没有触及断点,并意识到我正在运行testing而不是debuggingtesting。 在“testing资源pipe理器”的顶​​部是“全部运行”,“运行失败”,“运行通过”等选项。运行testing时,不会触发断点。 要debugging一个testing,在testing资源pipe理器中,右键点击testing或testing组,然后selectDebug Selected Tests。