Lancer
Lancer

Reputation: 67

conditional breakpoint does not work in windbg

I have following c++ code

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);     

}

I'm trying to set a breakpoint that stops if myvar is greater than 4 when running function test1.

Here is my breakpoint:

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

however, it stops every time test1 is executed... The executable file is called test.exe, a 64 bit application. Any suggestion would be appreciated.

Upvotes: 1

Views: 311

Answers (1)

Chris
Chris

Reputation: 2763

A little bit of debugging in the breakpoint reveals what is happening:

 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} "

I set the t1 temp register to myvar, and t2 temp register to the contents of myvar, then display them:

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

Notice how poi(myvar) is returning a 64bit value, and the upper 32bits are set. You poi(myvar) > 0n4 comparison is saying:

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

use dwo(myvar) instead to read only the 32bit contents

Upvotes: 2

Related Questions