Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Tom Tromey <tom@tromey.com>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tom@tromey.com>
Subject: [RFA v2 01/13] Rationalize "backtrace" command line parsing
Date: Mon, 14 Aug 2017 03:41:00 -0000	[thread overview]
Message-ID: <20170814034030.20863-2-tom@tromey.com> (raw)
In-Reply-To: <20170814034030.20863-1-tom@tromey.com>

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.

ChangeLog
2017-08-13  Tom Tromey  <tom@tromey.com>

	* stack.c (backtrace_command): Rewrite command line parsing.

doc/ChangeLog
2017-08-13  Tom Tromey  <tom@tromey.com>

	* gdb.texinfo (Backtrace): Describe options individually.
---
 gdb/ChangeLog       |  4 ++++
 gdb/doc/ChangeLog   |  4 ++++
 gdb/doc/gdb.texinfo | 50 +++++++++++++++------------------------
 gdb/stack.c         | 67 ++++++++++++++++++-----------------------------------
 4 files changed, 49 insertions(+), 76 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index c588291..a754b7d 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,7 @@
+2017-08-13  Tom Tromey  <tom@tromey.com>
+
+	* stack.c (backtrace_command): Rewrite command line parsing.
+
 2017-08-11  Pedro Alves  <palves@redhat.com>
 
 	* infrun.c (process_event_stop_test): Adjust
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
index 4b40698..2592745 100644
--- a/gdb/doc/ChangeLog
+++ b/gdb/doc/ChangeLog
@@ -1,3 +1,7 @@
+2017-08-13  Tom Tromey  <tom@tromey.com>
+
+	* gdb.texinfo (Backtrace): Describe options individually.
+
 2017-08-12  Sergio Durigan Junior  <sergiodj@redhat.com>
 
 	PR gdb/21925
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 7528183..bd19d4a 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -7200,39 +7200,27 @@ 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 all frames in the stack.  You can stop the backtrace at any
+time by typing the system interrupt character, normally @kbd{Ctrl-c}.
+The @code{backtrace} command can accept some arguments:
+
+@table @code
+@item @var{n}
+@itemx @var{n}
+Print only the innermost @var{n} frames.
+
+@item -@var{n}
+@itemx -@var{n}
+Print only the outermost @var{n} frames.
+
+@item full
+Print the values of the local variables also.
+
+@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
diff --git a/gdb/stack.c b/gdb/stack.c
index 3e9dca2..30d16cb 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -1868,65 +1868,42 @@ backtrace_command_1 (char *count_exp, int show_locals, int no_filters,
 static void
 backtrace_command (char *arg, int from_tty)
 {
-  struct cleanup *old_chain = make_cleanup (null_cleanup, NULL);
-  int fulltrace_arg = -1, arglen = 0, argc = 0, no_filters  = -1;
-  int user_arg = 0;
+  bool fulltrace = false;
+  bool filters = true;
 
   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;
+	  gdb::unique_xmalloc_ptr<char[]> this_arg (extract_arg (&arg));
 
-	  for (j = 0; j < strlen (argv[i]); j++)
-	    argv[i][j] = TOLOWER (argv[i][j]);
+	  if (this_arg == NULL)
+	    break;
+
+	  for (j = 0; j < strlen (this_arg.get ()); j++)
+	    this_arg[j] = TOLOWER (this_arg[j]);
 
-	  if (no_filters < 0 && subset_compare (argv[i], "no-filters"))
-	    no_filters = argc;
+	  if (subset_compare (this_arg.get (), "no-filters"))
+	    filters = false;
+	  else if (subset_compare (this_arg.get (), "full"))
+	    fulltrace = true;
 	  else
 	    {
-	      if (fulltrace_arg < 0 && subset_compare (argv[i], "full"))
-		fulltrace_arg = argc;
-	      else
-		{
-		  user_arg++;
-		  arglen += strlen (argv[i]);
-		}
+	      /* Not a recognized argument, so stop.  */
+	      done = true;
 	    }
-	  argc++;
 	}
-      arglen += user_arg;
-      if (fulltrace_arg >= 0 || no_filters >= 0)
-	{
-	  if (arglen > 0)
-	    {
-	      arg = (char *) xmalloc (arglen + 1);
-	      make_cleanup (xfree, arg);
-	      arg[0] = 0;
-	      for (i = 0; i < argc; i++)
-		{
-		  if (i != fulltrace_arg && i != no_filters)
-		    {
-		      strcat (arg, argv[i]);
-		      strcat (arg, " ");
-		    }
-		}
-	    }
-	  else
-	    arg = NULL;
-	}
-    }
 
-  backtrace_command_1 (arg, fulltrace_arg >= 0 /* show_locals */,
-		       no_filters >= 0 /* no frame-filters */, from_tty);
+      arg = skip_spaces (arg);
+      if (*arg == '\0')
+	arg = NULL;
+    }
 
-  do_cleanups (old_chain);
+  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
-- 
2.9.4


  parent reply	other threads:[~2017-08-14  3:41 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-14  3:41 [RFA v2 00/13] various frame filter fixes and cleanups Tom Tromey
2017-08-14  3:41 ` [RFA v2 07/13] Throw a "quit" on a KeyboardException in py-framefilter.c Tom Tromey
2017-08-14  3:41 ` [RFA v2 09/13] Return EXT_LANG_BT_ERROR in one more spot " Tom Tromey
2017-08-14  3:41 ` [RFA v2 13/13] Remove verbose code from backtrace command Tom Tromey
2017-08-14 13:35   ` Pedro Alves
2017-08-14  3:41 ` [RFA v2 11/13] Improve "backtrace" help text Tom Tromey
2017-08-14 13:35   ` Pedro Alves
2017-08-14 14:34     ` Tom Tromey
2017-08-14 14:36       ` Pedro Alves
2017-08-14 14:38         ` Tom Tromey
2017-08-14  3:41 ` Tom Tromey [this message]
2017-08-14 15:07   ` [RFA v2 01/13] Rationalize "backtrace" command line parsing Eli Zaretskii
2017-08-14  3:41 ` [RFA v2 04/13] Remove EXT_LANG_BT_COMPLETED Tom Tromey
2017-08-14  3:41 ` [RFA v2 03/13] Allow elision of some filtered frames Tom Tromey
2017-08-14 15:10   ` Eli Zaretskii
2017-08-14  3:41 ` [RFA v2 05/13] Avoid manual resource management in py-framefilter.c Tom Tromey
2017-08-14  3:41 ` [RFA v2 10/13] Call wrap_hint in one more spot " Tom Tromey
2017-08-14  3:41 ` [RFA v2 12/13] Simplify exception handling " Tom Tromey
2017-08-14 13:36   ` Pedro Alves
2017-08-14  3:41 ` [RFA v2 08/13] Move some code later in backtrace_command_1 Tom Tromey
2017-08-14  3:41 ` [RFA v2 02/13] Change backtrace_command_1 calling to use flags Tom Tromey
2017-08-14  3:57 ` [RFA v2 06/13] Allow C-c to work in backtrace in more cases Tom Tromey
2017-08-14 13:20 ` [RFA v2 00/13] various frame filter fixes and cleanups Pedro Alves
2017-08-14 13:57   ` Phil Muldoon
2017-08-14 14:30     ` Pedro Alves
2017-08-14 13:38 ` Pedro Alves

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=20170814034030.20863-2-tom@tromey.com \
    --to=tom@tromey.com \
    --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