繁体   English   中英

跟踪C ++变量值的来源

[英]Track the origin of a C++ variable's value

进行某些更改后,应用程序的输出在某些情况下将不再有效。 一些输出值是错误的。 用于计算这些输出的值是正确的,并且在复杂的处理过程中的某个时刻,事情发生了错误的转变。

是否有工具来跟踪C ++变量值的来源? 我以前使用过valgrind来跟踪NULL值,但是我想要的是更通用的东西。 有没有更通用的工具来显示导致变量在某个时间点具有其值的分配链(或树)?

PS:该代码几乎是所有旧代码,很难遵循,没有任何单元测试,等等。

编辑:变量上的数据断点只会向我显示链中的端点。 超过那一点会更好。

您可以做的是使用一组通用包装器包装您感兴趣的变量,这些包装器将记录堆栈跟踪信息和每个调用的值。 有点像(省略一些细节):

template <typename T>
class TracingValue
{
private:
 T m_Val;
 ...    
 void LogStackTrace() {...}

public:

 // write
 TracingValue& operator= (const T& val) {
    LogStackTrace();
    m_Val=val;
    return *this;
 }

 // read     
 operator T () const { return m_Val; }

 // "connect" to other values
 TracingValue& operator=(const TracingValue &other) {
   LogStackTrace();
   m_Val = other.m_Val;
   std::cout << "id: " << this->Id() << " new value: " << m_Val
             << " from id: " << other.Id() << std::endl;
   return *this;
 }

};

记录堆栈跟踪信息的速度很慢,并且可能会生成过多的数据,但是如果您谨慎使用,可能会更好地了解软件中正在发生的情况。 然后,您可以在包装中放置断点,以在发生更改时捕获它们。

这应该适用于琐碎的案件。 如果涉及序列化和其他操作,则可能需要进一步完善。

可以跟踪值的变化以及从其他包装值得到的构造。 有关示例,请参阅→ Ideone

TracingValue<double> d;
d = 3.;
d = 42.;
double x = d - 2.;
std::cout << x << std::endl;
TracingValue<double> other_d(d);
TracingValue<double> another_d;
another_d = other_d;  

输出

id: 1 constructed with value: 0
id: 1 new value: 3
id: 1 new value: 42
40
id: 2 constructed with value: 42
id: 2 constructed from id: 1
id: 3 constructed with value: 0
id: 3 new value: 42 from id: 2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM