20

Visual Studio 的调试器有时会进入无法计算表达式的状态。这会阻止它显示属性值。例如,如果您正在查看堆栈顶部报告的线程[Managed to Native Transition],并且您通过例如 Locals 窗口中的引用查看任何属性this,它们都会报告Cannot evaluate expression because a native frame is on top of the call stack

当调试器处于此状态时,您仍然可以检查字段,因为这不需要执行代码的能力。(属性变得不可用的原因是调试器实际上运行 getter 来检索值。如果您所在的线程被埋在一些非托管代码中,它就不能这样做。)

不幸的是,存储 C# 自动属性值的编译器生成的字段不会显示在调试器中。(这些是名称类似的字段<MyProperty>__BackingField。)

我尝试在调试器选项中启用“在变量窗口中显示对象的原始结构”设置,但这似乎对这些隐藏字段没有帮助。

有没有办法让调试器向我显示编译器隐藏的字段?

或者,当通常的属性评估不可用时,是否有其他方法可以发现汽车属性的支持字段的值?


注意:在这种情况下,重写代码以使用手动实现的属性不是一种选择,因为我想知道其值的属性在 Microsoft 库中。(特别是 Open XML SDK。)它是一个自动属性,我无法更改它。

另请注意:仅允许代码执行一点点以便它可以从本机代码转换返回不是一种选择,因为由于某种原因,代码已进入某种紧凑的繁忙循环 - 它正在消耗 CPU 内核,并且永远不会回来。(我试图诊断这个问题,这就是为什么我试图找出对象的属性值是什么——我试图准确地了解它是如何进入这种状态的。)

还有一点需要注意:这不是Acessing the backing field in an auto property的副本——我的问题是关于在调试时读取值的非常具体的问题。

此外,如果它是相关的,我正在远程调试代码,因为它在 Azure 辅助角色上运行。该问题仅发生在该环境中。据我所知,这排除了本机调试,所以我什至无法查看卡在循环中的代码位 - 我不得不尝试通过查看托管来推断它在做什么在它消失在那个兔子洞之前立即运行的代码。

4

1 回答 1

1

假设您有一个要在调试器中查看的具有属性的类:

public class C
{
    // ...
    public int I { get; set; }
    // ...
}

我相信下面的 watch 表达式会起作用(c是 class 的一个实例C):

c.GetType().GetField("<I>k__BackingField",
    BindingFlags.Instance | BindingFlags.NonPublic).GetValue(c)

不是很方便,我知道,但总比没有好。

于 2013-11-08T02:57:48.617 回答