0

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

如果有工具/方法可以追踪它,那就太好了。

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

class A
{
  public:
    int _a;
};

...

并且无论何时

... = ...->_a;

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

PS,我可以 grep 所有“->_a”的出现,但这也很难理清。

4

3 回答 3

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

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

编辑

抱歉,我忘记了FILELINE

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

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

编辑 2

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

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

于 2012-09-03T22:47:21.283 回答
0

您可以使用OpenGrokSource Navigator之类的工具来查找所有事件。这是静态分析,不是运行时,但比 grep 更容易。

于 2012-09-03T23:05:13.963 回答
0

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

有关进一步说明,请参阅此链接

于 2012-09-04T02:59:45.073 回答