IDebugSymbols :: GetNameByOffset和重载函数

时间:2009-01-23 15:49:44

标签: debugging windbg dbgeng

我正在使用IDebugSymbols::GetNameByOffset而且我发现我为不同的重载相同名称的函数获得相同的符号名称。

E.g。我正在查找符号的代码可能如下:

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

在运行时,当我有一个来自这些函数的指令的地址时,我想使用GetNameByOffset并以某种方式告诉两者。我已尝试调用SetSymbolOptions切换SYMOPT_UNDNAMESYMOPT_NO_CPP标记,如文档here所示,但这不起作用。

有没有人知道如何在调试器引擎世界中区分这些符号?


修改:如果您对提议的解决方案进行细微修改,请接受我对已接受答案的评论。

1 个答案:

答案 0 :(得分:2)

来自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()的名称(它回来像“模块!名称”我相信),确保它是一个重载(如果你不确定)使用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 =参数大小)