Mirror of the gdb mailing list
 help / color / mirror / Atom feed
* A problem about read / access watchpoint
@ 2006-01-15 11:21 Wu Zhou
  2006-01-16  7:17 ` Jim Blandy
  0 siblings, 1 reply; 4+ messages in thread
From: Wu Zhou @ 2006-01-15 11:21 UTC (permalink / raw)
  To: gdb; +Cc: anton, pgilliam

In the process of writing a testcase for read / access watchpoint, I find 
something very strange: read/access watchpoints don't always work as 
expected.  Here is a simplified example:

1 #include <stdio.h>
2
3 int var0 = 0;
4 
5 void subr (int *var1)
6 {
7   printf ("just to do sth\n");
8 }
9
10 void main (int argc, char **argv)
11 {
12  int var1 = 0;
13
14  subr (&var1);
15  var0 = var1;
16  printf ("var0 = %d, var1 = %d\n", var0, var1);
17 }

if I set read watchpoint on var1, it will only catch the watchpoint at the 
line 16 (for both x86 and ppc64).  In my opinion, it should stop at line 
15 as well.

if I set access watchpoint on var1, it will stop at line 12, 15, 16 on 
ppc64, and only stop line 12, 16 on x86. 

I did some tracing on that, and find that the kernel _did_ issue signal 
trap on line 15, and gdb could also get the stopped data address by 
ptrace. But when gdb call watchpoint_check to check if the value changed 
or not. It will reports WP_VALUE_CHANGED, which really confuse me.

I am now reading the code of watchpoint_check, but I don't understand why 
it will compare the new_val with b->val, and not bs->old_value.  The code 
following the comparison is also out of my understanding:

      struct value *mark = value_mark ();
      struct value *new_val = evaluate_expression (bs->breakpoint_at->exp);
      if (!value_equal (b->val, new_val))
	{
	  release_value (new_val);
	  value_free_to_mark (mark);
	  bs->old_val = b->val;
	  b->val = new_val;
	  /* We will stop here */
	  return WP_VALUE_CHANGED;
	}

Anyone can help me out of this question?  Thanks a lot.

Regards
- Wu Zhou


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: A problem about read / access watchpoint
  2006-01-15 11:21 A problem about read / access watchpoint Wu Zhou
@ 2006-01-16  7:17 ` Jim Blandy
  2006-01-16  9:59   ` Wu Zhou
  2006-01-16 10:12   ` Wu Zhou
  0 siblings, 2 replies; 4+ messages in thread
From: Jim Blandy @ 2006-01-16  7:17 UTC (permalink / raw)
  To: Wu Zhou; +Cc: gdb, anton, pgilliam

On 1/15/06, Wu Zhou <woodzltc@cn.ibm.com> wrote:
> I did some tracing on that, and find that the kernel _did_ issue signal
> trap on line 15, and gdb could also get the stopped data address by
> ptrace. But when gdb call watchpoint_check to check if the value changed
> or not. It will reports WP_VALUE_CHANGED, which really confuse me.

