有什么方法可以从 Windows 调试器扩展中获取断点列表?
我使用的是纯 C(我试图避免使用它们提供的 COM 接口,我什至不确定该 COM 接口是否提供了一种方法)。
我已经阅读和研究过wdbgexts.h
,dbghelp.h
但它们似乎都不包含任何可用的函数或全局变量,尽管这些文件中有一些关于 BP 的信息,例如DBGKD_GET_VERSION::BreakpointWithStatus
.
有什么方法可以从 Windows 调试器扩展中获取断点列表?
我使用的是纯 C(我试图避免使用它们提供的 COM 接口,我什至不确定该 COM 接口是否提供了一种方法)。
我已经阅读和研究过wdbgexts.h
,dbghelp.h
但它们似乎都不包含任何可用的函数或全局变量,尽管这些文件中有一些关于 BP 的信息,例如DBGKD_GET_VERSION::BreakpointWithStatus
.
使用 IDebugControl::GetNumberBreakpoints,然后使用 IDebugControl::GetBreakpointByIndex。
Windows Debugger Extension 提供功能ULONG64 GetExpression(PCSTR lpExpression)
(当然是<sarcasm>welldocumented</sarcasm>)
#define GetExpression (ExtensionApis.lpGetExpressionRoutine)
它允许您从任何 WinDBG 表达式(如?? @eip
.
GetExpression( "@eip"); // Without `?? ` in the beginning
接下来,如果您查看:Windows 调试器帮助» Windows调试工具»调试器»调试器参考»调试器命令»语法规则»伪寄存器语法
你会发现一行看起来像这样:
$bp Number - 对应断点的地址。例如,$bp3(或$bp03)是指断点ID 为3 的断点。数字始终是十进制数。如果没有断点的 ID 为 Number,则 $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 对象。