Visual Studio 的调试器有时会进入无法计算表达式的状态。这会阻止它显示属性值。例如,如果您正在查看堆栈顶部报告 [Managed to Native Transition]
的线程,然后您通过 this
查看任何属性在 Locals 窗口中引用,它们都会报告 Cannot evaluate expression because a native frame is on top of the call stack
.
当调试器处于这种状态时,您仍然可以检查字段,因为那不需要执行代码的能力。 (属性变得不可用的原因是调试器实际上运行 getter 来检索值。如果您所在的线程隐藏在某些非托管代码中,它就无法做到这一点。)
不幸的是,编译器生成的存储 C# 自动属性值的字段不会显示在调试器中。 (这些字段的名称类似于 <MyProperty>__BackingField
。)
我已经尝试在调试器选项中启用“在变量窗口中显示对象的原始结构”设置,但这似乎对这些隐藏字段没有帮助。
有没有办法让调试器向我显示编译器隐藏的字段?
或者,当通常的属性评估不可用时,是否有其他方法可以发现汽车属性的支持字段的值?
注意:在这种情况下,重写代码以使用手动实现的属性不是一种选择,因为我想知道其值的属性在 Microsoft 库中。 (特别是 Open XML SDK。)这是一个自动属性,我无法更改它。
另请注意:简单地允许代码执行稍微进行以便它可以从 native 代码转换返回并不是一种选择,因为出于某种原因,代码已经进入某种紧忙循环——它正在消耗一个 CPU 核心,并且永远不会返回。 (我试图诊断这个问题,这就是为什么我试图找出对象的属性值是什么 - 我试图准确了解它是如何进入这种状态的。)
请注意:这不是Acessing the backing field in an auto property 的副本- 我的问题非常具体地涉及在调试时读取值。
此外,如果相关,我正在远程调试代码,因为它在 Azure 辅助角色上运行。该问题仅发生在该环境中。据我所知,这排除了 native 调试,所以我什至不能去查看卡在循环中的代码——我不得不通过查看托管来尝试推断它在做什么在它消失到那个兔子洞之前正在运行的代码。
最佳答案
假设您有一个类,其中包含您想要在调试器中观察的属性:
public class C
{
// ...
public int I { get; set; }
// ...
}
我相信下面的 watch 表达式会起作用(c
是类 C
的一个实例):
c.GetType().GetField("<I>k__BackingField",
BindingFlags.Instance | BindingFlags.NonPublic).GetValue(c)
不是很方便,我知道,但聊胜于无。
关于c# - 如何在 Visual Studio 调试器中查看 C# 自动属性的支持字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19841524/