【问题标题】:Getting a List of Symbols Used by My VC++ Code获取我的 VC++ 代码使用的符号列表
【发布时间】:2011-08-28 12:12:21
【问题描述】:

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

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

MYTYPE dwordVar;

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

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

【问题讨论】:

  • IDiaSymbol 有 lot 的属性。请务必区分 get_type 和 get_baseType。发布一个 sn-p 是明智的。
  • @HansPassant:只有these properties 对数据符号有效。

标签: visual-studio-2010 debug-symbols dia-sdk browse-information


【解决方案1】:

用这个程序做实验:

typedef unsigned long MYTYPE;

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

对于test 的类型符号的符号类型,DIA SDK 和 DbgHelp 都返回 16 (SymTagBaseType)。如果类型符号是 Typedef 符号(17/SymTagTypedef)会很好,但可能是 PDB 本身没有记录源文件在声明本地的类型时是使用 typedef 还是类型名称变量。

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

【讨论】:

  • 谢谢。是否可以使用 IDiaSession::findLines 等找到源代码中的哪些行包含变量声明?我做了一些测试,似乎在 ::findLines 调用中,局部变量声明行甚至不会被算作源代码行。
  • @JavaMan:抱歉耽搁了。我尝试了 DIA SDK 和 DbgHelp,都没有返回局部变量声明的行信息,甚至没有返回全局变量声明。我能得到的最好的结果是lexical parent symbol 的行号,对于局部变量声明,它是函数符号。很郁闷...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 2020-04-15
  • 2018-11-24
  • 2017-12-10
  • 1970-01-01
相关资源
最近更新 更多