2

IDebugSymbols::GetNameByOffsetを使用していますが、同じ名前をオーバーロードするさまざまな関数に対して同じシンボル名を取得していることがわかります。

たとえば、シンボルを検索しているコードは次のようになります。

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

実行時に、これらの関数のそれぞれからの命令のアドレスを取得したら、使用GetNameByOffsetして 2 つをどうにかして区別したいと思います。ここに記載されているように、フラグとフラグを切り替える SetSymbolOptionsを呼び出して実験しましたが、うまくいきませんでした。SYMOPT_UNDNAMESYMOPT_NO_CPP

デバッガーエンジンの世界でこれらをシンボルに区別する方法を知っている人はいますか?


編集:提案された解決策に対するマイナーな修正について、受け入れられた回答についてコメントしてください。

4

1 に答える 1

2

dbgeng.h からの引用:

    // シンボル名は一意ではない可能性があります。特に
    // オーバーロードされた関数が存在する場合
    // 同じ名前です。GetOffsetByName の場合
    // その名前に複数の一致を見つけます
    // それらのいずれかを返すことができます。その中で
    // その場合は S_FALSE を返します
    // そのあいまいさは恣意的に解決されました。
    // 呼び出し元は SearchSymbols を使用して
    // 必要に応じてすべての一致を検索します
    // 別の明確化を実行します。
    STDMETHOD(GetOffsetByName)(
        これ_
        __in PCSTR シンボル、
        __out PULONG64 オフセット
        ) ピュア;

したがって、IDebugSymbols::GetNameByOffset() で名前を取得し (「module!name」のように返されると思います)、IDebugSymbols::GetOffsetByName() (これは、複数のオーバーロードに対して S_FALSE を返すことになっています)、StartSymbolMatch()/EndSymbolMatch() を使用して、この名前ですべての可能性を検索します。ただし、ワンライナーではありません(その点ではあまり役に立ちません...)

別のオプションは、一緒に行くことです

HRESULT
  IDebugSymbols3::GetFunctionEntryByOffset(
    IN ULONG64 オフセット、
    ULONG フラグでは、
    OUT OPTIONAL PVOID バッファ、
    IN 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 に答える