有没有什么办法可以从Windows调试器扩展中获取断点列表?我正在使用纯C(我试图避免使用它们提供的COM接口,我甚至不确定该COM接口是否提供了这种方法)。WinDBG扩展 - 断点列表
我已阅读并研究了wdbgexts.h
和dbghelp.h
,但它们都没有包含任何可用的函数或全局变量,尽管这些文件中有一些关于BP的信息,例如DBGKD_GET_VERSION::BreakpointWithStatus
。
有没有什么办法可以从Windows调试器扩展中获取断点列表?我正在使用纯C(我试图避免使用它们提供的COM接口,我甚至不确定该COM接口是否提供了这种方法)。WinDBG扩展 - 断点列表
我已阅读并研究了wdbgexts.h
和dbghelp.h
,但它们都没有包含任何可用的函数或全局变量,尽管这些文件中有一些关于BP的信息,例如DBGKD_GET_VERSION::BreakpointWithStatus
。
Windows调试扩展提供功能ULONG64 GetExpression(PCSTR lpExpression)
(当然这是<讽刺>有据可查< /讽刺>)
#define GetExpression (ExtensionApis.lpGetExpressionRoutine)
,它允许你从任何WinDBG的表情像?? @eip
结果。
GetExpression("@eip"); // Without `?? ` in the beginning
接下来,如果你看一看: Windows调试帮助» Windows调试工具»调试»调试参考»调试命令»语法规则»伪 - 寄存器语法
你会发现一个行看起来是这样的:
$ BP数 - 对应断点的地址。例如, $ bp3(或$ bp03)引用其断点ID为3的断点。 数字始终为十进制数。如果没有断点的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
}
唯一的另一种解决方案是使用COM对象史蒂夫·约翰逊建议。
使用IDebugControl :: GetNumberBreakpoints,然后使用IDebugControl :: GetBreakpointByIndex。
我看到你试图避开COM接口。我不认为这是必要的,即使是从C.在任何情况下,我不知道另一种方式来做到这一点。 –
我发现了一个笨拙的方式来做到这一点没有COM(见我的答案),不幸的是,我们有严格的“纯C政策”这个项目,我真的不觉得喜欢[this]这样的疯狂的东西(http:// www .codeproject.com /文章/ 13601/COM-在平原-C) – Vyktor