【问题标题】:Get raw decodated name of IDiaSymbol获取 IdiaSymbol 的原始解码名称
【发布时间】:2018-05-20 14:43:51
【问题描述】:

我正在尝试改进SymbolSort 库,该库使用 DIA SDK 读取 PDB 文件。我需要将从目标文件中读取的符号与从 PDB 中读取的符号进行匹配。

问题是:给定一个IDiaSymbol 变量,我怎样才能得到它的真名?我对未修饰或人类可读的名称感兴趣,我需要损坏的名称,与它在目标文件中的显示完全相同,与链接器看到的完全相同。


可以通过IDiaSymbol::get_undecoratedName (ref) 轻松获得未修饰的名称。对于修饰名称,我使用以下代码:

    string rawName;
    IDiaSymbolUndecoratedNameExFlags flags = Flags.UNDNAME_32_BIT_DECODE | Flags.UNDNAME_TYPE_ONLY;
    diaSymbol.get_undecoratedNameEx((uint)flags, out rawName);

根据经验发现,这种 hack 在大多数情况下似乎都能正常工作(无缘无故)。但有时它会产生一些垃圾,例如:

diaSymbol.undecoratedName:
    "private: bool __cdecl idPhysics_Player::SlideMove(bool,bool,bool,bool) __ptr64"
rawSymbol:
    " ?? :: ?? ::Z::_N_N000 & __ptr64 volatile "

【问题讨论】:

    标签: c# debug-symbols pdb-files dia-sdk


    【解决方案1】:

    我只从 PDB 中读取私有符号。私有符号通常不提供原始符号名称(在某些情况下甚至没有)。

    通过读取公共符号来解决问题(使用SymTagEnum.SymTagPublicSymbol)。对于他们来说,diaSymbol.name 总是给出符号的原始名称。

    所有这些都在public and private symbols 文章中有详细记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-27
      • 2017-01-17
      • 2015-07-06
      • 2011-12-12
      • 1970-01-01
      • 2015-06-10
      相关资源
      最近更新 更多