IDebugSymbols :: GetNameByOffset и перегруженные функции - PullRequest
2 голосов
/ 23 января 2009

Я использую IDebugSymbols :: GetNameByOffset и обнаруживаю, что получаю одно и то же имя символа для разных функций, которые перегружают одно и то же имя.

например. Код, для которого я ищу символы, может быть следующим:

void SomeFunction(int) {..}
void SomeFunction(float) {..}

Во время выполнения, когда у меня есть адрес инструкции от каждой из этих функций, я хотел бы использовать GetNameByOffset и как-то разделить их. Я экспериментировал с вызовом SetSymbolOptions для переключения флагов SYMOPT_UNDNAME и SYMOPT_NO_CPP, как задокументировано здесь , но это не сработало.

Кто-нибудь знает, как отличить их от символов во вселенной движка отладчика?


Редактировать: Просьба прокомментировать принятый ответ для небольшой поправки к предлагаемому решению.

1 Ответ

2 голосов
/ 23 января 2009

Цитата из 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 = размер параметров)
...