Just out of curiosity, could you post a disassembly of main?  The
kernel is watching what the machine code version of the program does,
and I wouldn't assume that it was the same as what the source code
version does, even if you compile with -O0.


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: A problem about read / access watchpoint
  2006-01-16  7:17 ` Jim Blandy
@ 2006-01-16  9:59   ` Wu Zhou
  2006-01-16 10:12   ` Wu Zhou
  1 sibling, 0 replies; 4+ messages in thread
From: Wu Zhou @ 2006-01-16  9:59 UTC (permalink / raw)
  To: Jim Blandy; +Cc: gdb, anton, pgilliam


On Sun, 15 Jan 2006, Jim Blandy wrote:

> On 1/15/06, Wu Zhou <woodzltc@cn.ibm.com> wrote:
> > I did some tracing on that, and find that the kernel _did_ issue signal
> > trap on line 15, and gdb could also get the stopped data address by
> > ptrace. But when gdb call watchpoint_check to check if the value changed
> > or not. It will reports WP_VALUE_CHANGED, which really confuse me.
> 
> Just out of curiosity, could you post a disassembly of main?  The
> kernel is watching what the machine code version of the program does,
> and I wouldn't assume that it was the same as what the source code
> version does, even if you compile with -O0.

Hi Jim,

Here is a snapshot of the debugging session (on ppc64), the disassembly 
of main is included:

[woodzltc@plinuxt2 gdb-cvs-6.4]$ ./build64/gdb/gdb -q ./rwatch
Using host libthread_db library "/lib64/tls/libthread_db.so.1".
(gdb) b main
Breakpoint 1 at 0x10000470: file rwatch.c, line 13.
(gdb) r
Starting program: /home/woodzltc/DE-GDB/gdb-cvs-6.4/rwatch
Failed to read a valid object file image from memory.

Breakpoint 1, main (argc=1, argv=0xffa22ab4) at rwatch.c:13
13        int var1 = 0;
(gdb) rwatch var1
Hardware read watchpoint 2: var1
(gdb) disassemble main
Dump of assembler code for function main:
0x10000454 <main+0>:    stwu    r1,-32(r1)
0x10000458 <main+4>:    mflr    r0
0x1000045c <main+8>:    stw     r31,28(r1)
0x10000460 <main+12>:   stw     r0,36(r1)
0x10000464 <main+16>:   mr      r31,r1
0x10000468 <main+20>:   stw     r3,8(r31)
0x1000046c <main+24>:   stw     r4,12(r31)
0x10000470 <main+28>:   li      r0,0
0x10000474 <main+32>:   stw     r0,16(r31)
0x10000478 <main+36>:   addi    r0,r31,16
0x1000047c <main+40>:   mr      r3,r0
0x10000480 <main+44>:   bl      0x10000418 <subr>
0x10000484 <main+48>:   lis     r9,4097
0x10000488 <main+52>:   lwz     r0,16(r31)
0x1000048c <main+56>:   stw     r0,2452(r9)
0x10000490 <main+60>:   lis     r11,4097
0x10000494 <main+64>:   lis     r9,4096
0x10000498 <main+68>:   addi    r3,r9,2160
0x1000049c <main+72>:   lwz     r4,2452(r11)
0x100004a0 <main+76>:   lwz     r5,16(r31)
0x100004a4 <main+80>:   crclr   4*cr1+eq
0x100004a8 <main+84>:   bl      0x100109e8 <printf@plt>
0x100004ac <main+88>:   mr      r3,r0
0x100004b0 <main+92>:   lwz     r11,0(r1)
0x100004b4 <main+96>:   lwz     r0,4(r11)
0x100004b8 <main+100>:  mtlr    r0
0x100004bc <main+104>:  lwz     r31,-4(r11)
0x100004c0 <main+108>:  mr      r1,r11
0x100004c4 <main+112>:  blr
End of assembler dump.
(gdb) c
Continuing.
just to do sth
Hardware read watchpoint 2: var1

Value = 0
0x100004a4 in main (argc=1, argv=0xffa22ab4) at rwatch.c:17
17        printf ("var0 = %d, var1 = %d\n", var0, var1);
(gdb) p &var1
$1 = (int *) 0xffa22860


Kernel messages show that var1 is hit two times:

[root@plinuxt2 SPECS]# dmesg -c
ptrace_getsiginfo: data.si_addr is 0x10000474
ptrace_getsiginfo: data.si_addr is 0xffa22860  ===> The first time var1 is hit
ptrace_getsiginfo: data.si_addr is 0x1000048c
ptrace_getsiginfo: data.si_addr is 0xffa22860  ===> The second time var1 is hit
ptrace_getsiginfo: data.si_addr is 0x100004a4  
   ===> When a watchpoint/breakpoint is hit, it need to single step to 
        execute that instruction, so this is the insturction address to 
        access var1  


The GDB is patched with my patch to add h/w watchpoint to ppc64. The 
kernel is 2.6.15-git8.  I only added a few printk to print the faulting 
address.


Regards
- Wu Zhou


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: A problem about read / access watchpoint
  2006-01-16  7:17 ` Jim Blandy
  2006-01-16  9:59   ` Wu Zhou
@ 2006-01-16 10:12   ` Wu Zhou
  1 sibling, 0 replies; 4+ messages in thread
