Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中如何在运行时跟踪变量?_C#_Variables_Trace - Fatal编程技术网

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

在C#中如何在运行时跟踪变量?,c#,variables,trace,C#,Variables,Trace,在运行时,如何在C#中跟踪变量值的变化?我感兴趣的是当我在执行步骤中跟踪变量时调试器提供的相同功能,只是我需要从代码中调用它。某种类型的键值观察,但对于所有类型的变量(局部、类、静态等),不仅仅是属性。因此,基本上,当变量的值发生变化时会收到通知。在没有调试器的情况下,唯一可行的方法是:不要使用变量,而是使用属性,并且(可能有条件地)向setter添加跟踪: private int myValue; public int MyValue { get {return myValue;}

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

在没有调试器的情况下,唯一可行的方法是:不要使用变量,而是使用属性,并且(可能有条件地)向setter添加跟踪:

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

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

要补充Marc所说的内容,如果您想对许多属性和方法执行此操作,您可能需要查看面向方面的编程技术和库,如PostSharp


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

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


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

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

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

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


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

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

为什么调试器不是一个选项?这正是它的用途。@0xA3,因为我需要在运行时从应用程序中访问这些值,只有当它们发生更改时才可以。将变量的更改值写入一个简单的日志文件怎么样。@这是变量跟踪的结果,而不是调试器如何对任意变量执行此操作的原因?有没有一个调试库可以帮助我实现相同级别的跟踪?我在问题中提到,我感兴趣的是任意变量,而不是属性。我知道INotifyPropertyChanged,但我不知道如何像调试器那样跟踪任意变量。⁺对于答案,我有点不同意一个简单的条件断点会大大减慢速度的观点。由于C#被转换为字节码,调试器最合适的方法就是创建并插入一个字节码,该字节码会打印一个值来代替该值。我看不出有什么理由不能这样做——因此,调试器断点的另一个实现我称之为性能缺陷。不,C#被转换为机器代码,IL只是一个中间步骤。使用调试>窗口>反汇编查看它。功能,而不是bug。