public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Tom Tromey <tom@tromey.com>
To: Eli Zaretskii <eliz@gnu.org>
Cc: Tom Tromey <tom@tromey.com>,  gdb-patches@sourceware.org
Subject: Re: [RFA v3 01/13] Rationalize "backtrace" command line parsing
Date: Mon, 26 Mar 2018 20:45:00 -0000	[thread overview]
Message-ID: <87h8p2y3ax.fsf@tromey.com> (raw)
In-Reply-To: <83y3igf5bu.fsf@gnu.org> (Eli Zaretskii's message of "Sun, 25 Mar	2018 20:11:33 +0300")

>>>>> "Eli" == Eli Zaretskii <eliz@gnu.org> writes:

Eli> I expected to see something like this, before the description of
Eli> arguments:

Eli>  @table @code
Eli>  @item backtrace [@var{args}@dots{}]
Eli>  @itemx bt [@var{args}@dots{}]
Eli>  Print the backtrace of the entire stack.  The optional @var{args} can
Eli>  be one of the following:

Eli> followed by your table of arguments.

Like this?

Tom

commit f8f0cf13d9a8c66a85b287b533c231a44d18c516
Author: Tom Tromey <tom@tromey.com>
Date:   Sun Apr 23 10:54:33 2017 -0600

    Rationalize "backtrace" command line parsing
    
    The backtrace command has peculiar command-line parsing.  In
    particular, it splits the command line, then loops over the arguments.
    If it sees a word it recognizes, like "full", it effectively drops
    this word from the argument vector.  Then, it pastes together the
    remaining arguments, passing them on to backtrace_command_1, which in
    turn passes the resulting string to parse_and_eval_long.
    
    The documentation doesn't mention the parse_and_eval_long at all, so
    it is a bit of a hidden feature that you can "bt 3*2".  The strange
    algorithm above also means you can "bt 3 * no-filters 2" and get 6
    frames...
    
    This patch changes backtrace's command line parsing to be a bit more
    rational.  Now, special words like "full" are only recognized at the
    start of the command.
    
    This also updates the documentation to describe the various bt options
    individually.
    
    gdb/ChangeLog
    2018-03-23  Tom Tromey  <tom@tromey.com>
    
            * stack.c (backtrace_command): Rewrite command line parsing.
    
    gdb/doc/ChangeLog
    2018-03-23  Tom Tromey  <tom@tromey.com>
    
            * gdb.texinfo (Backtrace): Describe options individually.

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 47e6cff43d..90c66e3955 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,7 @@
+2018-03-23  Tom Tromey  <tom@tromey.com>
+
+	* stack.c (backtrace_command): Rewrite command line parsing.
+
 2018-03-26  Simon Marchi  <simon.marchi@ericsson.com>
 
 	* dwarf2read.c (DEF_VEC_I(offset_type)): Remove.
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
index 2441f15431..339f1d51ad 100644
--- a/gdb/doc/ChangeLog
+++ b/gdb/doc/ChangeLog
@@ -1,3 +1,7 @@
+2018-03-23  Tom Tromey  <tom@tromey.com>
+
+	* gdb.texinfo (Backtrace): Describe options individually.
+
 2018-03-19  Tom Tromey  <tom@tromey.com>
 
 	* observer.texi: Remove.
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 74e0fdb4a4..28254c9e68 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -7307,45 +7307,43 @@ frame (frame zero), followed by its caller (frame one), and on up the
 stack.
 
 @anchor{backtrace-command}
-@table @code
 @kindex backtrace
 @kindex bt @r{(@code{backtrace})}
-@item backtrace
-@itemx bt
-Print a backtrace of the entire stack: one line per frame for all
-frames in the stack.
-
-You can stop the backtrace at any time by typing the system interrupt
-character, normally @kbd{Ctrl-c}.
-
-@item backtrace @var{n}
-@itemx bt @var{n}
-Similar, but print only the innermost @var{n} frames.
-
-@item backtrace -@var{n}
-@itemx bt -@var{n}
-Similar, but print only the outermost @var{n} frames.
-
-@item backtrace full
-@itemx bt full
-@itemx bt full @var{n}
-@itemx bt full -@var{n}
-Print the values of the local variables also.  As described above,
-@var{n} specifies the number of frames to print.
-
-@item backtrace no-filters
-@itemx bt no-filters
-@itemx bt no-filters @var{n}
-@itemx bt no-filters -@var{n}
-@itemx bt no-filters full
-@itemx bt no-filters full @var{n}
-@itemx bt no-filters full -@var{n}
+To print a backtrace of the entire stack, use the @code{backtrace}
+command, or its alias @code{bt}.  This command will print one line per
+frame for frames in the stack.  By default, all stack frames are
+printed.  You can stop the backtrace at any time by typing the system
+interrupt character, normally @kbd{Ctrl-c}.
+
+@table @code
+@item backtrace [@var{args}@dots{}]
+@itemx bt [@var{args}@dots{}]
+Print the backtrace of the entire stack.  The optional @var{args} can
+be one of the following:
+
+@table @code
+@item @var{n}
+@itemx @var{n}
+Print only the innermost @var{n} frames, where @var{n} is a positive
+number.
+
+@item -@var{n}
+@itemx -@var{n}
+Print only the outermost @var{n} frames, where @var{n} is a positive
+number.
+
+@item full
+Print the values of the local variables also.  This can be combined
+with a number to limit the number of frames shown.
+
+@item no-filters
 Do not run Python frame filters on this backtrace.  @xref{Frame
 Filter API}, for more information.  Additionally use @ref{disable
 frame-filter all} to turn off all frame filters.  This is only
 relevant when @value{GDBN} has been configured with @code{Python}
 support.
 @end table
+@end table
 
 @kindex where
 @kindex info stack
diff --git a/gdb/stack.c b/gdb/stack.c
index aad8fcd987..13af6594a9 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -1850,61 +1850,39 @@ backtrace_command_1 (const char *count_exp, int show_locals, int no_filters,
 static void
 backtrace_command (const char *arg, int from_tty)
 {
-  int fulltrace_arg = -1, arglen = 0, argc = 0, no_filters  = -1;
-  int user_arg = 0;
+  bool fulltrace = false;
+  bool filters = true;
 
-  std::string reconstructed_arg;
   if (arg)
     {
-      char **argv;
-      int i;
+      bool done = false;
 
-      gdb_argv built_argv (arg);
-      argv = built_argv.get ();
-      argc = 0;
-      for (i = 0; argv[i]; i++)
+      while (!done)
 	{
-	  unsigned int j;
+	  const char *save_arg = arg;
+	  std::string this_arg = extract_arg (&arg);
 
-	  for (j = 0; j < strlen (argv[i]); j++)
-	    argv[i][j] = TOLOWER (argv[i][j]);
+	  if (this_arg.empty ())
+	    break;
 
-	  if (no_filters < 0 && subset_compare (argv[i], "no-filters"))
-	    no_filters = argc;
+	  if (subset_compare (this_arg.c_str (), "no-filters"))
+	    filters = false;
+	  else if (subset_compare (this_arg.c_str (), "full"))
+	    fulltrace = true;
 	  else
 	    {
-	      if (fulltrace_arg < 0 && subset_compare (argv[i], "full"))
-		fulltrace_arg = argc;
-	      else
-		{
-		  user_arg++;
-		  arglen += strlen (argv[i]);
-		}
-	    }
-	  argc++;
-	}
-      arglen += user_arg;
-      if (fulltrace_arg >= 0 || no_filters >= 0)
-	{
-	  if (arglen > 0)
-	    {
-	      for (i = 0; i < argc; i++)
-		{
-		  if (i != fulltrace_arg && i != no_filters)
-		    {
-		      reconstructed_arg += argv[i];
-		      reconstructed_arg += " ";
-		    }
-		}
-	      arg = reconstructed_arg.c_str ();
+	      /* Not a recognized argument, so stop.  */
+	      arg = save_arg;
+	      done = true;
 	    }
-	  else
-	    arg = NULL;
 	}
+
+      if (*arg == '\0')
+	arg = NULL;
     }
 
-  backtrace_command_1 (arg, fulltrace_arg >= 0 /* show_locals */,
-		       no_filters >= 0 /* no frame-filters */, from_tty);
+  backtrace_command_1 (arg, fulltrace /* show_locals */,
+		       !filters /* no frame-filters */, from_tty);
 }
 
 /* Iterate over the local variables of a block B, calling CB with

  reply	other threads:[~2018-03-26 20:45 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-23 20:55 [RFA v3 00/13] various frame filter fixes and cleanups Tom Tromey
2018-03-23 20:55 ` [RFA v3 03/13] Allow hiding of some filtered frames Tom Tromey
2018-03-24  6:32   ` Eli Zaretskii
2018-03-23 20:55 ` [RFA v3 06/13] Allow C-c to work in backtrace in more cases Tom Tromey
2018-03-23 20:55 ` [RFA v3 12/13] Simplify exception handling in py-framefilter.c Tom Tromey
2018-03-23 20:55 ` [RFA v3 05/13] Avoid manual resource management " Tom Tromey
2018-03-23 20:55 ` [RFA v3 07/13] Throw a "quit" on a KeyboardException " Tom Tromey
2018-03-24 11:41   ` Pedro Alves
2018-03-25 16:37     ` Tom Tromey
2018-03-25 17:13       ` Pedro Alves
2018-03-26 21:14         ` Tom Tromey
2018-03-23 20:55 ` [RFA v3 09/13] Return EXT_LANG_BT_ERROR in one more spot " Tom Tromey
2018-03-23 20:55 ` [RFA v3 11/13] Improve "backtrace" help text Tom Tromey
2018-03-23 20:55 ` [RFA v3 08/13] Move some code later in backtrace_command_1 Tom Tromey
2018-03-23 20:55 ` [RFA v3 10/13] Call wrap_hint in one more spot in py-framefilter.c Tom Tromey
2018-03-23 20:55 ` [RFA v3 01/13] Rationalize "backtrace" command line parsing Tom Tromey
2018-03-24  6:31   ` Eli Zaretskii
2018-03-25 16:50     ` Tom Tromey
2018-03-25 17:11       ` Eli Zaretskii
2018-03-26 20:45         ` Tom Tromey [this message]
2018-03-27  2:35           ` Eli Zaretskii
2018-03-23 20:55 ` [RFA v3 13/13] Remove verbose code from backtrace command Tom Tromey
2018-03-23 20:55 ` [RFA v3 04/13] Remove EXT_LANG_BT_COMPLETED Tom Tromey
2018-03-23 20:55 ` [RFA v3 02/13] Change backtrace_command_1 calling to use flags Tom Tromey
2018-03-24 11:42 ` [RFA v3 00/13] various frame filter fixes and cleanups Pedro Alves
2018-03-27  4:01   ` Tom Tromey

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87h8p2y3ax.fsf@tromey.com \
    --to=tom@tromey.com \
    --cc=eliz@gnu.org \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).