不确定是否可行...我正在阅读大型软件代码,有时在跟踪如何访问某些变量时会感到迷茫。
如果有工具/方法可以追踪它,那就太好了。
更具体地说,假设我有以下课程。
class A
{
public:
int _a;
};
...
并且无论何时
... = ...->_a;
在运行时,我想打印出 FILE 和 LINE。感谢您的建议。
PS,我可以 grep 所有“->_a”的出现,但这也很难理清。
代替:
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
提示:永远不要让成员变量公开。始终提供访问器方法。
编辑
抱歉,我忘记了FILE和LINE:
我没有找到注入LINE或FILE的方法,因为隐式转换将在运行时完成,而在预处理下进行宏替换。
您可以做的是在隐式转换函数处放置一个断点,正如@veer 所指出的那样,并手动跟踪每个调用。
编辑 2
至少可以在运行时看到调用堆栈。
在 Linux 上,这可以通过execinfo完成,在 Windows 上可以通过StackWalker完成。
您可以使用OpenGrok或Source Navigator之类的工具来查找所有事件。这是静态分析,不是运行时,但比 grep 更容易。
调试 C 代码的最强大工具之一是 GDB。对于您的特定需要,您可以使用 GDB 中的 watch/awatch/rwatch 命令来识别访问变量(读/写)时的点。一旦程序执行在这些点停止,您可以使用print
检查或设置该变量的值。
有关进一步说明,请参阅此链接。