【问题标题】:conditional breakpoint does not work in windbg条件断点在windbg中不起作用
【发布时间】:2020-03-04 00:27:54
【问题描述】:

我有以下 c++ 代码

int myvar=1;

void test1( int j)
{
    int b=j+1;
}


void main()
{

myvar=2;
    test1(50);      


    myvar=3;
    test1(100);     


    myvar=6;
    test1(200);     

}

我正在尝试设置一个断点,如果在运行函数 test1 时 myvar 大于 4,则该断点停止。

这是我的断点:

bp test!test1 ".if ( poi(myvar)>0n4) {} .else {gc} "

但是,每次执行 test1 时它都会停止... 可执行文件名为 test.exe,一个 64 位应用程序。 任何建议将不胜感激。

【问题讨论】:

  • 使用 c++ 表达式求值器 myvar 是 c++ 表达式而不是 masm 表达式 bp condbp!test1 ".if( @@(myvar)

标签: windbg breakpoints


【解决方案1】:

在断点处稍作调试即可揭示发生了什么:

 0 e Disable Clear  00007ff6`77e11410  [f:\projects\windbg_help\main.cpp @ 4]     0001 (0001)  0:**** windbg_help!test1 "?? myvar; r $t1=myvar; ?? @$t1; r $t2=poi(myvar); ?? @$t2;  .if (dwo(myvar) > 0n4) {.echo yes; gc} .else {.echo no; gc} "

我将 t1 临时寄存器设置为 myvar,并将 t2 临时寄存器设置为 myvar 的内容,然后显示它们:

0:000> g
int 0n2
unsigned int64 0x00007ff6`77e1c000
unsigned int64 0xffffffff`00000002
no
int 0n3
unsigned int64 0x00007ff6`77e1c000
unsigned int64 0xffffffff`00000003
no
int 0n6
unsigned int64 0x00007ff6`77e1c000
unsigned int64 0xffffffff`00000006
yes
ModLoad: 00007ff9`c8520000 00007ff9`c8531000   C:\WINDOWS\System32\kernel.appcore.dll
ModLoad: 00007ff9`c9da0000 00007ff9`c9e3e000   C:\WINDOWS\System32\msvcrt.dll
ModLoad: 00007ff9`c9aa0000 00007ff9`c9bc2000   C:\WINDOWS\System32\RPCRT4.dll
ntdll!NtTerminateProcess+0x14:
00007ff9`cc5cfcd4 c3              ret

注意 poi(myvar) 如何返回一个 64 位的值,并且设置了高 32 位。你 poi(myvar) > 0n4 比较是在说:

if (0xffffffff0000000? > 4) then { always true }

使用 dwo(myvar) 改为只读取 32 位内容

【讨论】:

  • 谢谢克里斯。 dwo 为我工作。但是,你有关于 dwo 的文档吗,我在网上找不到任何东西......
  • dwo 是 64 位中 poi 的替代品吗?
  • 在windbg帮助中搜索“MASM Numbers and Operators”你会看到一个可能的选项表,其中包括dwo(来自指定地址的双字)、qwo(来自指定地址的四字) ) 等
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多