WinDBG扩展 - 断点列表

时间:2012-09-06 13:49:32

标签: c windbg breakpoints

有什么方法可以从Windows调试器扩展中获取断点列表?

我正在使用普通的C(我试图避免使用它们提供的COM接口,我甚至不确定COM接口是否提供了这样做的方法)。

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

Windows调试器扩展提供了功能ULONG64 GetExpression(PCSTR lpExpression)(当然它是< sarcasm>记录良好< / 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
}

另一个解决方案是使用史蒂夫约翰逊建议的COM对象。