Visual Studio 断点警告

24
调试代码时,我经常插入断点检查本地变量的值,以确保每个步骤都正确执行。最近,当我更改代码并重新编译时,所有的断点都变成了一个圆形的轮廓(而不是完整的红色圆圈),并出现了以下错误信息:

当前不会命中断点。该行没有与之相关联的可执行代码。可能的原因包括:条件编译或编译器优化。

这个问题的奇怪之处在于,我可以简单地删除和添加断点,然后一切就完全正常了。我没有使用任何类型的条件编译或编译器优化。有人知道这意味着什么或如何解决吗?每次编译都要替换10-12个断点,这真的很烦人。

你正在开发哪种类型的项目? - forsvarir
@forsvarir:该解决方案由一个类库和一个用于测试的Windows应用程序组成。断点问题会在任何一个项目中发生。 - Kyle Uithoven
你可能已经尝试过进行干净的构建,但问题仍然出现了吗?当你重新添加断点时,是在程序运行之前还是在启动后? - forsvarir
@BrunoLM:目前的解决方案正在以调试模式编译,已定义调试符号并且如果我在编译后重新插入它们,则可以正常工作,代码优化未选中。 - Kyle Uithoven
@forsvarir:清理构建似乎不起作用。为了重新添加断点,我在运行程序之前这样做,在运行时添加它们不起作用并给出上述错误。 - Kyle Uithoven
显示剩余2条评论
5个回答

20

出现这种情况可能有几个原因:

  • 调试器使用的代码与应用程序运行的代码不同
  • 调试器使用的pdb文件与应用程序运行的代码不同
  • 应用程序正在运行的代码已经被优化,并且调试信息已被剥离。
  • 你设置了断点的代码尚未加载到进程中(前提是以上几种情况不是罪魁祸首)
  • 如果你要附加调试器,请注意它所附加的 .net framework 版本(当代码都是 .net 2.0 时,我曾遇到过它使用 .net 4 的问题)
  • 你所拥有的程序集也在 GAC 中。这可能发生在你安装程序以便调试它时,安装程序将 dll 放在 GAC 中。
  • 删除引用并重新添加它(感谢 forsvarir)。通常情况下,此问题会出现在引用的项目不在解决方案中,并且 VS 将从另一个项目的 bin 目录中复制 dll。当你尝试重新添加引用却找不到该项目时,你就会知道这是问题的原因 :)

要找出发生了什么,请使用融合日志查看器查看正在加载的内容以及它们从哪里加载,然后你就可以查看 dll 并查看它是否为旧代码等。


该dll文件通过项目被引用,因此每次编译时都会编译该库并更新引用。我不能确定上述所有内容是否正确,但这是一个常见情况吗? - Kyle Uithoven
可能是这个问题。项目引用了 DLL,但由于没有代码实际使用 DLL 中的任何内容(基本上是由 IoC 注入的实现代码),因此未将其复制到输出目录中。要检查 DLL 是否被正确复制,请转到输出目录(即 bin\debug),删除其中的所有内容并重新构建。如果已复制,则该部分就没问题了。 - Darren Kopp
添加了另一个我之前遇到的与 GAC 相关的问题。也许在问题中提供更多信息可以更快地确定问题所在。 - Darren Kopp
另一个相关的事情是移除项目引用,然后再添加回来,这可能有助于解决一些问题。不过,由于Kyle在主要exe和库中都报告了问题,所以这种方法在这种情况下可能没有什么帮助 :0) - forsvarir
2
检查调试器选项总是值得的,可以在工具->选项->调试器->常规下找到。一些选项对于正确的调试是必需的(例如,对于C++/CLI应用程序,请使用托管兼容模式)。 - Alexander Pacha
谢谢,再补充一点。如果在Web配置文件中添加了新的键并将其设置为静态变量,则静态类将无法正确初始化。 - MSTdev

8

检查项目设置

确保不勾选代码优化选项,并确保已勾选调试符号。

debug

请注意,当您更改配置时,其他设置可能会发生变化,您可能无法看到。确保所选配置的值是正确的。


删除输出文件

物理删除所有生成的 DLL、PDB 和 EXE 文件。然后重新编译以生成文件。有时 Visual Studio 会“迷失方向”并在构建解决方案时“忘记”覆盖输出文件。


重新启动计算机

通常可以解决99%的问题。我已经遇到过一些 Visual Studio 的问题,重新启动它或计算机可以解决问题。


我的设置反映了上面的图片超过100%。这些是我检查的第一个设置。 - Kyle Uithoven
1
@Kyle 你试过重新启动电脑了吗?说真的,我之前也遇到过一些VS的问题,不得不重启电脑才能恢复正常。主要是与TFS有关。 - BrunoLM

2

我知道这是一个旧帖子,但仍然及时,因为我正在寻找可能导致此问题的其他原因。

话虽如此,如果您正在创建Web应用程序,则还需要检查c:\ Windows \ Microsoft.NET \ [Frameworks]目录中的“Temporary ASP.NET Files”,因为根据我的经验,这些文件通常是问题的原因。


0

为了跟踪旧的ASP.Net应用程序中的这个谜团,我将此响应添加到旧帖子中。我有一个Webform代码后台没有响应断点,并显示“...无可执行代码...”调试器警告。它让我感到困扰,因为其他所有页面都正常工作。我已经做了清理、重建、清除临时的ASP.Net文件等操作,但都没有效果。

导致问题的罪魁祸首是该文件中包含多个#ExternalSource指令,围绕一些成员变量声明出现。一旦移除了这些指令并重新构建项目,断点行为就恢复正常了。那些ExternalSource的代码行出现在代码后台的生成部分,不确定为什么会存在。


0

使用预编译指令 #line 似乎也会影响断点的行为,我刚刚发现了这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接