2012-09-03 79 views
0

不確定是否可行......我正在閱讀大型軟件代碼,並且在跟蹤訪問特定變量的方式時有時感覺丟失。跟蹤變量訪問(c/C++)?

如果有工具/方法來追蹤它,那將會很棒。

更具體地說,假設我有以下類。

class A 
{ 
    public: 
    int _a; 
}; 

... 

每當

... = ...->_a; 

運行過程中,我想打印出的文件和行。感謝您的建議。

P.S.,我可以grep所有「 - > _ a」的外觀,但這也很難理清。

+2

您可以通過啓動調試器並設置斷點來做類似的事情。 – oldrinb

+2

或者通過使變量爲'private',並將追蹤代碼添加到訪問器函數中。 –

+0

想到這一點,只要讓變量'private'並在代碼上運行編譯器就可能準確地報告你要求的內容,文件和行。 –

回答

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; 
} 

按照你的例子:

  • 創建一個類,並提供了隱式轉換操作;

  • 用你的成員變量代替這個新類。

隱式轉換運算符將完成這項工作。

它將打印:

整數稱爲

提示:不要讓一個成員變量是公共的。始終提供一個訪問器方法。

編輯

對不起,我忘了FILELINE

我沒有找到一個方法來注入LINEFILE因爲隱式轉換會在預處理時在運行時完成宏替換。

你可以做的是在@veer所指的隱式轉換函數中放置一個斷點,然後手動跟蹤每個調用。

編輯2

至少它可以看到在運行時調用堆棧。

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

+0

這很有趣,但是在哪裏注入「__FILE__」和「__LINE__」? – user180574

0

您可以使用類似OpenGrokSource Navigator的工具查找所有的事件。這是靜態分析,而不是運行時,但比grep更容易。

0

調試C代碼最強大的工具之一是GDB。爲了您的具體需要,您可以使用GDB中的watch/awatch/rwatch命令來識別變量訪問(讀/寫)時的點。一旦程序在這些點停止執行,您可以使用print來檢查或設置該變量的值。

請參考this link作進一步說明。