测试多个堆栈变量的条件断点

时间:2011-05-23 12:26:55

标签: stack windbg conditional-breakpoint

我正在调试一个应用程序,它使用一个对话框从用户那里获取一些信息,然后对该信息进行一些处理。通过在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'”。这是最初接受的,但是当评估断点时,它会抱怨:'&amp ;; dwo(esp + 12)== 0x1)''; 'GC'“

用()的2个表达式包围并没有帮助。我查看了帮助文件,但说实话,让我更加困惑。我是WinDbg的新手,英语不是我的母语。有人能指出我正确的方向吗?

提前致谢。

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

1 个答案:

答案 0 :(得分:4)

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

以下表达式适合您:

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

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