不確定是否可行......我正在閱讀大型軟件代碼,並且在跟蹤訪問特定變量的方式時有時感覺丟失。跟蹤變量訪問(c/C++)?
如果有工具/方法來追蹤它,那將會很棒。
更具體地說,假設我有以下類。
class A
{
public:
int _a;
};
...
每當
... = ...->_a;
運行過程中,我想打印出的文件和行。感謝您的建議。
P.S.,我可以grep所有「 - > _ a」的外觀,但這也很難理清。
不確定是否可行......我正在閱讀大型軟件代碼,並且在跟蹤訪問特定變量的方式時有時感覺丟失。跟蹤變量訪問(c/C++)?
如果有工具/方法來追蹤它,那將會很棒。
更具體地說,假設我有以下類。
class A
{
public:
int _a;
};
...
每當
... = ...->_a;
運行過程中,我想打印出的文件和行。感謝您的建議。
P.S.,我可以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;
}
按照你的例子:
創建一個類,並提供了隱式轉換操作;
用你的成員變量代替這個新類。
隱式轉換運算符將完成這項工作。
它將打印:
整數稱爲
提示:不要讓一個成員變量是公共的。始終提供一個訪問器方法。
編輯
對不起,我忘了FILE和LINE:
我沒有找到一個方法來注入LINE或FILE因爲隱式轉換會在預處理時在運行時完成宏替換。
你可以做的是在@veer所指的隱式轉換函數中放置一個斷點,然後手動跟蹤每個調用。
編輯2
至少它可以看到在運行時調用堆棧。
在Linux上,可以通過execinfo和Windows通過StackWalker完成。
這很有趣,但是在哪裏注入「__FILE__」和「__LINE__」? – user180574
您可以使用類似OpenGrok或Source Navigator的工具查找所有的事件。這是靜態分析,而不是運行時,但比grep更容易。
調試C代碼最強大的工具之一是GDB。爲了您的具體需要,您可以使用GDB中的watch/awatch/rwatch命令來識別變量訪問(讀/寫)時的點。一旦程序在這些點停止執行,您可以使用print
來檢查或設置該變量的值。
請參考this link作進一步說明。
您可以通過啓動調試器並設置斷點來做類似的事情。 – oldrinb
或者通過使變量爲'private',並將追蹤代碼添加到訪問器函數中。 –
想到這一點,只要讓變量'private'並在代碼上運行編譯器就可能準確地報告你要求的內容,文件和行。 –