gdb/
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:
parent
62709adfbe
commit
3c16cced40
@ -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
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
166
gdb/utils.c
166
gdb/utils.c
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user