【问题标题】:windbg setting conditional breakpointwindbg设置条件断点
【发布时间】:2009-09-02 06:07:32
【问题描述】:

我想在windbg中放置一个条件断点。

例如让我们说 LoadLibrary API。

如何设置断点,以便在加载 user32.dll 时设置断点。

> x kernel32!LoadLibraryW

它会给出一些地址[XXXX]

现在我可以将断点设置为

> bu [XXXX] 

但这将适用于对 LoadLibraryW 的所有调用。

任何建议。

【问题讨论】:

    标签: debugging windbg breakpoints


    【解决方案1】:

    您不能在 user32.dll 上设置条件断点,因为它相对较早地被映射到地址空间,并且在此之后触发了初始调试器的断点(据我所知)。

    如果您可以跟踪加载 user32.dll 的那一刻,您可以像这样覆盖模块中断:

    sxe ld user32.dll
    

    您可以做的是让您的应用程序由 boostrapper 应用程序启动,然后在加载 user32.dll 时让 Windows 调试器中断。只需使用 -o 命令行选项或 .childdbg 1 扩展调用来启动子进程的调试并使用 cmd.exe 启动它,例如:

    windbg -c "sxe ld user32.dll;g" -o cmd.exe /C yourapp.exe
    

    【讨论】:

    • 好吧,我只是举了 user32.dll 的例子,它可以是任何 dll。我想在加载特定的 dll 时中断,但是 windbg 加载所有 dll 的速度如此之快,以至于我无法找出谁在加载该 dll。
    • 只需使调试器在其初始断点处停止(不要使用 -g 命令行选项)并设置模块中断条件,如上所示,用您选择的 dll 名称替换 user32 或不指定任何名称使其在每个模块的加载时中断(由 debugger.chm 提供)。
    • 我找到了另一种方法。我们可以进行字符串比较。如果字符串是 user32.dll 则 break 。我们可以设置条件断点,例如 >bu XXXXXX ";as /mu ${/v:MyAlias} poi(@esp+0x4*1); .if ( $spat( \"${MyAlias}\", \"*User32 *\" ) != 0 ) {;.echo *** LoadLibrary CALLED *** ;.printf \"%mu\\n\", dwo (ESP + 0x04*1);.echo } .else { g } "
    【解决方案2】:

    我对您问题中的文本和标题感到有些困惑。但是假设你想设置一个条件断点,你应该看看documentation,因为它在这个主题上有很多细节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-09
      • 2012-06-01
      • 1970-01-01
      相关资源
      最近更新 更多