Re: Is this a bug in gdb
Luis Machado <[email protected]>
| Newsgroups | gmane.comp.gdb.devel |
|---|---|
| Message-ID | <[email protected]> |
On 2/17/20 10:21 AM, Volker Weißmann wrote:
> 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:
I went to actually read the documentation (by habit i only use watch
with the address itself) and i was mistaken. The -location option should
take care of grabbing the address of whatever expression you passed to
it. So ...
>
> (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)
... this indeed is supposed to work.
>
> 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.
>
>
I'm guessing GDB got confused while trying to grab the address of your
this->v_ expression. If you have a short testcase for that, it would be
great to have this reported (if it isn't already).