关于.net:“断点当前不会被击中。

“The breakpoint will not currently be hit. The source code is different from the original version.” What does this mean?

在Visual Studio中调试时,有时我会添加一个断点,但它是空的,vs说"当前不会命中该断点"。源代码与原始版本不同。"显然,这会妨碍我调试。

这条信息到底是什么意思?什么原始版本?如果我刚刚打开了解决方案,没有对代码做任何更改,那么"原始版本"怎么可能存在呢?


正如上面所说,"源代码不同于原始版本"。

右键单击解决方案资源管理器中的项目文件夹,然后选择Clean。生成项目的新版本,断点将再次工作!


如果在调试生成配置中取消选中了dll项目,则永远不会生成新代码!

转到Build --> Configuration Manager ...(在vs2010中),检查您尝试调试的代码的项目是否被检查为当前的构建配置。


对我来说,这是在做一个网站项目的时候。清除这些临时文件夹后,我得到了正确的编译器错误:

  • C:\Documents and Settings\%username%\AppData\Local\Temp\Temporary
    ASP.NET Files
  • C:\windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET
    Files

我终于解决了这个问题,当我发现一个类文件,我有意移动到一个子文件夹,不知何故重新出现在根文件夹中。当我编辑另一个的时候,vs正在使用那个。


你做过这个吗?

是否要继续并运行上次成功的生成?

如果勾选方框并按"是",即使项目没有编译,您也将获得最后一个成功的构建运行。这意味着无论何时设置断点,都会得到该错误。

尝试更改此值:

  • 工具
    • 选项
      • 项目和解决方案
        • 建立和运行
          • 运行时,当发生生成或部署错误时:不启动


  • 工具
    • 选项
      • 调试
        • 一般

取消选中"要求源文件与原始版本完全匹配"


在解决方案配置中选择调试,而不是释放

screenshot of menu


关闭Visual Studio并重新打开解决方案可以解决此问题,即,这是IDE本身的一个错误(我正在运行VS2010)。

如果有多个Visual Studio实例正在运行,则只需关闭运行该问题解决方案的实例。


注意vs.中的"输出"窗口,它将告诉您加载了什么程序集以及何时加载。您可能会看到正在加载文件夹中某个旧版本的程序集。

例如,如果您有多个程序集,并且当前正在尝试打断其中一个支持程序集,则CLR将处理程序集解析,这可能会加载项目中引用的程序集文件以外的其他程序集文件。


从Visual Studio 2017 15.3.1到15.3.5,出现了一种解决此问题的新方法。如果使用editorconfig,charset=utf8选项会导致这些症状。vs团队已经复制了这一点,并表示他们正在努力。

因此,一个解决方法是在.editorconfig文件中注释掉您的charset=utf8行。

编辑:应该从15.5开始修正。


如果您使用的是对二进制文件的文件引用(而不是对项目中代码的项目引用),并且您所引用的已编译二进制文件与计算机上相应的源代码不同步,也会经常发生这种情况。这可能是因为您从源代码管理下载了一个新版本的二进制文件,但没有附带新的源代码,或者您的计算机上有几个版本的二进制文件,并且引用了一个旧的副本,等等。如果这确实是问题所在,那么最好使用尽可能多的项目引用。


有一个几乎无法察觉的环境为我解决了这个问题。如果某个特定的源文件中没有命中断点,则可以在

  • 解决方案管理器
    • 右键单击解决方案
      • 性质
        • 公共属性
          • 调试源文件
            • "不要查找这些源文件"。

出于某种我不知道的原因,VS2013决定在那里放置一个源文件,随后,我再也无法在该文件中命中断点。这可能是"源代码与原始版本不同"的罪魁祸首。


对我来说,这些项目都没有解决这个问题。我刚刚在这个函数中添加了一行新代码,比如:

1
int a=0;

通过添加它,我想我触发了Visual Studio将此函数添加到原始版本


使用激活器时,如果设置断点的程序集尚未加载,则可以收到此消息。

一旦激活器加载程序集,断点将被解析(假设程序集和调试符号是最新的)。一个好的地方是调试菜单中的模块窗口。在那里,您应该查找文件所属的程序集。首先检查程序集是否已加载。那么,从哪里装载呢?然后,是否加载符号文件。同样,符号文件从何处加载?最后检查两个版本。


当调试期间或调试会话之间的系统时间发生变化时,可能会发生这种情况,无论是通过编程方式、手动方式还是通过外部程序。


