在Visual Studio中调试时,有时我添加了一个断点,但它是空心的,VS说“断点目前不会被击中。”源代码与原始版本不同。”显然,这使我无法进行调试。
这条消息到底是什么意思?什么原始版本?如果我只是打开了解决方案,而没有对代码做任何更改,又怎么会有“原始版本”呢?
在Visual Studio中调试时,有时我添加了一个断点,但它是空心的,VS说“断点目前不会被击中。”源代码与原始版本不同。”显然,这使我无法进行调试。
这条消息到底是什么意思?什么原始版本?如果我只是打开了解决方案,而没有对代码做任何更改,又怎么会有“原始版本”呢?
当前回答
关闭Visual Studio并重新打开解决方案可以修复这个问题,即它是IDE本身的一个bug(我正在运行VS2010)。
如果有多个Visual Studio实例正在运行,则只需关闭运行有问题的解决方案的实例。
其他回答
尝试在运行调试模式时禁用和重新设置断点,而不是在启动调试模式之前禁用和重新设置断点。
在我的案例中,是项目/属性/构建选项卡中的错误设置
我有一个主项目引用项目xxx.dll 引用dll中的断点未被命中。
对dll的引用被设置为库文件夹中的bin\debug\xxx.dll
因此,当我调试主项目时,它会到库的bin\debug文件夹中寻找xxx.dll。
但是,在库的属性中,由于一些黑暗的原因,输出路径被设置为bin\x86\debug而不是bin\debug
因此,库的每次构建都将新的dll放在bin\x86\debug文件夹中,而不是在bin\debug中
所以VS在调试的时候总是找到一个旧的库的dll,因此错误是正确的,有一个不同的源。
所以我修正了从库到bin\debug的输出路径,所以主项目的引用现在会找到正确的版本,现在我的断点再次被击中。
我花了好几个星期才弄明白
当调试期间或调试会话之间的系统时间发生变化时,可能会发生这种情况,无论是通过编程方式、手动方式还是通过外部程序。
这也发生在调试一个c++项目时,该项目加载了一个用一些CLR语言(Managed c++, c#等)实现的模块。在这种情况下,错误消息确实具有误导性。
解决方案是将公共语言运行库(CLR)支持配置属性放入启动项目并重新编译它。
注意vs中的“Output”窗口,它会告诉你加载了哪些程序集以及何时加载。您可能会看到正在加载文件夹中某个位置的程序集的旧版本。
例如,如果您有多个程序集,并且当前正在尝试插入其中一个支持程序集,CLR将处理程序集解析,这可能会加载您在项目中引用的程序集文件以外的另一个程序集文件。