Получите сырое декодированное имя IDiaSymbol - PullRequest
0 голосов
/ 20 мая 2018

Я пытаюсь улучшить библиотеку SymbolSort , которая читает файлы PDB с помощью DIA SDK.Мне нужно сопоставить символы, считываемые из объектных файлов, с символами, считанными из 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 Ответ

0 голосов
/ 20 мая 2018

Я читал только частные символы из PDB.Частные символы в общем случае не предоставляют необработанного имени символа (в некоторых случаях они даже не имеют его).

Проблема решается путем чтения открытых символов вместо этого (с использованием SymTagEnum.SymTagPublicSymbol).Для них diaSymbol.name всегда дает необработанное имя символа.

Все это хорошо документировано в открытых и закрытых символах article.

...