我也遇到过这个。引起我问题的条件:

  • 我在本地运行一个完整的iis7实例
  • 我正在将我的软件版本化为单独的项目

导致此问题的原因是打开了以前的版本(VS提示我是否要在IIS调试中指向此实例,我回答"是"),然后打开了当前版本(再次用"是"响应IIS提示),然后尝试在以前的版本中进行调试。

为了解决这个问题,我只关闭并重新打开了先前的和预期的版本,再次断言它是调试源。


在一个分层体系结构项目中的几个项目中,我也遇到了同样的问题,问题在于配置。所选项目的"生成"复选框没有被选中。所以这个问题是为一个项目解决的。

对于另一个层,即使在配置中启用了构建,它也会给这个问题带来同样的麻烦。我做了所有其他的选择,比如重新开始清理项目,但没有一个帮助。最后,我取消选中了该特定项目的"构建"复选框,并对其进行了清理和重建。再次标记了复选框并执行了相同的。然后问题解决了。

希望这有帮助。


这也发生在调试一个C++项目时,它加载了一个用一些CRL语言实现的模块(托管C++、C语言等)。在这种情况下,错误消息确实具有误导性。

解决方案是将公共语言运行时(clr)支持配置属性放入启动项目并重新编译该项目。


如果解决方案中有多个项目,请确保将正确的项目设置为StartUp Project。要将某个特定项目设置为解决方案的启动项目,请右键单击该项目,选择Set As StartUp Project

在我正确设置了启动项目之后,线程就达到了所需的断点。


