跟踪变量访问(c / c ++)?

时间:2012-09-03 22:34:12

标签: c++ c

不确定是否可行......我正在阅读大型软件代码,有时在跟踪访问某个变量时会感到迷失。

如果有工具/方法来追踪它,那将会很棒。

更具体地说,假设我有以下课程。

class A
{
  public:
    int _a;
};

...

以及每当

... = ...->_a;

在运行时,我想打印出FILE和LINE。谢谢你的建议。

P.S。,我可以看看所有“ - > _a”的出场次数,但这也很难理清。

3 个答案:

答案 0 :(得分:3)

而不是:

class A
{
  public:
    int _a;
};

你可以这样做:

#include <iostream>

class Integer
{
public:
    Integer(int value) : value(value)
    {
    }

    operator int()
    {
        std::cout << "Integer called\n";
        return value;
    }
private:
    int value;
};

class A
{
public:
    A() : _a(5) {}
    Integer _a;
};

int main(int argc, char *argv[])
{
    A a;
    std::cout << a._a << std::endl;

    return 0;
}

按照你的例子:

  • 创建一个类并为隐式转换提供运算符;

  • 将您的成员变量替换为此新类。

隐式转换运算符将完成工作。

它将打印:

  

整数称为

     

5

提示:永远不要让成员变量公开。始终提供访问方法。

修改

抱歉,我忘了文件 LINE

我没有找到注入 LINE FILE 的方法,因为隐式转换将在运行时完成,同时在预处理下进行宏替换。

你可以做的是在隐式转换函数中设置一个断点,如@veer所指出的那样,并手动跟踪每个调用。

修改2

至少可以在运行时看到调用堆栈。

在Linux上,这可以通过execinfo和Windows StackWalker完成。

答案 1 :(得分:0)

您可以使用OpenGrokSource Navigator等工具查找所有匹配项。这是静态分析,而不是运行时,但比grep更容易。

答案 2 :(得分:0)

调试C代码最强大的工具之一是GDB。根据您的特定需要,您可以在GDB中使用watch / awatch / rwatch命令来识别访问变量(读/写)时的点。一旦程序执行在这些点停止,您可以使用print来检查或设置该变量的值。

有关进一步说明,请参阅this link