IDebugSymbols::GetNameByOffset и перегруженные функции
Я использую IDebugSymbols::GetNameByOffset и обнаружил, что получаю одно и то же имя символа для разных функций, которые перегружают одно и то же имя.
Например, код, для которого я ищу символы, может быть следующим:
void SomeFunction(int) {..}
void SomeFunction(float) {..}
Во время выполнения, когда у меня есть адрес инструкции от каждой из этих функций, я хотел бы использовать GetNameByOffset
и как-то расскажу о двух. Я экспериментировал с вызовом SetSymbolOptions для переключения SYMOPT_UNDNAME
а также SYMOPT_NO_CPP
флаги, как описано здесь, но это не сработало.
Кто-нибудь знает, как рассказать об этих символах во вселенной движка отладчика?
Изменить: Пожалуйста, смотрите мне комментарий на принятый ответ для незначительной поправки к предлагаемому решению.
1 ответ
Цитата из dbgeng.h:
// Имя символа не может быть уникальным, особенно // когда существуют перегруженные функции, которые все // имеют одинаковое имя Если GetOffsetByName // находит несколько совпадений для имени // может вернуть любой из них. В этом // если он вернет S_FALSE, чтобы указать // эта неопределенность была решена произвольно. // Вызывающий может затем использовать SearchSymbols для // найти все совпадения, если он хочет // выполняем разные неоднозначности. STDMETHOD(GetOffsetByName)(ЭТОТ_ __in Символ PCSTR, __out PULONG64 Offset) ЧИСТЫЙ;
Итак, я хотел бы получить имя с IDebugSymbols::GetNameByOffset() (оно возвращается как "module! Name", я считаю), убедитесь, что это перегрузка (если вы не уверены), используя IDebugSymbols::GetOffsetByName() (который должен возвращать S_FALSE для нескольких перегрузок) и найти все возможности с этим именем, используя StartSymbolMatch()/EndSymbolMatch(). Не один лайнер, хотя (и не очень полезно в этом отношении...)
Другим вариантом будет пойти с
HRESULT IDebugSymbols3::GetFunctionEntryByOffset(Смещение в ULONG64, В УЛОНЕ Флаги, OUT OPTIONAL PVOID Buffer, В длинном буфере, НЕОБЯЗАТЕЛЬНЫЙ PULONG BufferNeeded); // Может использоваться для извлечения данных FPO для определенной функции: FPO_DATA fpo; HRESULT hres=m_Symbols3->GetFunctionEntryByOffset( addr, // Offset 0, // Флаги &fpo, // Buffer sizeof(fpo), // BufferSize 0 // BufferNeeded));и затем используйте fpo.cdwParams для различения основного размера параметра (cdwParams= размер параметров)