IDebugSymbols::GetNameByOffset и перегруженные функции
Вопрос
Я использую IDebugSymbols::получитьnamebyoffset и я обнаружил, что получаю одно и то же имя символа для разных функций, которые перегружают одно и то же имя.
Например.Код, для которого я ищу символы, может быть следующим:
void SomeFunction(int) {..}
void SomeFunction(float) {..}
Во время выполнения, когда у меня есть адрес инструкции из каждой из этих функций, я хотел бы использовать GetNameByOffset
и как-то отличить их друг от друга.Я экспериментировал с вызовом Параметры набора символов переключение SYMOPT_UNDNAME
и SYMOPT_NO_CPP
флаги, задокументированные здесь, но это не сработало.
Кто-нибудь знает, как отличить их от символов во вселенной движка отладчика?
Редактировать: Пожалуйста, смотрите, как я комментирую принятый ответ для внесения незначительной поправки в предлагаемое решение.
Решение
Цитата из dbgeng.h:
// A symbol name may not be unique, particularly // when overloaded functions exist which all // have the same name. If GetOffsetByName // finds multiple matches for the name it // can return any one of them. In that // case it will return S_FALSE to indicate // that ambiguity was arbitrarily resolved. // A caller can then use SearchSymbols to // find all of the matches if it wishes to // perform different disambiguation. STDMETHOD(GetOffsetByName)( THIS_ __in PCSTR Symbol, __out PULONG64 Offset ) PURE;
Итак, я бы получил имя с помощью IDebugSymbols::GetNameByOffset() (по-моему, оно возвращается как "module!name"), убедился, что это перегрузка (если вы не уверены), используя IDebugSymbols::GetOffsetByName() (который должен возвращать S_FALSE при многократных перегрузках), и просмотрел все возможности с этим именем, используя StartSymbolMatch() /EndSymbolMatch().Не однострочник, хотя (и не очень полезный, если уж на то пошло ...)
Другим вариантом было бы пойти с
HRESULT IDebugSymbols3::GetFunctionEntryByOffset( IN ULONG64 Offset, IN ULONG Flags, OUT OPTIONAL PVOID Buffer, IN ULONG BufferSize, OUT OPTIONAL PULONG BufferNeeded ); // It can be used to retrieve FPO data on a particular function: FPO_DATA fpo; HRESULT hres=m_Symbols3->GetFunctionEntryByOffset( addr, // Offset 0, // Flags &fpo, // Buffer sizeof(fpo), // BufferSize 0 // BufferNeeded ));а затем используйте fpo.cdwParams для определения размера базового параметра (cdwParams= размер параметров)