我正在使用IDebugSymbols::GetNameByOffset而且我发现我为不同的重载相同名称的函数获得相同的符号名称。
E.g。我正在查找符号的代码可能如下:
void SomeFunction(int) {..}
void SomeFunction(float) {..}
在运行时,当我有一个来自这些函数的指令的地址时,我想使用GetNameByOffset
并以某种方式告诉两者。我已尝试调用SetSymbolOptions切换SYMOPT_UNDNAME
和SYMOPT_NO_CPP
标记,如文档here所示,但这不起作用。
有没有人知道如何在调试器引擎世界中区分这些符号?
修改:如果您对提议的解决方案进行细微修改,请接受我对已接受答案的评论。
答案 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 =参数大小)