[PATCH v3 4/5] Implement "set cwd" command on GDB

Pedro Alves palves@redhat.com
Wed Sep 27 14:02:00 GMT 2017


On 09/23/2017 06:55 AM, Eli Zaretskii wrote:
>> Cc: gdb-patches@sourceware.org
>> From: Pedro Alves <palves@redhat.com>
>> Date: Fri, 22 Sep 2017 21:37:49 +0100
>>
>> That would mean keep both non-expanded, and expanded paths around,
>> which is what I was suggesting with:
>>
>>  (gdb) set cwd ~foo/bar
>>  (gdb) show cwd
>>  The current directory is ~foo/bar (/home/foo/bar)
>>                                     ^^^^^^^^^^^^^
> 
> Keeping both is also OK, although I don't see how it would solve the
> problems Pedro mentioned earlier, and also now:
> 
>> But that's not what I understood Eli suggesting.  I understood
>> it as gdb expanding whatever's the value set on connection.
>> But I don't see how that could work, because before gdb connects
>> to a remote target explicitly, it's as if gdb was connected to
>> the native target (that's how "run" works without typing
>> "target native" explicitly, though you can type that), so
>> by the time you connect to the remote target, it's already
>> too late, gdb has already expanded on the host, and there's
>> nothing left to expand.
> 
> I don't understand this description, which is not surprising, since my
> knowledge of the machinery involved in this is very superficial.
> 

Let's say that GDB keeps track of the desired cwd for the inferior
as a single string, like Sergio's patch is doing.  Say the user does:

 $ gdb
 (gdb) file program
 (gdb) set cwd ~

At this point, GDB it not "connected" to any target yet.  However,
if the user types "run", GDB automatically uses the native
target to run the inferior.  So typing "run" after the above is
equivalent to:

 $ gdb
 (gdb) file program
 (gdb) set cwd ~
 (gdb) target native
 (gdb) run

OK, now the question is, when to expand that '~'.  If it is
expanded immediately at "set cwd" time, then we end up expanding
it incorrectly in case the user actually wanted to debug remotely:

 $ gdb
 (gdb) file program
 (gdb) set cwd ~
 (gdb) show cwd
 /home/pedro   # local path, doesn't exists on the 'foo' machine.
 (gdb) target extended-remote foo:12345
 (gdb) show cwd
 /home/pedro   # does not exist on 'foo'

If is it instead expanded only when GDB connects to a target, then
we get this:

 $ gdb
 (gdb) file program
 (gdb) set cwd ~
 (gdb) show cwd
 ~   # not expanded yet!
 (gdb) start  # gdb expands ~ -> /home/pedro, then starts the inferior
 (gdb) show cwd
 /home/pedro  # now it's expanded.  users scratches head.
 (gdb) kill
 (gdb) target extended-remote foo:12345    # switch same inferior
                                           # to different target
 (gdb) show cwd
 /home/pedro  # whoops, lost original '~' path, and this path
              # doesn't make sense for the 'foo' machine.


If GDB does not expand the set cwd path ever except internally
when starting the inferior, then the problems shown just above
never happen.

> Keeping both is also OK, although I don't see how it would solve the
> problems Pedro mentioned earlier, and also now:

The problems I mentioned are solved by not expanding in the
first place.  Saving both original-path-as-specified-by-user and 
expanded-path (or expanding on demand when displaying the path to the
user and saving it nowhere) would then be a way to let the user
know what the path expands to on the current target, without losing the
originally set path.  Like:

 $ gdb
 (gdb) file program
 (gdb) set cwd ~
 (gdb) show cwd
 cwd is: ~   
 expands to /home/pedro on current target
 (gdb) start
 (gdb) show cwd
 cwd is: ~   
 expands to /home/pedro on current target
 (gdb) kill
 (gdb) target extended-remote foo:12345
 (gdb) show cwd
 cwd is: ~
 expands to /mnt/home/palves on current target
 (gdb) disconnect
 (gdb) target extended-remote bar:12345
 (gdb) show cwd
 cwd is: ~   
 expands to /nfs/homes/pedro on current target

I'm not sure it's worth the trouble to show the
expansions like this.  But if we make GDB _not_ expand
the "set cwd" setting's value itself, as I was proposing,
then we can always come back and improve GDB's output like
above, to inform the user what the setting expands to,
as extra info.

Hope that is clearer.

Thanks,
Pedro Alves



More information about the Gdb-patches mailing list