2

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

我使用的是纯 C(我试图避免使用它们提供的 COM 接口,我什至不确定该 COM 接口是否提供了一种方法)。

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

4

2 回答 2

3

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

于 2012-09-07T00:13:43.337 回答
3

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 对象。

于 2012-09-07T06:31:46.710 回答