2012-09-06 33 views
2

有没有什么办法可以从Windows调试器扩展中获取断点列表?我正在使用纯C(我试图避免使用它们提供的COM接口,我甚至不确定该COM接口是否提供了这种方法)。WinDBG扩展 - 断点列表

我已阅读并研究了wdbgexts.hdbghelp.h,但它们都没有包含任何可用的函数或全局变量,尽管这些文件中有一些关于BP的信息,例如DBGKD_GET_VERSION::BreakpointWithStatus

回答

3

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对象史蒂夫·约翰逊建议。

3

使用IDebugControl :: GetNumberBreakpoints,然后使用IDebugControl :: GetBreakpointByIndex。

+0

我看到你试图避开COM接口。我不认为这是必要的,即使是从C.在任何情况下,我不知道另一种方式来做到这一点。 –

+0

我发现了一个笨拙的方式来做到这一点没有COM(见我的答案),不幸的是,我们有严格的“纯C政策”这个项目,我真的不觉得喜欢[this]这样的疯狂的东西(http:// www .codeproject.com /文章/ 13601/COM-在平原-C) – Vyktor