【问题标题】:How can I trace a variable at runtime in C#?如何在 C# 中在运行时跟踪变量?
【发布时间】:2011-02-24 03:02:21
【问题描述】:

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

【问题讨论】:

  • 为什么调试器不是一个选项?这正是它的用途。
  • @0xA3 因为我需要在我的应用程序中访问这些值,在运行时,只有当它们发生变化时。
  • 如何将变量的变化值写入一个简单的日志文件。
  • @Shivam 这是变量跟踪的结果,而不是原因????

标签: c# variables trace


【解决方案1】:

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

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

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

放置此类断点的明显位置是在属性设置器中。这是您在代码中实现此功能所需要的。你可以在那个 setter 中做任何你想做的事情,例如使用 Trace 类。

【讨论】:

  • ⁺¹ 对于答案,我有点不同意一个简单的条件断点大大减慢的观点。由于 C# 被转换为字节码,因此调试器最合适的方法是创建并插入一个字节码,该字节码会打印一个值来代替值。我看不出为什么不能以这种方式完成 - 因此我将调试器断点的另一种实现称为性能错误。
  • 不,C#转换为机器码,IL只是一个中间步骤。使用 Debug > Windows > Disassembly 来查看它。功能,而不是错误。
【解决方案2】:

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

http://www.sharpcrafters.com/postsharp

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 调试器如何对任意变量进行处理?难道没有调试库可以帮助我实现相同级别的跟踪吗?
      【解决方案5】:

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

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

      How to: Implement the INotifyPropertyChanged Interface

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

      【讨论】:

      • 我在问题中提到我对任意变量感兴趣,而不是属性。我知道 INotifyPropertyChanged,我不知道如何跟踪任意变量,就像调试器一样。
      猜你喜欢
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 2020-08-06
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      相关资源
      最近更新 更多