Вопрос

Я использую 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= размер параметров)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top