C++变量更改监视器

C++ variable change monitor

本文关键字:监视器 变量 C++      更新时间:2023-10-16

出于调试目的,我想找到一种方法来自动跟踪设计中涉及的变量的变化。

我想获得的结果就像每次分配变量时新值的 printf,但没有手动插入所有 printf。

最好的方法是什么?谢谢

为要监视的变量创建一个新类,并定义适当的operator=赋值运算符方法:

template <class T>
class MonitoredVariable
{
public:
    MonitoredVariable() {}
    MonitoredVariable(const T& value) : m_value(value) {}
    T operator T() const { return m_value; }
    const MonitoredVariable& operator = (const T& value)
    {
        printf("Variable modifiedn");
        m_value = value;
        return *this;
    }
private:
    T m_value;
}

用法示例:

MoniredVariable<int> x;
x = 42;  // Will print "Variable modified"

当然,为了有用,您必须在operator=实现中包含相关信息,并且还必须重载其他算术赋值运算符,例如+=-=等。

尝试为它们编写一些代理类并重新定义赋值运算符。它有指针或值语义,但我更喜欢指针,因为它很简单。

template<class T>
struct proxy
{
//add const version
  T & operator * ()
  {
    std::cout << "access" << std::endl;
    return val_;
  }
  T * operator -> ()
  {
    std::cout << "access" << std::endl;
    return &val_;
  }
  proxy<T> & operator = (T const & other)
  {
    std::cout << "access" << std::endl;
    val = other;
    return (*this);
  }
private:
   T val_;
};

WaitOnAddress

ULONG g_TargetValue; // global, accessible to all threads
ULONG CapturedValue;
ULONG UndesiredValue;
UndesiredValue = 0;
CapturedValue = g_TargetValue;
while (CapturedValue == UndesiredValue) {
      WaitOnAddress(&g_TargetValue, &UndesiredValue, sizeof(ULONG), INFINITE);
      CapturedValue = g_TargetValue;
}

您必须创建一个线程来等待另一个线程更改g_TargetValue。