From: Wu Zhou @ 2006-01-16 10:12 UTC (permalink / raw)
  To: Jim Blandy; +Cc: gdb, anton, pgilliam


On Sun, 15 Jan 2006, Jim Blandy wrote:

> On 1/15/06, Wu Zhou <woodzltc@cn.ibm.com> wrote:
> > I did some tracing on that, and find that the kernel _did_ issue signal
> > trap on line 15, and gdb could also get the stopped data address by
> > ptrace. But when gdb call watchpoint_check to check if the value changed
> > or not. It will reports WP_VALUE_CHANGED, which really confuse me.
> 
> Just out of curiosity, could you post a disassembly of main?  The
> kernel is watching what the machine code version of the program does,
> and I wouldn't assume that it was the same as what the source code
> version does, even if you compile with -O0.
> 

This is the related debugging session on x86:

(gdb) p &var1
$1 = (int *) 0xbff312c4
(gdb) rwatch var1
Hardware read watchpoint 2: var1
(gdb) c
Continuing.
just to do sth
Hardware read watchpoint 2: var1

Value = 0
0x080483c0 in main (argc=1, argv=0xbff31354) at rwatch.c:17
17        printf ("var0 = %d, var1 = %d\n", var0, var1);
(gdb) disassemble main
Dump of assembler code for function main:
0x08048380 <main+0>:    push   %ebp
0x08048381 <main+1>:    mov    %esp,%ebp
0x08048383 <main+3>:    sub    $0x8,%esp
0x08048386 <main+6>:    and    $0xfffffff0,%esp
0x08048389 <main+9>:    mov    $0x0,%eax
0x0804838e <main+14>:   add    $0xf,%eax
0x08048391 <main+17>:   add    $0xf,%eax
0x08048394 <main+20>:   shr    $0x4,%eax
0x08048397 <main+23>:   shl    $0x4,%eax
0x0804839a <main+26>:   sub    %eax,%esp
0x0804839c <main+28>:   movl   $0x0,0xfffffffc(%ebp)
0x080483a3 <main+35>:   sub    $0xc,%esp
0x080483a6 <main+38>:   lea    0xfffffffc(%ebp),%eax
0x080483a9 <main+41>:   push   %eax
0x080483aa <main+42>:   call   0x8048368 <subr>
0x080483af <main+47>:   add    $0x10,%esp
0x080483b2 <main+50>:   mov    0xfffffffc(%ebp),%eax   ===> read var1?
0x080483b5 <main+53>:   mov    %eax,0x80495e8
0x080483ba <main+58>:   sub    $0x4,%esp
0x080483bd <main+61>:   pushl  0xfffffffc(%ebp)        ===> read var1?
0x080483c0 <main+64>:   pushl  0x80495e8
0x080483c6 <main+70>:   push   $0x80484c8
0x080483cb <main+75>:   call   0x80482b0 <printf@plt>
0x080483d0 <main+80>:   add    $0x10,%esp
0x080483d3 <main+83>:   leave
0x080483d4 <main+84>:   ret
End of assembler dump.
(gdb) bt
#0  0x080483c0 in main (argc=1, argv=0xbff31354) at rwatch.c:17
(gdb) info registers
eax            0x0      0
ecx            0x0      0
edx            0xf      15
ebx            0xaa7ff4 11173876
esp            0xbff312a8       0xbff312a8
ebp            0xbff312c8       0xbff312c8         (== &var - 4)
esi            0xbff31354       -1074588844
edi            0xbff312e0       -1074588960
eip            0x80483c0        0x80483c0 <main+64>
eflags         0x296    662
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51 


I am not that comfortable with x86 assembly. But it seems that I am 
correct on the guess, right?

Regards
- Wu Zhou


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2006-01-16 10:12 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-01-15 11:21 A problem about read / access watchpoint Wu Zhou
2006-01-16  7:17 ` Jim Blandy
2006-01-16  9:59   ` Wu Zhou
2006-01-16 10:12   ` Wu Zhou

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox