[lldb-dev] Command Aliases

jingham at apple.com jingham at apple.com
Wed Oct 23 09:24:00 PDT 2013


We intentionally did not simply reproduce the gdb command set because while it does some common things in a very compact way, it has limited discoverability, and is hard to extend. The irregularity of the commands also makes it hard to provide good help & command completion.  So the philosophy we took with lldb was to provide a logical command structure that used options explicitly, making it easy to combine them in complex ways and allowing the command completion to figure out what all the tokens should be, etc.  While hard-core gdb fans were not fond of this decision, I have also heard from quite a number of folks that they appreciate the more regular and logical ordering of the commands.

Of course, we knew that that design would make very common commands awkward, so we built in a fairly powerful alias mechanism and added built in aliases for very common commands.  These look like gdb commands on purpose, but somebody coming from another debugger could easily remove these and make up an accelerated command set they are comfortable with.

However, one other way to make command entry simple is to use the shortest unique completion for commands.  So for instance, while having the command called "image look --type Point" makes it really clear what the command does (and makes it easy to provide a way to limit your type search), once you've used the command a few times, you'll probably end up typing:

(lldb) i loo -t Whatever

or

(lldb) i<TAB>loo<TAB>-t Whatever

In this case, it is unfortunate we couldn't think up a better word for "image load" since that makes us type three characters for "lookup", but since this is not such a common command clarity won over brevity...  But as that instance illustrates, it is also important to leave as much of the command space clear in the basic installation so we don't make folks type more than they need to to get to commands, particularly any aliases they want to make for themselves.  For instance, adding "info" to the base command set would mean that I would now have to type "im" not "i" for image lookup.  So we try to avoid that sort of thing, especially if all it does is allow another way to get at extant commands.

As you are discovering, the alias mechanism (and the even more powerful one for Python command extensions) is not completely done yet.  We need to add support for multi-word commands in the alias mechanism, Enrico's suggestion seems like a good one for that, and the Python command registration needs to be able to describe the command being added to the command interpreter so that we can do the parsing and command completion for it, making these commands equals to the built-in ones.  That would be great work to have done if somebody has a little spare time on their hands...

Similarly, if somebody/somebodies who are so motivated want to come up with a more complete set of gdb aliases, it would be fine to include the results of that labor in the examples directory in the lldb sources for all to share.  That way people who wanted to could easily include them, but we wouldn't litter the "first couple characters" command space for the common user.

Jim




On Oct 23, 2013, at 12:10 AM, Michael Sartain <mikesart at gmail.com> wrote:

> I'm in a room with several folks that work on Linux and Mac. One of the major complaints with lldb is the command syntax when switching between the two debuggers. Currently, everyone prefers the gdb syntax. I'm sure a large part of that is due to knowing gdb after using it for so long, but also because some of the commands are much simpler. "ptype Point" vs. "image lookup --type Point", "info symbol 0x1234" vs. "image lookup --address 0x1234", etc. I'm sure there are other folks dealing with this issue when they move to lldb from gdb, and there appear to be several gdb --> lldb aliases already built into lldb - I assume to help with this. So instead of having several different people each trying to solve this for themselves with local python scripts or init files and all the issues that come along with those, I was thinking it would useful to get some more gdb commands it into lldb. Ie, ones like "info" that are fairly simple and don't interfere with existing lldb commands. But we'll take a look at the .lldbinit file Jason mailed, python scripts, and if those don't work for us I'll investigate Enrico's multiword commands idea and possible local lldb modifications.
> 
> Thanks.
> 
> On Tue, Oct 22, 2013 at 8:50 PM, Yin Ma <yin at affinic.com> wrote:
> Hi Michael,
> 
> I recommend this way also. Actually, we have already done this thing
> for our GUI for lldb. It is not hard at all.
> 
> Yin
> 
> -----Original Message-----
> From: lldb-dev-bounces at cs.uiuc.edu [mailto:lldb-dev-bounces at cs.uiuc.edu] On Behalf Of Greg Clayton
> Sent: Tuesday, October 22, 2013 5:58 PM
> To: Michael Sartain
> Cc: lldb-dev at cs.uiuc.edu
> Subject: Re: [lldb-dev] Command Aliases
> 
> Just write a new python command and name it "info". Then re-route as needed under the covers.
> 
> 
> On Oct 22, 2013, at 5:53 PM, Michael Sartain <mikesart at gmail.com> wrote:
> 
> > I'd really like to add aliases for the following commands from gdb:
> >
> > info b[reak]                  ; breakpoint list
> > info ar[gs]                   ; frame variable
> > info lo[cals]                 ; frame variable --no-args
> > info r[egisters]              ; info registers
> > info al[l-registers]          ; info all-registers $rax $rcx
> > info all-registers rax rsp    ; register read rax rsp
> > info sh[ared]                 ; image list
> > info sy[mbol] 0x1234          ; image lookup --address 0x1234
> >
> > These all have spaces in them, which I believe means they won't work with the existing alias system. Would it make the most sense to add a new "CommandObjectMultiwordInfo" object in the Command Interpreter and break all the info stuff out there, or is it feasible to add the ability to recognize multiword aliases so something like this would work:
> >
> >     command alias "info break" breakpoint list
> >
> > Also, it appears that command regex commands don't show up in help -a. See example down below. Is this expected behavior?
> > Thanks!
> >  -Mike
> >
> > (lldb) help command regex
> > ...
> > EXAMPLES
> >     (lldb) command regex f s/^$/finish/ 's/([0-9]+)/frame select %1/'
> > (lldb) command regex f s/^$/finish/ 's/([0-9]+)/frame select %1/'
> > (lldb) help -a
> > ...
> > expression        -- Evaluate a C/ObjC/C++ expression in the current program context, using user defined variables and variables currently in scope.
> > f                 --
> > frame             -- A set of commands for operating on the current thread's frames.
> > ...
> > (lldb) help f
> >      This command takes 'raw' input (no need to quote stuff).
> >
> > Syntax: f
> >
> > 'f' is an abbreviation for 'f'
> > _______________________________________________
> > lldb-dev mailing list
> > lldb-dev at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
> 
> _______________________________________________
> lldb-dev mailing list
> lldb-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
> 
> 
> _______________________________________________
> lldb-dev mailing list
> lldb-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev





More information about the lldb-dev mailing list