Debugging IDebugSymbols::GetNameByOffset和重载函数

Debugging IDebugSymbols::GetNameByOffset和重载函数,debugging,windbg,dbgeng,Debugging,Windbg,Dbgeng,我正在使用,并且我发现对于重载相同名称的不同函数,我得到了相同的符号名 例如,我正在查找符号的代码可能如下所示: void SomeFunction(int) {..} void SomeFunction(float) {..} 在运行时,当我从这些函数中得到一条指令的地址时,我希望使用GetNameByOffset,并以某种方式区分这两个函数。我已经尝试过调用并切换SYMOPT\u UNDNAME和SYMOPT\u NO\u CPP标记,但这不起作用 有人知道如何在调试器引擎中区分这些符号吗

我正在使用,并且我发现对于重载相同名称的不同函数,我得到了相同的符号名

例如,我正在查找符号的代码可能如下所示:

void SomeFunction(int) {..}
void SomeFunction(float) {..}
在运行时,当我从这些函数中得到一条指令的地址时,我希望使用
GetNameByOffset
,并以某种方式区分这两个函数。我已经尝试过调用并切换
SYMOPT\u UNDNAME
SYMOPT\u NO\u 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; //符号名称可能不是唯一的,尤其是 //当重载函数存在时,所有 //有相同的名字。如果GetOffsetByName //查找其名称的多个匹配项 //可以退回其中任何一个。因为 //在这种情况下,它将返回S_FALSE以指示 //这一模棱两可的问题是任意解决的。 //然后,调用方可以使用搜索符号 //如果希望,请查找所有匹配项 //执行不同的消歧。 STDMETHOD(GetOffsetByName)( 这个_ __在PCSTR符号中, __出普隆64偏 )纯洁的; 因此,我将使用IDebugSymbols::GetNameByOffset()获取名称(我相信它会像“module!name”一样返回),使用IDebugSymbols::GetOffsetByName()确保它是一个重载(如果您不确定的话),并使用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 )); HRESULT IDebugSymbols3::GetFunctionEntryByOffset( 在ULONG64偏移中, 在乌龙旗, 输出可选的PVOID缓冲区, 在ULONG BufferSize中, 我们需要可选的PULONG缓冲区 ); //它可用于检索特定函数上的FPO数据: FPO_数据FPO; HRESULT hres=m_符号3->GetFunctionEntryByOffset( 地址,//偏移量 0,//标志 &fpo,//缓冲区 sizeof(fpo),//缓冲区大小 0//需要缓冲区 ));
然后使用fpo.cdwParams进行基本参数大小区分(cdwParams=参数的大小)

结果是我的重载函数使用了相同大小的参数,因此
cdwParams
没有将其剪切。然而,
FPO\u数据
上的
ulOffStart
字段结果是完美的。它根据WinNT.h给出“功能代码的第一字节偏移量”。