From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18089 invoked by alias); 14 Aug 2017 03:41:11 -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 3824 invoked by uid 89); 14 Aug 2017 03:40:44 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.8 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=individually, rational, HX-HELO:sk:outboun, H*RU:sk:outboun X-HELO: outbound-ss-1812.hostmonster.com Received: from gproxy1-pub.mail.unifiedlayer.com (HELO outbound-ss-1812.hostmonster.com) (69.89.25.95) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 14 Aug 2017 03:40:42 +0000 Received: from CMOut01 (cmgw2 [10.0.90.82]) by gproxy1.mail.unifiedlayer.com (Postfix) with ESMTP id 144D0175AF1 for ; Sun, 13 Aug 2017 21:40:41 -0600 (MDT) Received: from box522.bluehost.com ([74.220.219.122]) by CMOut01 with id wrgd1v00W2f2jeq01rgg95; Sun, 13 Aug 2017 21:40:41 -0600 X-Authority-Analysis: v=2.2 cv=FrR1xyjq c=1 sm=1 tr=0 a=GsOEXm/OWkKvwdLVJsfwcA==:117 a=GsOEXm/OWkKvwdLVJsfwcA==:17 a=KeKAF7QvOSUA:10 a=zstS-IiYAAAA:8 a=20KFwNOVAAAA:8 a=edjJ-nqE6KNgpsE6FPkA:9 a=4G6NA9xxw8l3yy4pmD5M:22 Received: from 75-166-24-97.hlrn.qwest.net ([75.166.24.97]:55932 helo=bapiya.Home) by box522.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.87) (envelope-from ) id 1dh6F3-0025eE-Co; Sun, 13 Aug 2017 21:40:37 -0600 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [RFA v2 01/13] Rationalize "backtrace" command line parsing Date: Mon, 14 Aug 2017 03:41:00 -0000 Message-Id: <20170814034030.20863-2-tom@tromey.com> In-Reply-To: <20170814034030.20863-1-tom@tromey.com> References: <20170814034030.20863-1-tom@tromey.com> X-BWhitelist: no X-Exim-ID: 1dh6F3-0025eE-Co X-Source-Sender: 75-166-24-97.hlrn.qwest.net (bapiya.Home) [75.166.24.97]:55932 X-Source-Auth: tom+tromey.com X-Email-Count: 2 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTIyLmJsdWVob3N0LmNvbQ== X-Local-Domain: yes X-SW-Source: 2017-08/txt/msg00275.txt.bz2 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 * stack.c (backtrace_command): Rewrite command line parsing. doc/ChangeLog 2017-08-13 Tom Tromey * 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 + + * stack.c (backtrace_command): Rewrite command line parsing. + 2017-08-11 Pedro Alves * 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 + + * gdb.texinfo (Backtrace): Describe options individually. + 2017-08-12 Sergio Durigan Junior 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 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