我正在构建一个处理 VC++ 源代码的工具。为此,我需要获取符号列表,包括我的代码使用的局部变量名称及其类型。我知道Visual C++ 2010已经提供了一个.bsc文件,允许对象浏览器快速定位符号。但这是一个交互式工具。我需要获取文件中的符号列表。有没有什么工具可以让我们以编程方式获取我们自己的 VC++ 源代码中使用的符号列表?
我尝试了微软提供的调试接口访问SDK。它允许我们读取 .pdb 文件以获取所使用的局部变量的名称。但我还想获得源代码中使用的确切类型名称。例如
MYTYPE dwordVar;
DIA SDK 允许我们获取字符串“dwordVar”,它是局部变量的名称。但它无法判断其类型名称是“MYTYPE”。它只能告诉我们 MYTYPE 真正代表什么(如 unsigned long)。但不是符号“MYTYPE”。
如果 Visual C++ 不提供此功能,是否有任何第三方工具支持此功能?
尝试这个程序:
typedef unsigned long MYTYPE;
int wmain(int argc, wchar_t *argv[])
{
MYTYPE test = 99LU;
}
DIA SDK 和 DbgHelp 都返回 16 (SymTagBaseType
) 为类型符号的 symtypetest
。如果类型符号是 Typedef 符号,那就太好了(17/SymTagTypedef
),但可能PDB本身并没有记录源文件是否使用了typedef
或者在声明局部变量的类型时键入名称。
一种可能的解决方法是枚举SymTagTypedef
全局范围符号的子代,构建一个std::multimap
从类型的类型 ID 到typedef
名称。然后,对于每个局部变量,如果多重映射包含数据符号类型 ID 的条目(通过IDiaSymbol::get_typeId http://msdn.microsoft.com/en-us/library/xks45awc.aspx), 使用IDiaSession::findLines http://msdn.microsoft.com/en-us/library/t7wkd78s.aspx方法找出声明数据符号的行并在这些行中搜索任何typedef
名称字符串,可能在搜索之前执行预处理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)