如何跟踪gcc中的变量更改

时间:2011-02-18 08:48:52

标签: c gcc

是否可以追踪变量在何处以及如何变化?我在Linux上使用gcc在C编码

2 个答案:

答案 0 :(得分:4)

如果你想在变量中运行的程序中放入一些额外的代码,那么没有 - 标准C没有提供这样做的方法。您必须找到程序中可能尝试更改变量值并在每个位置放置一些日志记录代码的所有位置。您可以通过重命名变量然后修复编译中断的点来使其更可靠,但这只有在您可以使用变量重新编译所有“客户端”代码时才有效:如果变量位于包含许多其他人的应用程序的库中使用它,这可能不实用。


使用get / set函数进行访问...

有时候最好不要编写直接使用变量的代码,而是提供获取和设置值的函数:然后,如果某些函数在某一天变得有用,你可以在这些函数中添加一些额外的检查或记录。但是,您不希望在任何地方都这样做,或者您的代码将会冗长且运行速度较慢。


轮询检查变量的变化......

如果它偶尔检查好,那么你可以编写一些由定时器/报警信号触发的代码,或者在另一个线程中运行的代码,它定期检查变量以查看它是否已更改,但是这无法帮助您了解它是如何变化的,如果值发生变化但又被更改,那么您可能会完全错过这些变化。


使用C ++

如果你在C ++下编译你的程序(如果可能的话,对于小程序甚至可能不需要对你的代码进行任何修改),那么你也许可以改变有问题的数据项的类型并编写一个重载的{{1}在分配变量时将调用的函数,以及operator=()旧类型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_;
};

<强>调试器

正如Drakosha所说,如果这是一个调试问题,那么您可以在调试器下运行程序,直到您解决问题。

答案 1 :(得分:1)

gdb中有内存断点。我认为这正是你要找的东西:

Can I set a breakpoint on 'memory access' in GDB?