1

我正在構建一個處理我的VC++源代碼的工具。爲此,我需要獲取包含局部變量名稱及其代碼使用的類型的符號列表。我知道Visual C++ 2010已經提供了一個.bsc文件,它允許對象瀏覽器快速定位符號。但這是一個交互式工具。我需要獲取文件中符號的列表。是否有任何工具可以讓我們以編程方式獲得我們自己的VC++源代碼中使用的符號列表?獲取我的VC++代碼使用的符號列表

我試過微軟提供的Debug Interface Access SDK。它允許我們讀取.pdb文件中所使用的局部變量的名稱。但我也想獲得我的源代碼中使用的確切類型名稱。例如

MYTYPE dwordVar; 

DIA SDK允許我們獲取字符串「dwordVar」,它是局部變量的名稱。但它不能告訴它的類型名稱是「MYTYPE」。它只能告訴我們MYTYPE真正代表什麼(像unsigned long)。但不是符號「MYTYPE」。

如果Visual C++不提供此功能,是否有任何第三方工具支持此功能?

+0

IDiaSymbol有很多屬性。一定要區分get_type和get_baseType。張貼片段將是明智的。 –

+0

@HansPassant:只有[這些屬性](http://msdn.microsoft.com/zh-cn/library/w8ae4k32.aspx)適用於數據符號。 –

回答

1

用此程序進行實驗:

typedef unsigned long MYTYPE; 

int wmain(int argc, wchar_t *argv[]) 
{ 
    MYTYPE test = 99LU; 
} 

既DIA SDK和DBGHELP返回16(SymTagBaseType)爲類型符號的symtype爲test。如果類型符號是Typedef符號(17/SymTagTypedef),但它可能是PDB本身不會記錄源文件在聲明局部變量類型時使用的是typedef還是類型名稱。

一種可能的解決方法是枚舉全局範圍符號的SymTagTypedef子項,從這些類型的ID類型到typedef名稱構建std::multimap。然後,對於每個局部變量,如果multimap包含數據符號的類型ID(通過IDiaSymbol::get_typeId獲取)的條目,則使用IDiaSession::findLines方法計算出聲明瞭數據符號的行並在這些行中搜索名稱字符串,可能在搜索之前執行預處理。

+0

謝謝。是否有可能使用IDiaSession :: findLines或類似方法查找源代碼中哪些行包含變量聲明?我做了一些測試,似乎局部變量聲明行甚至不會被視爲:: findLines調用中的源代碼行。 – JavaMan

+0

@JavaMan:抱歉拖延。我試過DIA SDK和DbgHelp,既不返回局部變量聲明的行信息,也不返回全局變量聲明。我能得到的最好的是[詞彙父符號](http://msdn.microsoft.com/en-us/library/202d5966.aspx)的行號,對於局部變量聲明是函數符號。相當令人沮喪... –