问题是调试信息与程序集不同步。解决方案很简单:

  • 转到您的bin文件夹
  • 删除.pdb文件
  • 重建
  • 就应该这么做!

    (奇怪的是,在不丢弃.pdb文件的情况下进行重建并不总是有效的。我可以看到修改日期正在更新,但仍在链的某个位置(vs2013调试器、IIS、程序集缓存)未检测到此更改)


    对于我来说,解决方案隐藏在项目属性的Advanced Build Settings中:enter image description here

    由于未知原因,它被设置为none:设置为full导致了断点被击中。

    要访问此对话框,请打开项目属性,然后转到Build,然后选择页面底部的Advanced...按钮。


    尝试在调试模式下运行时禁用并重新设置断点,而不是在启动调试模式之前执行该操作。


    在我的例子中,我正在开发一个WindowsCE应用程序,它在模拟器上进行了测试。问题是,可执行文件没有部署到仿真器,因此.pdb(在开发环境中)与.exe(在仿真器中)不同步,因为从未将新的.exe复制到仿真器。我必须删除模拟器中的.exe才能强制进行新的部署。然后它奏效了。


    去:

    Tools > Options > Debugging > General > unchecked"Require source
    files to exactly match the original version"


    在我的例子中,我附加了一个在vs 2012中运行的过程。附加时,您可以选择以各种模式(本机、脚本、Silverlight、托管2.0、托管4.0等)进行调试。默认情况下,调试器自动选择模式。然而,自动并不总是做出正确的选择。如果进程包含多种类型的代码,请确保调试器使用的是正确的代码。


    我在VS2017的32位构建中体验到了这一点。

    完全没有一个解决方案对我有用。我重新启动,清除了IDE文件,清除了构建的解决方案,从Git repo中提取并重新构建了解决方案,但没有用。

    我从nuget中引入了一个64位的依赖项,当我使用该程序集时,源不再构建到最终的可执行文件中,而是构建了IDE缓存的源。

    我删除了nuget配置,删除了引用的程序集,下载了源代码,手工构建了log4net,对它进行了签名,将它添加到我的项目中的一个文件夹中,添加了对它的引用,并且我能够再次进行调试。

    这是一种痛苦,我希望它能出现在答案列表中,让所有人都能看到。

    编辑:尽管在IDE设置中启用了"生成错误时提示"选项,但生成过程中没有错误。


    在Windows 7和Visual Studio Express 2010下,如果已激活选项"对Windows XP SP3使用兼容模式",则可能会发生此错误。

    我取消选择,它又完美地工作了。右键单击VS或可执行文件的快捷方式,选择"属性",然后选择"兼容性"。


    对我来说有效的是将解决方案平台从x86改为任何CPU。在更改为any之后,我设置了一个停止地址,运行网站,打开页面,单击按钮,它就停止了。我关闭了站点,改回x86并成功地执行了相同的顺序。


    首先,我从命令行尝试;

    从命令行删除临时文件确实有效。

    C:windowsmicrosoft.netframework64v4.0.30319 emporary asp.net files>rd/s根目录

    禁用"工具"->"选项"->"调试"->"常规"中的"仅启用代码"选项时

    我的问题解决了。它是一个wcf应用程序,正在尝试调试ashx页。http://blogs.msdn.com/b/zainnab/archive/2010/10/25/understanding-just-my-code.aspx


    尝试调试时,请确保未处于释放模式。


    如果调试的进程包含多个AppDomain,并且程序集同时加载到两个AppDomain中,并且其中一个进程正在加载旧副本(通常是动态加载的内容,如插件),则断点可能看起来是实心的,但应命中断点的线程位于旧程序集的AppDomain中,并且永远不会命中。您可以在模块窗口中看到加载的程序集及其路径。


    检查解决方案中是否有多个同名文件。

    我有一个项目,我从别人那里接管了这个项目。断点列表在controller.cs中充满了行号,有些是活动的,有些不是。我发现了这个问题,并尝试了一些选项,但是当我双击断点时,它们将我带到解决方案中的不同项目。因为文件被调用是相同的,所以它们看起来是相同的,但不是。答案当然是忽略警告,因为如果您加载另一个文件,它们将变为活动的。


    在我将现有文件添加到项目之后,它碰巧出现在了Visual Studio 2017上。这对我很有用:

  • 关闭解决方案,
  • SolutionFolder\.vs\SolutionName\v15\sqlite3取下storage.ide
  • 再次打开解决方案

  • 可能是从GAC加载了DLL。

    您可以从GAC卸载DLL,需要管理员权限。

    加克蒂尔-U尤德尔


    在我的例子中,我忘记在我声明模板函数的头文件中包含"stdafx.h"。


    对于vs代码用户:

    如果在尝试调试ASP.NET核心应用程序时点击此按钮,请确保在tasks.json中定义的构建任务以及在调试控制台窗格中可以看到的输出成功运行。

    引用此任务的launch.json中定义的调试配置由于某种原因(至少在某些情况下)将继续执行定义的二进制文件,即使生成任务失败,而且由于生成任务失败,该二进制文件将成为最后一个成功生成的程序集。


    这发生在我身上是因为我在解决方案中有其他没有构建的项目。在卸载了这些有问题的项目之后(右键单击解决方案资源管理器中的项目->卸载项目),重新构建解决方案并再次运行——点击了断点!


    我之前一直在处理我的csproj文件。因此,在项目属性(vs 2013)>Web选项卡>服务器部分>[下拉列表]下,当我以前选择"本地IIS"时,我选择了"IIS Express"。一旦我将设置更正为以前的设置,断点就工作了。


    有些情况下,重新编译和重建并不能帮助克服这个问题。其他可能的解决方案之一是从解决方案资源管理器中删除带有断点的源文件,然后再次添加它(例如,从文件夹中拖放)。


    对于我来说,我的网站运行在默认网站(http://localhost/myapp/)下的一个IIS应用程序中,而该IIS应用程序的映射指向的磁盘路径与我正在处理的源代码不同。

    要解决此问题,请将您的IIS应用程序重新映射到与正在生成的源代码相同的路径。

    (如果同一应用程序的多个版本从磁盘上的不同位置运行,则可能发生这种情况)


    还有一些版本的vs 2017(与.editorconfig结合使用)存在问题:从15.3开始,当文件的字符集与.editorconfig(utf8或utf8-bom)中的字符集不同时,断点不起作用。


    在我的例子中,问题是在项目属性>>Web下未启用ASP.NET调试


    最近我遇到了这种情况,在我的案例中,我将问题追溯到测试时所做的事情:更改系统时间。我不是说每个人都是这样,但我想我会提到它,因为它还没有被提到过。如果您开始在调试版本之间移动时钟,那么它可能会对创建各种文件的顺序感到非常困惑-我只能假设它使用文件修改日期来确定源代码是否有效,以及需要重新编译哪些二进制文件。

    它也是一个重新保存web.config以缩短修改时间的选项。


    我刚重新启动了电脑,它对我很管用。


    code causing the

    我发现当断点位于无法断开的行上时出错。我没有显示工具提示,试图在没有错误后直接显示行。