如何在C#中在运行时跟踪变量?

时间:2010-05-26 10:47:34

标签: c# variables tracing

如何在运行时在C#中更改变量的值?我对调试器通过执行步骤跟踪变量时提供的功能感兴趣,只是我需要从代码中调用它。某种键值观察,但对于各种变量(局部,类,静态等),不仅仅是属性。因此,基本上,当变量的值发生变化时会收到通知。

5 个答案:

答案 0 :(得分:3)

要添加Marc所说的内容,如果你想为许多属性和方法做这个,你可能想要查看面向方面的编程技术和PostSharp等库。

http://www.sharpcrafters.com/postsharp

答案 1 :(得分:3)

您正在假设调试器可以跟踪变量。它不能。

对于非托管代码,处理器可以使用专用的调试寄存器来设置数据断点。最多提供三个。当它看到特定的内存位置被写入时,它会生成硬件中断。但是,这个非常有用的功能在托管代码中不可用。垃圾收集器与它完全不兼容,它会移动对象,给它们另一个地址。

托管调试器确实支持断点上的“命中时”条件,允许您将信息转储到输出窗口。然而,这需要断点,它不能由变量值的变化触发。由于调试器在执行条件之前实际进入中断状态,因此确实会降低代码执行速度。

放置这样一个断点的显而易见的地方是属性设置器。您需要在代码中实现此功能。您可以使用Trace类在该setter中执行任何操作。

答案 2 :(得分:1)

托管调试器几乎可以使用ICorDebug COM API。您感兴趣的部分是ICorDebugValue及其后代。请注意,很多调试API要求进程不运行(即遇到断点),以便进行各种检查。 ICorDebug的高级概述是here。关于它的文档有点稀疏,但一些谷歌搜索可能会有所帮助。祝你好运。

答案 3 :(得分:0)

没有调试器的唯一合理方法是:不要使用变量,而是使用属性,并且(可能有条件地)将跟踪添加到setter:

private int myValue;
public int MyValue {
    get {return myValue;}
    set {
        SomeTraceMethod(myValue, value, ...);
        myValue = value;
    }
}

显然,这不能用于任意字段/变量。

答案 4 :(得分:0)

正如其他人所提到的那样,在使用属性时这样的机制才有意义。在.NET中,您可以使用INotifyPropertyChanged接口。

有关如何实施该示例的示例,请参阅

  

<强> How to: Implement the INotifyPropertyChanged Interface

引用的文章明确谈到了Windows窗体,但是你并没有这样做(接口实际上是在System.dll的System.ComponentModel命名空间中声明的)。实际上,该接口广泛用于数据绑定场景,例如,在WPF中。