代码之家  ›  专栏  ›  技术社区  ›  stgatilov

获取IDiasEmbol的原始废弃名称

  •  0
  • stgatilov  · 技术社区  · 6 年前

    我在努力提高 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);
    

    经验性的发现,这种黑客似乎在大多数情况下都能很好地工作(没有任何原因)。但有时会造成一些垃圾,例如:

    diaSymbol.undecoratedName:
        "private: bool __cdecl idPhysics_Player::SlideMove(bool,bool,bool,bool) __ptr64"
    rawSymbol:
        " ?? :: ?? ::Z::_N_N000 & __ptr64 volatile "
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   stgatilov    6 年前

    我只是在看PDB的私人符号。一般来说,私有符号不提供原始符号名(在某些情况下,它们甚至没有原始符号名)。

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

    所有这些都在 public and private symbols 文章。