From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 988 invoked by alias); 25 Feb 2012 13:50:05 -0000 Received: (qmail 927 invoked by uid 22791); 25 Feb 2012 13:50:02 -0000 X-SWARE-Spam-Status: No, hits=-6.6 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 25 Feb 2012 13:49:47 +0000 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q1PDnk5n005024 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Sat, 25 Feb 2012 08:49:47 -0500 Received: from host2.jankratochvil.net (ovpn-116-19.ams2.redhat.com [10.36.116.19]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q1PDneVO029469 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Sat, 25 Feb 2012 08:49:43 -0500 Date: Sat, 25 Feb 2012 13:55:00 -0000 From: Jan Kratochvil To: gdb-patches@sourceware.org Subject: [patch 2/2] [+doc] New -iex and -ix: -ex and -x before inferior load Message-ID: <20120225134940.GC15155@host2.jankratochvil.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes 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 X-SW-Source: 2012-02/txt/msg00607.txt.bz2 Hi, I also wanted to write this patch for years and for auto-load patch being prepared it gets handy a lot. # mv /usr/lib/debug /usr/lib/debug-x # oops $ ./gdb -q /usr/bin/gdb gdb.core Reading symbols from /usr/bin/gdb...(no debugging symbols found)...done. # naively - not working $ ./gdb -q -ex 'set debug-file-directory /usr/lib/debug-x' /usr/bin/gdb gdb.core Reading symbols from /usr/bin/gdb...(no debugging symbols found)...done. # old way $ ./gdb -q -ex 'set debug-file-directory /usr/lib/debug-x' -ex 'file /usr/bin/gdb' -ex 'core-file gdb.core' Reading symbols from /usr/bin/gdb...Reading symbols from /usr/lib/debug-x/usr/bin/gdb.debug...done.done. -> # new way $ ./gdb -q -iex 'set debug-file-directory /usr/lib/debug-x' /usr/bin/gdb gdb.core Reading symbols from /usr/bin/gdb...Reading symbols from /usr/lib/debug-x/usr/bin/gdb.debug...done.done. I have always difficult time explaining people how to adjust the commandline to apply 'set debug-file-directory', morevoer if you also load a core file or attach to an executable. Another use case is to apply 'set complaints' for the inferior loading. No regressions on {x86_64,x86_64-m32,i686}-fedora17-linux-gnu. Thanks, Jan gdb/ 2012-02-25 Jan Kratochvil * NEWS: Describe new options --init-command=FILE, -ix and --init-eval-command=COMMAND, -iex. * main.c (struct cmdarg): New enum items CMDARG_INIT_FILE and CMDARG_INIT_COMMAND. (captured_main): New enum items OPT_IX and OPT_IEX. Add "init-command", "init-eval-command", "ix" and "iex" to the variable long_options. Handle OPT_IX and OPT_IEX. Process them from CMDARG_VEC. New comment for CMDARG_FILE and CMDARG_COMMAND processing. (print_gdb_help): Describe --init-command=FILE, -ix and --init-eval-command=COMMAND, -iex. gdb/doc/ 2012-02-25 Jan Kratochvil * gdb.texinfo (File Options): Describe --init-command=FILE, -ix and --init-eval-command=COMMAND, -iex. (Startup): Describe -iex and -ix. Simplify the example for "set auto-load-scripts off". gdb/testsuite/ 2012-02-25 Jan Kratochvil * gdb.gdb/selftest.exp (do_steps_and_nexts): New entry for cmdarg_vec = NULL. Remove entries for cmdsize = 1, cmdarg = and ncmd = 0. New entry for VEC_cleanup cmdarg_s. --- a/gdb/NEWS +++ b/gdb/NEWS @@ -78,6 +78,13 @@ show breakpoint condition-evaluation condition evaluation mode. The use of this extension can be controlled via the "set remote conditional-breakpoints-packet" command. +* New command line options + +--init-command=FILE, -ix Like --init-command, -x but execute it + before loading inferior. +--init-eval-command=COMMAND, -iex Like --eval-command=COMMAND, -ex but + execute it before loading inferior. + *** Changes in GDB 7.4 * GDB now handles ambiguous linespecs more consistently; the existing --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -989,6 +989,20 @@ also be interleaved with @samp{-command} as required. -x setbreakpoints -ex 'run' a.out @end smallexample +@item -init-command @var{file} +@itemx -ix @var{file} +@cindex @code{--init-command} +@cindex @code{-ix} +Execute commands from file @var{file} before gdbinit files or inferior loading. +@xref{Startup}. + +@item -init-eval-command @var{command} +@itemx -iex @var{command} +@cindex @code{--init-eval-command} +@cindex @code{-iex} +Execute a single @value{GDBN} command before gdbinit files or inferior loading. +@xref{Startup}. + @item -directory @var{directory} @itemx -d @var{directory} @cindex @code{--directory} @@ -1234,6 +1248,13 @@ Sets up the command interpreter as specified by the command line (@pxref{Mode Options, interpreter}). @item +Execute commands and command files specified by the @samp{-iex} and +@samp{-ix} options in their specified order. Usually you should use the +@samp{-ex} and @samp{-x} options instead but this way you can apply +settings before @value{GDBN} init files get executed and before inferior +gets loaded. + +@item @cindex init file Reads the system-wide @dfn{init file} (if @option{--with-system-gdbinit} was used when building @value{GDBN}; @pxref{System-wide configuration, @@ -1267,14 +1288,11 @@ If you wish to disable the auto-loading during startup, you must do something like the following: @smallexample -$ gdb -ex "set auto-load-scripts off" -ex "file myprogram" +$ gdb -iex "set auto-load-scripts off" myprogram @end smallexample -The following does not work because the auto-loading is turned off too late: - -@smallexample -$ gdb -ex "set auto-load-scripts off" myprogram -@end smallexample +Option @samp{-ex} does not work because the auto-loading is then turned +off too late: @item Reads command files specified by the @samp{-x} option. @xref{Command --- a/gdb/main.c +++ b/gdb/main.c @@ -247,7 +247,13 @@ typedef struct cmdarg { CMDARG_FILE, /* Option type -ex. */ - CMDARG_COMMAND + CMDARG_COMMAND, + + /* Option type -ix. */ + CMDARG_INIT_FILE, + + /* Option type -iex. */ + CMDARG_INIT_COMMAND } type; /* Value of this option - filename or the GDB command itself. String memory @@ -394,7 +400,9 @@ captured_main (void *data) OPT_STATISTICS, OPT_TUI, OPT_NOWINDOWS, - OPT_WINDOWS + OPT_WINDOWS, + OPT_IX, + OPT_IEX }; static struct option long_options[] = { @@ -434,6 +442,10 @@ captured_main (void *data) {"version", no_argument, &print_version, 1}, {"x", required_argument, 0, 'x'}, {"ex", required_argument, 0, 'X'}, + {"init-command", required_argument, 0, OPT_IX}, + {"init-eval-command", required_argument, 0, OPT_IEX}, + {"ix", required_argument, 0, OPT_IX}, + {"iex", required_argument, 0, OPT_IEX}, #ifdef GDBTK {"tclcommand", required_argument, 0, 'z'}, {"enable-external-editor", no_argument, 0, 'y'}, @@ -555,6 +567,19 @@ captured_main (void *data) VEC_safe_push (cmdarg_s, cmdarg_vec, &cmdarg); } break; + case OPT_IX: + { + struct cmdarg cmdarg = { CMDARG_INIT_FILE, optarg }; + + VEC_safe_push (cmdarg_s, cmdarg_vec, &cmdarg); + } + break; + case OPT_IEX: + { + struct cmdarg cmdarg = { CMDARG_INIT_COMMAND, optarg }; + + VEC_safe_push (cmdarg_s, cmdarg_vec, &cmdarg); + } break; case 'B': batch_flag = batch_silent = 1; @@ -807,6 +832,20 @@ captured_main (void *data) quit_pre_print = error_pre_print; warning_pre_print = _("\nwarning: "); + /* Process '-ix' and '-iex' options early. */ + for (i = 0; VEC_iterate (cmdarg_s, cmdarg_vec, i, cmdarg_p); i++) + switch (cmdarg_p->type) + { + case CMDARG_INIT_FILE: + catch_command_errors (source_script, cmdarg_p->string, + !batch_flag, RETURN_MASK_ALL); + break; + case CMDARG_INIT_COMMAND: + catch_command_errors (execute_command, cmdarg_p->string, + !batch_flag, RETURN_MASK_ALL); + break; + } + /* Read and execute the system-wide gdbinit file, if it exists. This is done *before* all the command line arguments are processed; it sets global parameters, which are independent of @@ -909,6 +948,7 @@ captured_main (void *data) ALL_OBJFILES (objfile) load_auto_scripts_for_objfile (objfile); + /* Process '-x' and '-ex' options. */ for (i = 0; VEC_iterate (cmdarg_s, cmdarg_vec, i, cmdarg_p); i++) switch (cmdarg_p->type) { @@ -991,6 +1031,8 @@ Options:\n\n\ Execute a single GDB command.\n\ May be used multiple times and in conjunction\n\ with --command.\n\ + --init-command=FILE, -ix Like -x but execute it before loading inferior.\n\ + --init-eval-command=COMMAND, -iex Like -ex but before loading inferior.\n\ --core=COREFILE Analyze the core dump COREFILE.\n\ --pid=PID Attach to running process PID.\n\ "), stream); --- a/gdb/testsuite/gdb.gdb/selftest.exp +++ b/gdb/testsuite/gdb.gdb/selftest.exp @@ -88,6 +88,10 @@ proc do_steps_and_nexts {} { set description "step over ttyarg initialization" set command "step" } + -re ".*cmdarg_vec = NULL.*$gdb_prompt $" { + set description "step over cmdarg_vec initialization" + set command "step" + } -re ".*pre_stat_chain = make_command_stats_cleanup.*$gdb_prompt $" { set description "next over make_command_stats_cleanup and everything it calls" set command "next" @@ -124,18 +128,6 @@ proc do_steps_and_nexts {} { set description "next over conditional stack alignment alloca" set command "next" } - -re ".*cmdsize = 1.*$gdb_prompt $" { - set description "step over cmdsize initialization" - set command "next" - } - -re ".*cmdarg = .* xmalloc.*$gdb_prompt $" { - set description "next over cmdarg initialization via xmalloc" - set command "next" - } - -re ".*ncmd = 0.*$gdb_prompt $" { - set description "next over ncmd initialization" - set command "next" - } -re ".*dirsize = 1.*$gdb_prompt $" { set description "next over dirsize initialization" set command "next" @@ -159,6 +151,10 @@ proc do_steps_and_nexts {} { set description "next over textdomain PACKAGE" set command "next" } + -re ".*VEC_cleanup .cmdarg_s.*$gdb_prompt $" { + set description "next over cmdarg_s VEC_cleanup" + set command "next" + } -re "\[0-9\]+\[\t \]+\{\r\n$gdb_prompt $" { set description "step over initial brace" set command "step"