代码之家  ›  专栏  ›  技术社区  ›  luvieere

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

  •  5
  • luvieere  · 技术社区  · 16 年前

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

    5 回复  |  直到 16 年前
        1
  •  3
  •   Hans Passant    16 年前

    您的工作假设是调试器可以跟踪变量更改。它不能。

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

    托管调试器确实支持断点上的“命中时”条件,允许您将信息转储到输出窗口。但是,这需要一个断点,它不能由变量值的更改触发。它也 真正地 由于调试器在执行条件之前实际上进入了中断状态,因此会减慢代码执行速度。

    放置这样一个断点的明显位置是在属性设置器中。这就是在代码中实现这个特性所需要的。例如,可以使用跟踪类在该setter中执行任何您想要的操作。

        2
  •  3
  •   RationalGeek    16 年前

    为了补充Marc所说的内容,如果你想为很多属性和方法做这些,你可能需要检查面向方面的编程技术和库,比如Postshap。

    http://www.sharpcrafters.com/postsharp

        3
  •  1
  •   Donnie    16 年前

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

        4
  •  0
  •   Marc Gravell    16 年前

    唯一明智的方法就是 没有 调试器应该是:不要使用变量,而是使用属性,并且(可能是有条件地)向setter添加跟踪:

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

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

        5
  •  0
  •   Dirk Vollmar    16 年前

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

    有关如何实现它的示例,请参见

    How to: Implement the INotifyPropertyChanged Interface

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