是否可以跟踪变量何时何地发生变化以及如何发生变化?我在 Linux 上使用 gcc 用 C 编写代码
最佳答案
如果您想在变量更改时运行的程序中添加一些额外的代码,那么不行——标准 C 不提供执行此操作的方法。您必须找到程序中所有可能尝试更改变量值的地方,并在每个地方放置一些日志代码。您可以通过重命名变量然后修复编译中断点来使其更可靠,但这只有在您可以使用该变量重新编译所有“客户端”代码时才有效:如果该变量位于包含许多其他人的应用程序的库中使用它,这可能不切实际。
使用获取/设置函数进行访问...
有时最好不要编写直接使用变量的代码,而是提供获取和设置值的函数:然后如果某天有用的话,您可以在这些函数中添加一些额外的检查或日志记录。但是,您不想在任何地方都这样做,否则您的代码将变得冗长且运行速度变慢。
轮询检查变量的变化...
如果不时检查就足够了,那么您可以编写一些由定时器/警报信号触发的代码,或者在另一个线程中运行的代码,定期检查变量以查看它是否已更改,但是这不会帮助您找出它是如何变化的,如果值发生变化但又变回来,那么您可能会完全错过这些变化。
使用 C++
如果您在 C++ 下编译您的程序(如果可能的话,对于小程序甚至可能不需要对您的代码进行任何修改),那么您或许可以更改相关数据项的类型并编写一个重载的 运算符=()
变量赋值时调用的函数,以及一个operator
旧类型()
转换函数,所以变量所在的地方使用的不必修改:
template <typename T>
class Intercept
{
Intercept(const T& t) : t_(t) { }
T& operator=(const T& t) {
std::cerr << "change " << t_ << " to " << t << '\n'; t_ = t;
return *this;
}
operator T&() { return t_; }
operator const T&() const { return t_; }
T t_;
};
然后改变例如
int x; // from
Intercept<int> x; // to
调试器
正如 Drakosha 所说,如果这是一个调试问题,那么您可以在调试器下运行您的程序,直到您解决问题为止。
关于c - 我如何跟踪 gcc 中的变量变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5039239/