2

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

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

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

在运行时,当我从每个函数中获得指令的地址时,我想使用GetNameByOffset并以某种方式将两者区分开来。我已经尝试调用SetSymbolOptions 来切换此处SYMOPT_UNDNAME记录的和SYMOPT_NO_CPP标志,但这不起作用。

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


编辑:请参阅我对已接受答案的评论,以对提议的解决方案进行小幅修改。

4

1 回答 1

2

引自 dbgeng.h:

    // 交易品种名称可能不是唯一的,尤其是
    // 当重载函数存在时
    // 具有相同的名称。如果 GetOffsetByName
    // 为它的名字找到多个匹配项
    // 可以返回其中任何一个。在那里面
    // 如果它会返回 S_FALSE 来表示
    // 这个歧义被任意解决了。
    // 然后调用者可以使用 SearchSymbols 来
    // 如果需要,查找所有匹配项
    // 执行不同的消歧。
    标准方法(GetOffsetByName)(
        这_
        __在 PCSTR 符号中,
        __out PULONG64 偏移量
        ) 纯的;

所以,我会用 IDebugSymbols::GetNameByOffset() 获得名称(我相信它会像“module!name”一样返回),使用 IDebugSymbols::GetOffsetByName() 确保它是一个重载(如果你不确定)(它应该为多个重载返回 S_FALSE),并使用 StartSymbolMatch()/EndSymbolMatch() 查找具有此名称的所有可能性。虽然不是一个班轮(而且对这件事没有真正的帮助......)

另一种选择是与

结果
  IDebugSymbols3::GetFunctionEntryByOffset(
    在 ULONG64 偏移中,
    在 ULONG 标志中,
    OUT 可选的 PVOID 缓冲区,
    在 ULONG BufferSize 中,
    OUT OPTIONAL PULONG BufferNeeded
    );
// 它可用于检索特定函数的 FPO 数据:
FPO_DATA fpo;
HRESULT hres=m_Symbols3->GetFunctionEntryByOffset(
        addr, // 偏移量
        0, // 标志
        &fpo, // 缓冲区
        sizeof(fpo), // 缓冲区大小
        0 // 需要缓冲
        ));
然后使用 fpo.cdwParams 进行基本参数大小区分(cdwParams=参数大小)

于 2009-01-23T20:21:07.313 回答