From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20547 invoked by alias); 29 Dec 2008 14:27:40 -0000 Received: (qmail 20531 invoked by uid 22791); 29 Dec 2008 14:27:38 -0000 X-SWARE-Spam-Status: No, hits=-1.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_34,J_CHICKENPOX_37,J_CHICKENPOX_48,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 29 Dec 2008 14:27:02 +0000 Received: (qmail 16955 invoked from network); 29 Dec 2008 14:27:00 -0000 Received: from unknown (HELO orlando.local) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 29 Dec 2008 14:27:00 -0000 From: Pedro Alves To: gdb-patches@sourceware.org Subject: Re: PR7580 - Command to force abort when internal error Date: Mon, 29 Dec 2008 14:27:00 -0000 User-Agent: KMail/1.9.10 Cc: Joel Brobecker References: <200812290335.09199.pedro@codesourcery.com> <20081229044011.GH4216@adacore.com> In-Reply-To: <20081229044011.GH4216@adacore.com> MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_z4NWJU98QyTDAOR" Message-Id: <200812291426.59784.pedro@codesourcery.com> 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: 2008-12/txt/msg00446.txt.bz2 --Boundary-00=_z4NWJU98QyTDAOR Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 1020 On Monday 29 December 2008 04:40:11, Joel Brobecker wrote: > > maint set internal-error quit [on|off|auto] > > maint set internal-error corefile [on|off|auto] > > Using "on|off|auto" allows us to re-use the tri-state boolean set/show > commands, but I do find the "auto" value to be confusing. How about > using "on|off|ask" instead? I agree that it is confusing. It seemed at since the variable was already auto_boolean, it was already established that "auto" could mean "ask" in some contexts. "set breakpoint pending" command is using "auto" in a similar way, though, surprisingly, there aren't that many setshow_auto_boolean commands; and we don't need to make the same mistake here. I looked around for other three-state commands, and didn't find reusable patterns, which made me drop the idea of generalizing this, but there's a chance I didn't look right. I think the best is to make this an enum command with the three options ask|on|off, or perhaps better yet, ask|yes|no, as attached? -- Pedro Alves --Boundary-00=_z4NWJU98QyTDAOR Content-Type: text/x-diff; charset="iso 8859-15"; name="pr7580.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="pr7580.diff" Content-length: 8927 gdb/ 2008-12-29 Pedro Alves Add "maint set|show internal-error|internal-warning quit|corefile ask|yes|no" commands. PR gdb/7580: * utils.c (internal_problem_ask, internal_problem_yes) (internal_problem_no, internal_problem_modes): New. (struct internal_problem): Remove FIXME. Make should_quit and should_dump_core types to char *. (internal_vproblem, internal_error_problem) (internal_warning_problem): Adjust. (set_internal_problem_cmd, show_internal_problem_cmd): New dummy functions. (add_internal_problem_command): New. (_initialize_utils): New. gdb/doc/ 2008-12-29 Pedro Alves PR gdb/7580: * gdb.texinfo (Maintenance Commands): Document "maint set|show internal-error|internal-warning quit|corefile ask|yes|no". --- gdb/doc/gdb.texinfo | 23 ++++++++ gdb/utils.c | 149 +++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 141 insertions(+), 31 deletions(-) Index: src/gdb/utils.c =================================================================== --- src.orig/gdb/utils.c 2008-12-29 02:26:03.000000000 +0000 +++ src/gdb/utils.c 2008-12-29 14:02:27.000000000 +0000 @@ -825,6 +825,21 @@ error_stream (struct ui_file *stream) error (("%s"), message); } +/* Allow the user to configure the debugger behavior with respect to + what to do when an internal problem is detected. */ + +const char internal_problem_ask[] = "ask"; +const char internal_problem_yes[] = "yes"; +const char internal_problem_no[] = "no"; +static const char *internal_problem_modes[] = +{ + internal_problem_ask, + internal_problem_yes, + internal_problem_no, + NULL +}; +static const char *internal_problem_mode = internal_problem_ask; + /* Print a message reporting an internal error/warning. Ask the user if they want to continue, dump core, or just exit. Return something to indicate a quit. */ @@ -832,10 +847,8 @@ error_stream (struct ui_file *stream) struct internal_problem { const char *name; - /* FIXME: cagney/2002-08-15: There should be ``maint set/show'' - commands available for controlling these variables. */ - enum auto_boolean should_quit; - enum auto_boolean should_dump_core; + const char *should_quit; + const char *should_dump_core; }; /* Report a problem, internal to GDB, to the user. Once the problem @@ -890,42 +903,33 @@ further debugging may prove unreliable." make_cleanup (xfree, reason); } - switch (problem->should_quit) + if (problem->should_quit == internal_problem_ask) { - case AUTO_BOOLEAN_AUTO: /* Default (yes/batch case) is to quit GDB. When in batch mode - this lessens the likelhood of GDB going into an infinate - loop. */ + this lessens the likelihood of GDB going into an infinite + loop. */ quit_p = query (_("%s\nQuit this debugging session? "), reason); - break; - case AUTO_BOOLEAN_TRUE: - quit_p = 1; - break; - case AUTO_BOOLEAN_FALSE: - quit_p = 0; - break; - default: - internal_error (__FILE__, __LINE__, _("bad switch")); } + else if (problem->should_quit == internal_problem_yes) + quit_p = 1; + else if (problem->should_quit == internal_problem_no) + quit_p = 0; + else + internal_error (__FILE__, __LINE__, _("bad switch")); - switch (problem->should_dump_core) + if (problem->should_dump_core == internal_problem_ask) { - case AUTO_BOOLEAN_AUTO: /* Default (yes/batch case) is to dump core. This leaves a GDB `dropping' so that it is easier to see that something went wrong in GDB. */ dump_core_p = query (_("%s\nCreate a core file of GDB? "), reason); - break; - break; - case AUTO_BOOLEAN_TRUE: - dump_core_p = 1; - break; - case AUTO_BOOLEAN_FALSE: - dump_core_p = 0; - break; - default: - internal_error (__FILE__, __LINE__, _("bad switch")); } + else if (problem->should_dump_core == internal_problem_yes) + dump_core_p = 1; + else if (problem->should_dump_core == internal_problem_no) + dump_core_p = 0; + else + internal_error (__FILE__, __LINE__, _("bad switch")); if (quit_p) { @@ -949,7 +953,7 @@ further debugging may prove unreliable." } static struct internal_problem internal_error_problem = { - "internal-error", AUTO_BOOLEAN_AUTO, AUTO_BOOLEAN_AUTO + "internal-error", internal_problem_ask, internal_problem_ask }; NORETURN void @@ -969,7 +973,7 @@ internal_error (const char *file, int li } static struct internal_problem internal_warning_problem = { - "internal-warning", AUTO_BOOLEAN_AUTO, AUTO_BOOLEAN_AUTO + "internal-warning", internal_problem_ask, internal_problem_ask }; void @@ -987,6 +991,82 @@ internal_warning (const char *file, int va_end (ap); } +static void +set_internal_problem_cmd (char *args, int from_tty) +{ +} + +static void +show_internal_problem_cmd (char *args, int from_tty) +{ +} + +static void +add_internal_problem_command (struct internal_problem *problem) +{ + struct cmd_list_element **set_cmd_list; + struct cmd_list_element **show_cmd_list; + char *set_doc; + char *show_doc; + + set_cmd_list = xmalloc (sizeof (*set_cmd_list)); + show_cmd_list = xmalloc (sizeof (*set_cmd_list)); + *set_cmd_list = NULL; + *show_cmd_list = NULL; + + set_doc = xstrprintf (_("Configure what GDB does when an %s is detected."), + problem->name); + + show_doc = xstrprintf (_("Show what GDB does when an %s is detected."), + problem->name); + + add_prefix_cmd ((char*) problem->name, + class_maintenance, set_internal_problem_cmd, set_doc, + set_cmd_list, + concat ("maintenance set ", problem->name, " ", NULL), + 0/*allow-unknown*/, &maintenance_set_cmdlist); + + add_prefix_cmd ((char*) problem->name, + class_maintenance, show_internal_problem_cmd, show_doc, + show_cmd_list, + concat ("maintenance show ", problem->name, " ", NULL), + 0/*allow-unknown*/, &maintenance_show_cmdlist); + + set_doc = xstrprintf (_("\ +Set whether GDB should quit when an %s is detected"), + problem->name); + show_doc = xstrprintf (_("\ +Show whether GDB will quit when an %s is detected"), + problem->name); + add_setshow_enum_cmd ("quit", class_maintenance, + internal_problem_modes, + &problem->should_quit, + set_doc, + show_doc, + NULL, /* help_doc */ + NULL, /* setfunc */ + NULL, /* showfunc */ + set_cmd_list, + show_cmd_list); + + set_doc = xstrprintf (_("\ +Set whether GDB should create a core file of GDB when an %s is detected"), + problem->name); + show_doc = xstrprintf (_("\ +Show whether GDB will create a core file of GDB when an %s is detected"), + problem->name); + add_setshow_enum_cmd ("corefile", class_maintenance, + internal_problem_modes, + &problem->should_dump_core, + set_doc, + show_doc, + NULL, /* help_doc */ + NULL, /* setfunc */ + NULL, /* showfunc */ + set_cmd_list, + show_cmd_list); +} + /* Print the system error message for errno, and also mention STRING as the file name for which the error was encountered. Then return to command level. */ @@ -3441,3 +3521,10 @@ gdb_buildargv (const char *s) nomem (0); return argv; } + +void +_initialize_utils (void) +{ + add_internal_problem_command (&internal_error_problem); + add_internal_problem_command (&internal_warning_problem); +} Index: src/gdb/doc/gdb.texinfo =================================================================== --- src.orig/gdb/doc/gdb.texinfo 2008-12-29 02:33:57.000000000 +0000 +++ src/gdb/doc/gdb.texinfo 2008-12-29 13:09:09.000000000 +0000 @@ -24796,6 +24796,29 @@ Create a core file? (y or n) @kbd{n} (@value{GDBP}) @end smallexample +@kindex maint set internal-error quit +@kindex maint show internal-error quit +@kindex maint set internal-error corefile +@kindex maint show internal-error corefile +@kindex maint set internal-warning quit +@kindex maint show internal-warning quit +@kindex maint set internal-warning corefile +@kindex maint show internal-warning corefile +@item maint set internal-error quit [ask|yes|no] +@itemx maint show internal-error quit +@itemx maint set internal-error corefile [ask|yes|no] +@itemx maint show internal-error corefile +@itemx maint set internal-warning quit [ask|yes|no] +@itemx maint show internal-warning quit +@itemx maint set internal-warning corefile [ask|yes|no] +@itemx maint show internal-warning corefile +When @value{GDBN} reports an internal problem (error or warning) it +gives the user the oportunity to both quit @value{GDBN} and create a +core file of the current @value{GDBN} session. These commands let you +override the default (ask) of prompting the user. You can specify +that @value{GDBN} should always (yes) or never (no) quit or create a +core file. + @kindex maint packet @item maint packet @var{text} If @value{GDBN} is talking to an inferior via the serial protocol, --Boundary-00=_z4NWJU98QyTDAOR--