【问题标题】:WinDBG extension - Breakpoint listingWinDBG 扩展 - 断点列表
【发布时间】:2012-09-06 13:49:32
【问题描述】:

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

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

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

【问题讨论】:

    标签: c windbg breakpoints


    【解决方案1】:

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

    【讨论】:

    • 我看到您试图避免使用 COM 接口。我认为这没有必要,即使是 C 语言。无论如何,我不知道有其他方法可以做到这一点。
    • 我找到了一种没有 COM 的笨拙方法(请参阅我的回答),不幸的是,我们对这个项目有严格的“纯 C 政策”,我真的不想实现像 @987654321 这样的疯狂的东西@
    【解决方案2】:

    Windows 调试器扩展提供函数ULONG64 GetExpression(PCSTR lpExpression)(当然是有据可查

    #define GetExpression    (ExtensionApis.lpGetExpressionRoutine)
    

    它允许您从任何 WinDBG 表达式(如 ?? @eip)中获取结果。

    GetExpression( "@eip"); // Without `?? ` in the beginning
    

    接下来,如果您看一下: Windows 调试器帮助 » Windows 调试工具 » 调试器 » 调试器参考 » 调试器命令 » strong> 语法规则 » 伪寄存器语法

    你会发现一行看起来像这样:

    $bpNumber - 对应断点的地址。例如, $bp3(或$bp03)是指断点ID为3的断点。 Number 始终是十进制数。如果没有断点的 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 对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多