排查 Visual Studio 调试器中的断点问题

适用于: Visualstudio

断点警告

调试时, 断点 有两种可能的视觉状态:

  • 如果调试器在目标进程中成功设置了断点,则为红色实心圆圈。
  • 空心 (白色填充) 圆圈,尝试设置断点时,断点被禁用或出现警告。

若要确定差异,请将鼠标悬停在断点上,并查看是否存在警告。 以下两部分介绍突出的警告以及如何修复它们。

“此文档未加载任何符号”

在调试时转到“模块”窗口, (调试>Windows>模块) ,并检查模块是否已加载。

  • 如果模块已加载,检查“符号状态”列以查看是否已加载符号。
    • 如果未加载符号,检查符号状态来诊断问题。 从“ 模块 ”窗口中模块的上下文菜单中,选择“ 符号加载信息...” ,查看调试器尝试加载符号的位置。 有关加载符号的详细信息,请参阅 指定符号 (.pdb) 和源文件
    • 如果加载了符号,则 PDB 不包含有关源文件的信息。 一些可能的原因包括:
      • 如果最近添加了源文件,请确认正在加载模块的最新版本。
      • 可以使用 /PDBSTRIPPED 链接器选项创建剥离的 PDB。 带状 PDB 不包含源文件信息。 确认使用的是完整的 PDB,而不是剥离的 PDB。
      • PDB 文件已部分损坏。 删除文件并运行模块的干净内部版本以尝试解决此问题。
  • 如果未加载模块,检查以下内容以查找原因:
    • 确认你正在调试正确的进程。
    • 检查是否调试了正确的代码。 可以在“ 进程 ”窗口中了解调试器要调试的代码类型, (调试>Windows>进程) 。 例如,如果尝试调试 C# 代码,请确认调试器已针对适当的 .NET (类型和版本配置,例如,托管 (v4*) 与托管 (v2*/v3*) 与托管 (CoreCLR) ) 。

"… 当前源代码与内置版本不同...”

如果源文件已更改,并且源不再与要调试的代码匹配,则默认情况下,调试器不会在代码中设置断点。 通常,当源文件已更改,但源代码未重新生成时,会出现此问题。 若要解决此问题,请重新生成项目。 如果生成系统认为项目已是最新的,即使它不是,你可以强制重新生成项目系统。 重新生成项目,方法是再次保存源文件,或者在生成前清理生成输出。

在极少数情况下,你可能希望在没有匹配的源代码的情况下进行调试。 在没有匹配源代码的情况下进行调试可能会导致令人困惑的调试体验,因此请确保继续操作的方式。

按照以下选项之一禁用这些安全检查:

  • 若要修改单个断点,请将鼠标悬停在编辑器中的断点图标上,然后选择设置 (齿轮) 图标。 一个速览窗口将添加到编辑器中。 在速览窗口的顶部,有一个超链接,指示断点的位置。 选择超链接以允许修改断点位置,并检查允许源代码与原始代码不同
  • 若要修改所有断点的此设置,请转到 调试>选项和设置。 在 “调试/常规 ”页上,清除“ 需要与原始版本完全匹配的源文件 ”选项。 完成调试后,请确保重新启用此选项。

断点已成功设置 (无警告) ,但未命中

本部分提供有关调试器未显示任何警告时出现的问题的信息 -- 在主动调试时断点为红色实心圆圈,但断点未命中。

下面是要检查的一些事项:

  1. 如果代码在多个进程或多台计算机中运行,请确保调试正确的进程或计算机。
  2. 确认代码正在运行。 若要测试代码是否正在运行,请将对 System.Diagnostics.Debugger.Break (C#/VB) 或 __debugbreak (C++) 的调用添加到尝试在其中设置断点的代码行,然后重新生成项目。
  3. 如果要调试优化代码,请确保设置断点的函数未内联到另一个函数中。 前面Debugger.Break检查中所述的测试也可用于测试此问题。
  4. 对于附加到进程方案,请确保调试正确的代码类型 (例如,脚本代码与 .NET Framework 与 .NET 5+) 。 若要进行调查,检查“附加到进程”对话框中的“附加到”选项,然后选择“选择”(如有必要)更改代码类型。

我删除了断点,但在再次开始调试时,我继续命中它

如果在调试时删除了断点,则下次开始调试时可能会再次命中断点。 若要停止命中此断点,请确保已从“断点”窗口中删除断 的所有实例。