在 Visual Studio 调试器中对断点进行故障排除

适用于: Visual Studio

断点警告

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

  • 如果调试器在目标进程中成功设置断点,则为红色实心圆。
  • 空心圆(深灰色或白色填充,具体取决于主题),如果断点被禁用或尝试设置断点时出现警告。

若要进行区分,请将鼠标悬停在断点上,查看是否有警告。 以下两个部分介绍主要警告及其解决方法。

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

在调试时导航到“调试>Windows>模块”,并检查模块是否已加载。

  • 如果模块已加载,请检查“符号状态”列以查看符号是否已加载。
    • 如果未加载符号,请检查符号状态以诊断问题:

      “模块 ”窗口中,右键单击尚未加载符号的模块,然后选择“ 符号加载信息...”

      “模块”窗口中符号加载信息的屏幕截图。

      有关加载符号的详细信息,请参阅指定符号 (.pdb) 和源文件

    • 如果已加载符号,则 PDB 不包含有关源文件的信息。 几个可能的原因是:

      • 如果源文件是最近添加的,请确认是否在加载模块的最新版本。
      • 可以使用“/PDBSTRIPPED”链接器选项创建去除的 PDB。 去除的 PDB 不包含源文件信息。 确认使用的是完整的 PDB,而不是去除的 PDB。
      • PDB 文件已部分损坏。 删除文件并运行模块清理生成,以尝试解决问题。
  • 如果未加载模块,请检查以下内容以查找原因:
    • 确认正在调试正确的进程。
    • 检查是否正在调试正确的代码。 你可以在“进程”窗口(“调试”>“窗口”>“进程”)中找到调试器被配置调试的代码类型。 例如,如果尝试调试 C# 代码,请确认已针对 .NET 的相应类型和版本(例如,托管 (v4*) 与托管 (v2*/v3*) 与托管 (CoreCLR))配置调试器。

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

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

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

按照其中一个选项来禁用这些安全检查:

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

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

本部分提供有关在调试器未显示任何警告的情况下对问题进行故障排除的信息:断点在主动进行调试时显示为红色实心圆,但未命中该断点。

可以检查以下项:

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

我删除了断点,但在再次启动调试时继续命中该断点

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