2

Windows Debugger Extension 内からブレークポイントのリストを取得する方法はありますか?

私は普通のCを使用しています(そして、彼らが提供するCOMインターフェースの使用を避けようとしていますが、そのCOMインターフェースがそれを行う方法を提供しているかどうかさえわかりません)。

私は読んで調査wdbgexts.hしましdbghelp.hたが、どちらにも使用可能な関数またはグローバル変数が含まれていないようですが、DBGKD_GET_VERSION::BreakpointWithStatus.

4

2 に答える 2

3

Windows Debugger Extension は機能を提供しますULONG64 GetExpression(PCSTR lpExpression)(もちろん、それは<sarcasm>十分に文書化されています</sarcasm> ) 。

#define GetExpression    (ExtensionApis.lpGetExpressionRoutine)

これにより、 のような任意の WinDBG 式から結果を取得できます?? @eip

GetExpression( "@eip"); // Without `?? ` in the beginning

次に、以下をご覧ください: Windows Debugger Help » Debugging Tools For Windows » Debuggers » Debugger References » Debugger Commands » Syntax Rules » Pseudo-Registers Syntax

次のような行があります。

$bp Number - 対応するブレークポイントのアドレス。たとえば、$bp3 (または $bp03) は、ブレークポイント ID が 3 のブレークポイントを参照します。数値は常に 10 進数です。Number の ID を持つブレークポイントがない場合、$bpNumber はゼロと評価されます。ブレークポイントの詳細については、ブレークポイントの使用を参照してください。

したがって、いくらかのオーバーヘッドがあれば、この(機能する)ソリューションが得られます。

#define MAX_BREAKPOINTS 100

DWORD i, addr;
CHAR buffer[] = "$bp\0\0\0\0\0\0\0\0\0\0\0\0";

for( i = 0; i < MAX_BREAKPOINTS; ++i){
    // Appends string to BP prefix
    itoa( i, buffer+3, 10);
    addr = GetExpression( buffer);
    if( !addr){
        break;
    }

    // Do stuff
}

唯一の別の解決策は、Steve Johnson が提案したように、COM オブジェクトを使用することです。

于 2012-09-07T06:31:46.710 に答える
3

IDebugControl::GetNumberBreakpoints を使用してから、IDebugControl::GetBreakpointByIndex を使用します。

于 2012-09-07T00:13:43.337 に答える