mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-03 05:12:28 +08:00
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:
@ -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>
|
2009-01-25 Pedro Alves <pedro@codesourcery.com>
|
||||||
|
|
||||||
* infcmd.c (program_info): Use paddress instead of casting stop_pc
|
* 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>
|
2009-01-26 Pedro Alves <pedro@codesourcery.com>
|
||||||
|
|
||||||
* gdb.texinfo (Using the `gdbserver' Program): Document
|
* gdb.texinfo (Using the `gdbserver' Program): Document
|
||||||
|
@ -24798,6 +24798,33 @@ Create a core file? (y or n) @kbd{n}
|
|||||||
(@value{GDBP})
|
(@value{GDBP})
|
||||||
@end smallexample
|
@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
|
@kindex maint packet
|
||||||
@item maint packet @var{text}
|
@item maint packet @var{text}
|
||||||
If @value{GDBN} is talking to an inferior via the serial protocol,
|
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);
|
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
|
/* Print a message reporting an internal error/warning. Ask the user
|
||||||
if they want to continue, dump core, or just exit. Return
|
if they want to continue, dump core, or just exit. Return
|
||||||
something to indicate a quit. */
|
something to indicate a quit. */
|
||||||
@ -832,10 +847,8 @@ error_stream (struct ui_file *stream)
|
|||||||
struct internal_problem
|
struct internal_problem
|
||||||
{
|
{
|
||||||
const char *name;
|
const char *name;
|
||||||
/* FIXME: cagney/2002-08-15: There should be ``maint set/show''
|
const char *should_quit;
|
||||||
commands available for controlling these variables. */
|
const char *should_dump_core;
|
||||||
enum auto_boolean should_quit;
|
|
||||||
enum auto_boolean should_dump_core;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Report a problem, internal to GDB, to the user. Once the problem
|
/* 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);
|
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
|
/* Default (yes/batch case) is to quit GDB. When in batch mode
|
||||||
this lessens the likelhood of GDB going into an infinate
|
this lessens the likelihood of GDB going into an infinite
|
||||||
loop. */
|
loop. */
|
||||||
quit_p = query (_("%s\nQuit this debugging session? "), reason);
|
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
|
/* Default (yes/batch case) is to dump core. This leaves a GDB
|
||||||
`dropping' so that it is easier to see that something went
|
`dropping' so that it is easier to see that something went
|
||||||
wrong in GDB. */
|
wrong in GDB. */
|
||||||
dump_core_p = query (_("%s\nCreate a core file of GDB? "), reason);
|
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)
|
if (quit_p)
|
||||||
{
|
{
|
||||||
@ -955,7 +959,7 @@ further debugging may prove unreliable.", file, line, problem->name, msg);
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct internal_problem internal_error_problem = {
|
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
|
NORETURN void
|
||||||
@ -975,7 +979,7 @@ internal_error (const char *file, int line, const char *string, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct internal_problem internal_warning_problem = {
|
static struct internal_problem internal_warning_problem = {
|
||||||
"internal-warning", AUTO_BOOLEAN_AUTO, AUTO_BOOLEAN_AUTO
|
"internal-warning", internal_problem_ask, internal_problem_ask
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -993,6 +997,99 @@ internal_warning (const char *file, int line, const char *string, ...)
|
|||||||
va_end (ap);
|
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
|
/* Print the system error message for errno, and also mention STRING
|
||||||
as the file name for which the error was encountered.
|
as the file name for which the error was encountered.
|
||||||
Then return to command level. */
|
Then return to command level. */
|
||||||
@ -3443,3 +3540,10 @@ gdb_buildargv (const char *s)
|
|||||||
nomem (0);
|
nomem (0);
|
||||||
return argv;
|
return argv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_initialize_utils (void)
|
||||||
|
{
|
||||||
|
add_internal_problem_command (&internal_error_problem);
|
||||||
|
add_internal_problem_command (&internal_warning_problem);
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user