Re: Is this a bug in gdb

Volker Weißmann <[email protected]>
Newsgroups gmane.comp.gdb.devel
Message-ID <[email protected]>
On 2/17/20 1:37 PM, Luis Machado wrote:

> On 2/16/20 7:40 PM, Volker Weißmann wrote:
>> Hello,
>>
>> The help text of the watch command claims that the -l option watches the
>> memory of the variable. When I tried this, I was surprised by the
>> outcome (reproducible):
>>
>>
>> (gdb) watch this->v_
>> Hardware watchpoint 2: this->v_
>
> This command tells GDB to watch the value of this->v_, whatever
> address &(this->v_) points to. That, of course, can change across the
> execution of the program.
>
>> (gdb) watch -l this->v_
>
> This command tells GDB to watch for changes in a particular location.
> Since this->v_ is a value rather than a location, the error is thrown.
>
> The correct invocation would be ...
>> A syntax error in expression, near `restrict *) 0x00007fffffffd398'.
>> (gdb)
>>
>> Note: Using print &(this->v_) and  watch (char[8])
>> *outputoftheprintcommand worked.
>>
>
> ... the above. It points to an address that will be watched.
>
>>
>> I am asking you whether this is a bug in gdb or not, because if it is a
>> bug in gdb, I will try to make a minimal example an file a bug report.
>
> I don't think it is a bug. But maybe the documentation isn't doing a
> good enough job of making it clear how to invoke these commands?

The reason why I thought that this might be a bug, is that I wrote the
following toy program to test it:

class MyClass {
public:
     int var = 0;
     void member() {
         var = 1;
     }
};
int main() {
     MyClass obj;
     obj.member();
     obj.var = 2;
     return obj.var;
}

Lets say I want to know why my program returns 2 and not 1. I can do
this like this:

(gdb) break main.cpp:5
Breakpoint 1 at 0x118c: file main.cpp, line 5.
(gdb) run
Starting program: /home/volker/Sync/DatenVolker/bugreports/gdb/a.out

Breakpoint 1, MyClass::member (this=0x7fffffffe344) at main.cpp:5
5               var = 1;
(gdb) watch -l this->var
Hardware watchpoint 2: -location this->var
(gdb) continue
Continuing.

Hardware watchpoint 2: -location this->var

Old value = 0
New value = 1
MyClass::member (this=0x7fffffffe344) at main.cpp:6
6           }
(gdb) continue
Continuing.

Hardware watchpoint 2: -location this->var

Old value = 1
New value = 2
main () at main.cpp:12
12          return obj.var;
(gdb)

In this toy program, watch -l this->var works, but in my large program
watch -l this->v_ did not. And I do not understand the difference.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.