C++变量改变监视器

4
为了调试目的,我想找到一种自动跟踪设计中涉及变量的更改的方法。
我希望得到的结果是,在每次分配变量时自动显示新值的 printf,但不需要手动插入所有的 printf。
最好的方法是什么? 谢谢。

1
调试器可以做到这一点。您需要在代码中完成吗? - jalf
否则(如果不是调试器方法),您需要确保使用访问器,或者包装所有变量,以便operator=、复制和其他赋值方法触发一些输出。 - Caribou
请问您使用哪个集成开发环境?我知道在Visual Studio中有几种方法可以实现。 - Mikhail Shcherbakov
3个回答

7

创建一个新的类来监控你想要的变量,并定义适当的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 modified\n");
        m_value = value;
        return *this;
    }
private:
    T m_value;
}

使用示例:

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

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

0

WaitOnAddress

{{链接1: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。

0
尝试为它们编写一些代理类并重新定义赋值运算符。 它可以具有指针或值语义,但我更喜欢指针,因为它更简单。
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_;
};

这个语法具有混合的语义。如果你写了 proxy<int> i; 那么 i = 12*i = 12 将会产生相同的效果。 - Jon Purdy
是的,但这就是应该的方式。 *i = x; 在代理后进行赋值 =) - kassak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接