C# 获取IDiaSymbol的原始解码名称

C# 获取IDiaSymbol的原始解码名称,c#,debug-symbols,pdb-files,dia-sdk,C#,Debug Symbols,Pdb Files,Dia Sdk,我正在尝试改进这个库,它使用diasdk读取PDB文件。我需要将从对象文件读取的符号与从PDB读取的符号进行匹配 问题是:给定一个IDiaSymbol变量,如何获取其真实名称?我对未修饰的名称或人类可读的名称不感兴趣,我需要损坏的名称,与对象文件中显示的名称完全相同,与链接器看到的名称完全相同 可以通过IDiaSymbol::get_UndercoratedName()轻松获取未修饰的名称。对于装饰名称,我使用以下代码: string rawName; IDiaSymbolUn

我正在尝试改进这个库,它使用diasdk读取PDB文件。我需要将从对象文件读取的符号与从PDB读取的符号进行匹配

问题是:给定一个
IDiaSymbol
变量,如何获取其真实名称?我对未修饰的名称或人类可读的名称不感兴趣,我需要损坏的名称,与对象文件中显示的名称完全相同,与链接器看到的名称完全相同


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

    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 "

我只是在看PDB里的私人符号。私有符号通常不提供原始符号名称(在某些情况下甚至没有)

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

所有这些都在本文中有很好的记录