c - 我如何跟踪 gcc 中的变量变化

标签 c gcc

是否可以跟踪变量何时何地发生变化以及如何发生变化?我在 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/

相关文章:

c - c中结构中的动态分配内存

核心文件大小限制对进程具有不确定性影响

C++程序崩溃了

c - 为什么 scanf 对大 float 输入错误?

c - STM32 - DWT 周期计数与我的预测不同

c - 在C中初始化整数指针数组

c - 归并排序间隔递归

c++ - 使用 gcc 插件插入全局变量声明

c++ - 使用相同操作系统/编译器时,三角函数的结果是否应该依赖于硬件?

docker - 在 Alpine 上从源代码构建 GCC : <asm/param. h> 未找到