gpt4 book ai didi

c++ - 跟踪 C++ 变量值的来源

转载 作者:行者123 更新时间:2023-11-30 04:01:12 24 4
gpt4 key购买 nike

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

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

PS:与几乎所有遗留代码一样,该代码难以遵循,没有单元测试等。

编辑:变量上的数据断点只会显示链中的端点。多一点就好了。

最佳答案

您可以做的是用一系列通用包装器包装您感兴趣的变量,这些包装器将记录 stacktrace以及每次调用的值。类似(省略一些细节):

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

关于c++ - 跟踪 C++ 变量值的来源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25907469/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com