This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch]: inform user that a watchpoint is hit


On Sat, Aug 15, 2009 at 3:57 AM, Chandru<chandru@in.ibm.com> wrote:
> Doug Evans wrote:
>>
>> On Fri, Aug 14, 2009 at 3:32 AM, Chandru<chandru@in.ibm.com> wrote:
>>
>>>
>>> When a program is restarted within gdb, the initial breakpoint hit
>>> messages are
>>> not outputted on to the screen. Inform the user that a watchpoint has
>>> been hit
>>>
>>> Signed-off-by: Chandru Siddalingappa <chandru@ilinux.vnet.ibm.com>
>>> ---
>>>
>>> --- gdb/breakpoint.c.orig ? ? ? 2009-08-14 17:53:06.000000000 +0530
>>> +++ gdb/breakpoint.c ? ?2009-08-14 17:54:02.000000000 +0530
>>> @@ -842,6 +842,9 @@ update_watchpoint (struct breakpoint *b,
>>> ?struct bp_location *loc;
>>> ?bpstat bs;
>>>
>>> + ?if (breakpoint_enabled (b))
>>> + ? ? ?mention(b);
>>> +
>>> ?unlink_locations_from_global_list (b);
>>> ?for (loc = b->loc; loc;)
>>> ? ?{
>>>
>>>
>>
>> Hi.
>> If we're stopping because of a watchpoint and not reporting it, that's
>> bad.
>> But it seems odd that this is happening, and simple experiments don't
>> reveal anything.
>> Do you have a testcase?
>>
>
> yes,
>
> The steps performed to reproduce are:
>
> 1) Compile the following program with debug info
> 2) Run the program.
> 3) Set a watchpoint for "value1" variable.
> 4) Run the test and do some checks. 5) Program exits. Now restart the
> program execution
> 6) Expect to see the message of hitting the watchpoint for value1 in main ()
> line 20.
>
> #include <stdio.h>
> #include <stdlib.h>
>
> int value1 = -1;
> int value2 = -1;
>
> int func1 ()
> {
> ? value1=2;
> ? value2=value1;
> ? ? return 0;
>
> }
>
>
> int main ()
> {
> ? int i;
>
> ? value1 =3;
> ? value2 = value1;
> ? for (i=0; i<2; i++) {
> ? ? value1 = i;
> ? ? value2 = value1;
> ? }
>
> ? func1();
>
> ? ?return 0;
> }
>
>
> ---------------
>
> (gdb) break main
> Breakpoint 1 at 0x8048453: file rawatch.c, line 20.
> (gdb) run
> Starting program: /home/vrvazque/rawatch
>
> Breakpoint 1, main () at rawatch.c:20
> 20 ? ? ? ? ?value1 =3;
> (gdb) rwatch value1
> Hardware read watchpoint 2: value1
> (gdb) awatch value1
> Hardware access (read/write) watchpoint 3: value1
> (gdb) cont
> Continuing.
> Hardware access (read/write) watchpoint 3: value1
>
> Old value = -1
> New value = 3
> 0x08048462 in main () at rawatch.c:21
> 21 ? ? ? ? ?value2 = value1;
> (gdb) cont
> ...
> ...
> ...
> (gdb) cont
> Continuing.
>
> Program exited normally.
> (gdb) run
> Starting program: /home/vrvazque/rawatch
>
> Breakpoint 1, main () at rawatch.c:20
> 20 ? ? ? ? ?value1 =3;
> (gdb) cont
>
>

Thanks for the testcase!

Here's what I see with current cvs head:
[target = amd64-linux]

gdb$ gcc -g chandru.c
gdb$ ./gdb -nx a.out
GNU gdb (GDB) 6.8.50.20090818-cvs
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
(gdb) b main
Breakpoint 1 at 0x400471: file chandru.c, line 20.
(gdb) r
Starting program: /usr/local/g3/gnu/sourceware/dn/build/obj64/gdb/a.out

Breakpoint 1, main () at chandru.c:20
20        value1 =3;
(gdb) rwatch value1
Hardware read watchpoint 2: value1
(gdb) awatch value1
Hardware access (read/write) watchpoint 3: value1
(gdb) c
Continuing.
Hardware access (read/write) watchpoint 3: value1

Old value = -1
New value = 3
0x0000000000400481 in main () at chandru.c:21
21        value2 = value1;
(gdb) c
Continuing.
Hardware access (read/write) watchpoint 3: value1

Old value = 3
New value = 0
main () at chandru.c:24
24          value2 = value1;
(gdb)
Continuing.
Hardware read watchpoint 2: value1

Value = 0
Hardware access (read/write) watchpoint 3: value1

Value = 0
0x000000000040049f in main () at chandru.c:24
24          value2 = value1;
(gdb)
Continuing.
Hardware access (read/write) watchpoint 3: value1

Old value = 0
New value = 1
main () at chandru.c:24
24          value2 = value1;
(gdb)
Continuing.
Hardware read watchpoint 2: value1

Value = 1
Hardware access (read/write) watchpoint 3: value1

Value = 1
0x000000000040049f in main () at chandru.c:24
24          value2 = value1;
(gdb)
Continuing.
Hardware access (read/write) watchpoint 3: value1

Old value = 1
New value = 2
func1 () at chandru.c:10
10        value2=value1;
(gdb)
Continuing.
Hardware read watchpoint 2: value1

Value = 2
Hardware access (read/write) watchpoint 3: value1

Value = 2
0x000000000040045c in func1 () at chandru.c:10
10        value2=value1;
(gdb)
Continuing.

Program exited normally.
(gdb) r
Starting program: /usr/local/g3/gnu/sourceware/dn/build/obj64/gdb/a.out

Breakpoint 1, main () at chandru.c:20
20        value1 =3;
(gdb) i b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400471 in main at chandru.c:20
        breakpoint already hit 1 time
2       read watchpoint keep y                      value1
3       acc watchpoint keep y                      value1
(gdb) c
Continuing.
Hardware access (read/write) watchpoint 3: value1

Old value = -1
New value = 3
0x0000000000400481 in main () at chandru.c:21
21        value2 = value1;
(gdb)

So in cvs head I'm not seeing a problem (though maybe there's more
needed to recreate it).
Which version of gdb are you using?

[Also, I haven't researched this, but maybe there's some overlap here with
http://sourceware.org/ml/gdb-patches/2009-08/msg00254.html.
Dunno.  Doesn't seem like it but thought I'd point it out.]


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]