From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 79755 invoked by alias); 26 Mar 2018 20:45:00 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 79745 invoked by uid 89); 26 Mar 2018 20:44:59 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=apr, filters, Apr X-HELO: gateway20.websitewelcome.com Received: from gateway20.websitewelcome.com (HELO gateway20.websitewelcome.com) (192.185.69.18) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 26 Mar 2018 20:44:57 +0000 Received: from cm15.websitewelcome.com (cm15.websitewelcome.com [100.42.49.9]) by gateway20.websitewelcome.com (Postfix) with ESMTP id 1F3CD400D9A61 for ; Mon, 26 Mar 2018 15:44:56 -0500 (CDT) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id 0Yz9fZBCkntAo0YzAfCoVY; Mon, 26 Mar 2018 15:44:56 -0500 Received: from 174-29-60-18.hlrn.qwest.net ([174.29.60.18]:44694 helo=bapiya) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.89_1) (envelope-from ) id 1f0Yz9-000UhS-OE; Mon, 26 Mar 2018 15:44:55 -0500 From: Tom Tromey To: Eli Zaretskii Cc: Tom Tromey , gdb-patches@sourceware.org Subject: Re: [RFA v3 01/13] Rationalize "backtrace" command line parsing References: <20180323205512.14434-1-tom@tromey.com> <20180323205512.14434-2-tom@tromey.com> <83tvt6gf1j.fsf@gnu.org> <87lgegaykz.fsf@tromey.com> <83y3igf5bu.fsf@gnu.org> Date: Mon, 26 Mar 2018 20:45:00 -0000 In-Reply-To: <83y3igf5bu.fsf@gnu.org> (Eli Zaretskii's message of "Sun, 25 Mar 2018 20:11:33 +0300") Message-ID: <87h8p2y3ax.fsf@tromey.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.0.91 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-BWhitelist: no X-Source-L: No X-Exim-ID: 1f0Yz9-000UhS-OE X-Source-Sender: 174-29-60-18.hlrn.qwest.net (bapiya) [174.29.60.18]:44694 X-Source-Auth: tom+tromey.com X-Email-Count: 2 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTM3OS5ibHVlaG9zdC5jb20= X-Local-Domain: yes X-SW-Source: 2018-03/txt/msg00540.txt.bz2 >>>>> "Eli" == Eli Zaretskii 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 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 * stack.c (backtrace_command): Rewrite command line parsing. gdb/doc/ChangeLog 2018-03-23 Tom Tromey * 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 + + * stack.c (backtrace_command): Rewrite command line parsing. + 2018-03-26 Simon Marchi * 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 + + * gdb.texinfo (Backtrace): Describe options individually. + 2018-03-19 Tom Tromey * 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