1

我正在构建一个处理我的 VC++ 源代码的工具。为此,我需要获取符号列表,包括我的代码使用的局部变量名称及其类型。我知道 Visual C++ 2010 已经提供了一个 .bsc 文件,允许对象浏览器快速定位符号。但这是一个交互式工具。我需要获取文件中的符号列表。是否有任何工具允许我们以编程方式获取我们自己的 VC++ 源代码中使用的符号列表?

我尝试了微软提供的Debug Interface Access SDK。它允许我们读取 .pdb 文件以获取所使用的局部变量的名称。但我也想获得源代码中使用的确切类型名称。例如

MYTYPE dwordVar;

DIA SDK 允许我们获取字符串“dwordVar”,它是一个局部变量的名称。但它不能告诉它的类型名称是“MYTYPE”。它只能告诉我们 MYTYPE 真正代表什么(比如 unsigned long)。但不是符号“MYTYPE”。

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

4

1 回答 1

1

试验这个程序:

typedef unsigned long MYTYPE;

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

DIA SDK 和 DbgHelp 都SymTagBaseTypetest. 如果类型符号是 Typedef 符号 (17/ SymTagTypedef) 会很好,但可能是 PDB 本身没有记录源文件typedef在声明局部变量的类型时是否使用了或类型名称。

一种可能的解决方法是枚举SymTagTypedef全局范围符号的子代,std::multimap从类型的类型 ID 到typedef名称构建一个。然后,对于每个局部变量,如果多映射包含 Data 符号类型 ID 的条目(通过 获得IDiaSymbol::get_typeId),则使用该IDiaSession::findLines方法找出声明 Data 符号的行并在这些行中搜索任何typedef名称字符串,可能在搜索之前执行预处理。

于 2011-08-28T20:26:08.903 回答