排查数据断点错误 (.NET)

本文可帮助你解决使用“值更改时中断”时发生的常见错误。

诊断“无法设置数据断点”错误

重要

.NET Core 3.0、.NET 5.0.3 及更高版本中支持托管数据断点。 可以在 此处下载最新版本。

使用托管数据断点时,可能会出现以下错误。 本文介绍这些错误发生的原因,并提供可能的解决方案或解决方法来解决这些错误。

  • 目标进程使用的 .NET 版本不支持数据断点。 数据断点需要 .NET Core 3.x 或 .NET 5.0.3+,在 x86 或 x64 上运行。

    从 .NET Core 3.0 开始支持托管数据断点。 .NET Framework、3.0 以下的 .NET Core 版本或 5.0.3 下的 .NET 版本目前不受支持。

    解决方法:若要解决此错误,请将项目升级到 .NET Core 3.x 或 .NET 5+。

  • 无法在托管堆上找到该值,并且无法跟踪。

    • 在堆栈上声明的变量。

      不支持为堆栈上创建的变量设置数据断点,因为这些变量在函数退出后将无效。

      解决方法:在使用变量的行上设置断点。

    • 未从下拉菜单展开的变量上的“值更改时中断”。

      调试器在内部需要知道包含要跟踪的字段的对象。垃圾回收器可能会在堆中移动对象,因此调试器需要知道保存要跟踪的变量的对象。

      解决方法:如果位于要设置数据断点的对象内的方法,请执行以下步骤:

      a. 导航到包含你感兴趣的对象的方法的框架。
      b. 打开“ 局部变量”、“ 自动”或 “监视 ”窗口。
      c. 找到对象并将其展开以显示其字段。
      d. 右键单击要在其中设置数据断点的字段,然后在上下文菜单中的值发生更改时选择“中断”。

  • 静态字段或静态属性不支持数据断点。

    目前不支持静态字段和属性。 如果对此功能感兴趣,请提供 反馈

  • 无法跟踪结构的字段和属性。

    目前不支持结构字段和属性。 如果对此功能感兴趣,请提供 反馈

  • 属性值已更改,无法再跟踪。

    属性可能会更改它在运行时的计算方式。 如果发生这种情况,则属性所依赖的变量数将增加,并可能超过硬件限制。 有关详细信息,请参阅以下错误:“属性依赖于比硬件跟踪的内存多。

  • 该属性依赖于比硬件可以跟踪的内存多。

    每个体系结构都有一组字节数和硬件数据断点,它可以支持该断点,以及要设置数据断点的属性已超过该限制。 请参阅 数据断点硬件限制 表,了解可用的硬件支持的数据断点和字节数,这些断点和字节可用于所使用的体系结构。

    解决方法:在属性中对可能发生更改的值设置数据断点。

  • 使用旧 C# 表达式计算器时不支持数据断点。

    数据断点仅在非旧 C# 表达式计算器中受支持。

    解决方案:若要禁用旧 C# 表达式计算器,请执行以下步骤:

    1. 转到 Visual Studio 中的“调试” 菜单。
    2. 选择“选项”。
    3. 导航到 “调试>常规”。
    4. 取消选中 “使用旧 C# 和 VB 表达式计算器 ”选项。
  • 类 X 具有自定义调试器视图,它阻止对特定于它的数据使用数据断点。

    数据断点仅在目标进程(已调试的应用程序)创建的内存上受支持。 设置数据断点的内存已被标记为可能由 DebuggerTypeProxy 属性创建的对象或不属于目标进程的其他内容所拥有。

    解决方法:展开 原始视图 而不是 对象的 DebuggerTypeProxy 视图,然后设置数据断点。 这可以保证数据断点不在属性创建的对象拥有的内存中 DebuggerTypeProxy

数据断点硬件限制

程序运行的体系结构(平台配置)具有有限数量的可用硬件数据断点。 下表指明了每个体系结构可使用的寄存器数。

体系结构 硬件支持的数据断点数 最大字节大小
x86 4 4
X64 4 8
ARM 1 4
ARM64 2 8

提供反馈

有关此功能的任何问题或建议,请通过 IDE 或开发者社区中的帮助>发送反馈>报告问题告知我们。

另请参阅