【问题标题】:Conditional breakpoint that tests multiple stack variables测试多个堆栈变量的条件断点
【发布时间】:2011-05-24 00:15:29
【问题描述】:

我正在调试一个应用程序,它使用一个对话框从用户那里获取一些信息,然后对这些信息进行一些处理。通过在 USER32!CreateDialogParamW 上设置断点,我找到了其对话过程的地址。

起初我只是想在程序收到 WM_COMMAND 消息时中断,所以我使用了以下命令:bp 00cfa1c0 "j (dwo(esp+8) == 0x111) ''; 'gc'"

不幸的是,由于某种原因,即使在 WinDbg 和应用程序之间使用 ALT-TABbing 时,对话框过程也会收到 WM_COMMAND 消息,这还不够。所以,现在我希望它在从对话框上的 OK 按钮接收到通知代码为 BN_CLICKED 的 WM_COMMAND 时中断。对话框模板中按钮的控件ID为1,在winuser.h中BN_CLICKED定义为0。这意味着当单击“确定”按钮时,对话框过程的 WPARAM 参数应为 1。

我尝试了以下命令:bp 00cfa1c0 "j (dwo(esp+8) == 0x111 && dwo(esp+12) == 0x1) ''; 'gc'"。这最初是被接受的,但是当断点被评估时它会抱怨: Numeric expression missing from '& dwo(esp+12) == 0x1) ''; 'gc''

用 () 包围两个表达式没有帮助。我查看了帮助文件,但老实说,这让我更加困惑。我对 WinDbg 很陌生,英语不是我的母语。有人能指出我正确的方向吗?

提前致谢。

PS:这是一个 32 位应用程序,我没有源代码。

【问题讨论】:

    标签: stack windbg conditional-breakpoint


    【解决方案1】:

    使用单个& - 表达式的默认语法是 MASM。 && 是 C++ 语法的一部分。

    以下表达式适合你:

    (dwo(@esp+8) == 0x111 & dwo(@esp+12) == 0x1)
    

    @@c++(*(int*)(@esp+8) == 0x111 && *(int*)(@esp+12) == 0x1)
    

    【讨论】:

      猜你喜欢
      • 2013-01-05
      • 1970-01-01
      • 2020-05-03
      • 1970-01-01
      • 2013-01-12
      • 2019-08-03
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      相关资源
      最近更新 更多