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/
	PR gdb/7580:
	* gdb.texinfo (Maintenance Commands): Document "maint set|show
	internal-error|internal-warning quit|corefile ask|yes|no".
This commit is contained in:
Pedro Alves 2009-01-26 16:24:27 +00:00
parent 62709adfbe
commit 3c16cced40
4 changed files with 185 additions and 31 deletions

View File

@ -1,3 +1,20 @@
2009-01-26 Pedro Alves <pedro@codesourcery.com>
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.
2009-01-25 Pedro Alves <pedro@codesourcery.com>
* infcmd.c (program_info): Use paddress instead of casting stop_pc

View File

@ -1,3 +1,9 @@
2009-01-26 Pedro Alves <pedro@codesourcery.com>
PR gdb/7580:
* gdb.texinfo (Maintenance Commands): Document "maint set|show
internal-error|internal-warning quit|corefile ask|yes|no".
2009-01-26 Pedro Alves <pedro@codesourcery.com>
* gdb.texinfo (Using the `gdbserver' Program): Document

View File

@ -24798,6 +24798,33 @@ Create a core file? (y or n) @kbd{n}
(@value{GDBP})
@end smallexample
@cindex @value{GDBN} internal error
@cindex internal errors, control of @value{GDBN} behavior
@kindex maint set internal-error
@kindex maint show internal-error
@kindex maint set internal-warning
@kindex maint show internal-warning
@item maint set internal-error @var{action} [ask|yes|no]
@itemx maint show internal-error @var{action}
@itemx maint set internal-warning @var{action} [ask|yes|no]
@itemx maint show internal-warning @var{action}
When @value{GDBN} reports an internal problem (error or warning) it
gives the user the opportunity to both quit @value{GDBN} and create a
core file of the current @value{GDBN} session. These commands let you
override the default behaviour for each particular @var{action},
described in the table below.
@table @samp
@item quit
You can specify that @value{GDBN} should always (yes) or never (no)
quit. The default is to ask the user what to do.
@item corefile
You can specify that @value{GDBN} should always (yes) or never (no)
create a core file. The default is to ask the user what to do.
@end table
@kindex maint packet
@item maint packet @var{text}
If @value{GDBN} is talking to an inferior via the serial protocol,

View File

@ -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
@ -896,42 +909,33 @@ further debugging may prove unreliable.", file, line, problem->name, msg);
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)
{
@ -955,7 +959,7 @@ further debugging may prove unreliable.", file, line, problem->name, msg);
}
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
@ -975,7 +979,7 @@ internal_error (const char *file, int line, const char *string, ...)
}
static struct internal_problem internal_warning_problem = {
"internal-warning", AUTO_BOOLEAN_AUTO, AUTO_BOOLEAN_AUTO
"internal-warning", internal_problem_ask, internal_problem_ask
};
void
@ -993,6 +997,99 @@ internal_warning (const char *file, int line, const char *string, ...)
va_end (ap);
}
/* Dummy functions to keep add_prefix_cmd happy. */
static void
set_internal_problem_cmd (char *args, int from_tty)
{
}
static void
show_internal_problem_cmd (char *args, int from_tty)
{
}
/* When GDB reports an internal problem (error or warning) it gives
the user the opportunity to quit GDB and/or create a core file of
the current debug session. This function registers a few commands
that make it possible to specify that GDB should always or never
quit or create a core file, without asking. The commands look
like:
maint set PROBLEM-NAME quit ask|yes|no
maint show PROBLEM-NAME quit
maint set PROBLEM-NAME corefile ask|yes|no
maint show PROBLEM-NAME corefile
Where PROBLEM-NAME is currently "internal-error" or
"internal-warning". */
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 %s is detected."),
problem->name);
show_doc = xstrprintf (_("Show what GDB does when %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 %s is detected"),
problem->name);
show_doc = xstrprintf (_("\
Show whether GDB will create a core file of GDB when %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. */
@ -3443,3 +3540,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);
}