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 オブジェクトを使用することです。