不确定是否可行......我正在阅读大型软件代码,有时在跟踪访问某个变量时会感到迷失。
如果有工具/方法来追踪它,那将会很棒。
更具体地说,假设我有以下课程。
class A
{
public:
int _a;
};
...
以及每当
... = ...->_a;
在运行时,我想打印出FILE和LINE。谢谢你的建议。
P.S。,我可以看看所有“ - > _a”的出场次数,但这也很难理清。
答案 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)
您可以使用OpenGrok或Source Navigator等工具查找所有匹配项。这是静态分析,而不是运行时,但比grep更容易。
答案 2 :(得分:0)
调试C代码最强大的工具之一是GDB。根据您的特定需要,您可以在GDB中使用watch / awatch / rwatch命令来识别访问变量(读/写)时的点。一旦程序执行在这些点停止,您可以使用print
来检查或设置该变量的值。
有关进一步说明,请参阅this link。