2003-08-09 Andrew Cagney <cagney@redhat.com>

Fix GDB PR cli/926.
	* cli/cli-decode.c (add_setshow_uinteger_cmd): New function.
	* command.h (add_setshow_uinteger_cmd): Declare.
	* frame.c (set_backtrace_cmd): New function.
	(show_backtrace_cmd): New function.
	* frame.c (_initialize_frame): Replace "set/show
	backtrace-below-main" with "set/show backtrace past-main".  Add
	command "set/show backtrace limit".
	(backtrace_past_main): Rename "backtrace_below_main".
	(backtrace_limit): New variable.
	(get_prev_frame): Update.  Check the backtrace_limit.

2003-08-09  Andrew Cagney  <cagney@redhat.com>

	* gdb.texinfo (Backtrace): Replace "set/show backtrace-below-main"
	with "set/show backtrace past-main" and "set/show backtrace
	limit".

Index: doc/gdb.texinfo
===================================================================
RCS file: /cvs/src/src/gdb/doc/gdb.texinfo,v
retrieving revision 1.174
diff -u -r1.174 gdb.texinfo
--- doc/gdb.texinfo	8 Aug 2003 01:58:00 -0000	1.174
+++ doc/gdb.texinfo	9 Aug 2003 14:57:10 -0000
@@ -3922,27 +3922,40 @@
 value, indicating that your program has stopped at the beginning of the
 code for line @code{993} of @code{builtin.c}.

-@kindex set backtrace-below-main
-@kindex show backtrace-below-main
+@kindex set backtrace past-main
+@kindex show backtrace past-main
+@kindex set backtrace limit
+@kindex show backtrace limit

-Most programs have a standard entry point---a place where system libraries
-and startup code transition into user code.  For C this is @code{main}.
-When @value{GDBN} finds the entry function in a backtrace it will terminate
-the backtrace, to avoid tracing into highly system-specific (and generally
-uninteresting) code.  If you need to examine the startup code, then you can
-change this behavior.
+Most programs have a standard user entry point---a place where system
+libraries and startup code transition into user code.  For C this is
+@code{main}.  When @value{GDBN} finds the entry function in a backtrace
+it will terminate the backtrace, to avoid tracing into highly
+system-specific (and generally uninteresting) code.
+
+If you need to examine the startup code, or limit the number of levels
+in a backtrace, you can change this behavior:

 @table @code
-@item set backtrace-below-main off
+@item set backtrace past-main
+@itemx set backtrace past-main on
+Backtraces will continue past the user entry point.
+
+@item set backtrace past-main off
 Backtraces will stop when they encounter the user entry point.  This is the
 default.

-@item set backtrace-below-main
-@itemx set backtrace-below-main on
-Backtraces will continue past the user entry point to the top of the stack.
+@item show backtrace past-main
+Display the current user entry point backtrace policy.
+
+@item set backtrace limit @var{n}
+@itemx set backtrace limit 0
+@cindex backtrace limit
+Limit the backtrace to @var{n} levels.  A value of zero means
+unlimited.

-@item show backtrace-below-main
-Display the current backtrace policy.
+@item show backtrace limit
+Display the current limit on backtrace levels.
 @end table

 @node Selection
This commit is contained in:
Andrew Cagney 2003-08-09 15:10:09 +00:00
parent 9ebf4acf53
commit 25d29d7093
6 changed files with 124 additions and 24 deletions

View File

@ -1,3 +1,17 @@
2003-08-09 Andrew Cagney <cagney@redhat.com>
Fix GDB PR cli/926.
* cli/cli-decode.c (add_setshow_uinteger_cmd): New function.
* command.h (add_setshow_uinteger_cmd): Declare.
* frame.c (set_backtrace_cmd): New function.
(show_backtrace_cmd): New function.
* frame.c (_initialize_frame): Replace "set/show
backtrace-below-main" with "set/show backtrace past-main". Add
command "set/show backtrace limit".
(backtrace_past_main): Rename "backtrace_below_main".
(backtrace_limit): New variable.
(get_prev_frame): Update. Check the backtrace_limit.
2003-08-09 Andrew Cagney <cagney@redhat.com>
* defs.h (xstrprintf): Declare.

View File

@ -448,6 +448,26 @@ add_setshow_boolean_cmd (char *name,
c->enums = boolean_enums;
}
/* Add element named NAME to both the set and show command LISTs (the
list for set/show or some sublist thereof). CLASS is as in
add_cmd. VAR is address of the variable which will contain the
value. SET_DOC and SHOW_DOR are the documentation strings. */
void
add_setshow_uinteger_cmd (char *name,
enum command_class class,
unsigned int *var, char *set_doc, char *show_doc,
cmd_sfunc_ftype *set_func,
cmd_sfunc_ftype *show_func,
struct cmd_list_element **set_list,
struct cmd_list_element **show_list)
{
add_setshow_cmd_full (name, class, var_uinteger, var,
set_doc, show_doc,
set_func, show_func,
set_list, show_list,
NULL, NULL);
}
/* Where SETCMD has already been added, add the corresponding show
command to LIST and return a pointer to the added command (not
necessarily the head of LIST). */

View File

@ -262,6 +262,16 @@ extern void add_setshow_boolean_cmd (char *name,
struct cmd_list_element **set_list,
struct cmd_list_element **show_list);
extern void add_setshow_uinteger_cmd (char *name,
enum command_class class,
unsigned int *var,
char *set_doc,
char *show_doc,
cmd_sfunc_ftype *set_func,
cmd_sfunc_ftype *show_func,
struct cmd_list_element **set_list,
struct cmd_list_element **show_list);
extern struct cmd_list_element *add_show_from_set (struct cmd_list_element *,
struct cmd_list_element
**);

View File

@ -1,3 +1,9 @@
2003-08-09 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Backtrace): Replace "set/show backtrace-below-main"
with "set/show backtrace past-main" and "set/show backtrace
limit".
2003-08-08 H.J. Lu <hongjiu.lu@intel.com>
* Makefile.in (install-info): Support DESTDIR.

View File

@ -3922,27 +3922,40 @@ The display for frame zero does not begin with a program counter
value, indicating that your program has stopped at the beginning of the
code for line @code{993} of @code{builtin.c}.
@kindex set backtrace-below-main
@kindex show backtrace-below-main
@kindex set backtrace past-main
@kindex show backtrace past-main
@kindex set backtrace limit
@kindex show backtrace limit
Most programs have a standard entry point---a place where system libraries
and startup code transition into user code. For C this is @code{main}.
When @value{GDBN} finds the entry function in a backtrace it will terminate
the backtrace, to avoid tracing into highly system-specific (and generally
uninteresting) code. If you need to examine the startup code, then you can
change this behavior.
Most programs have a standard user entry point---a place where system
libraries and startup code transition into user code. For C this is
@code{main}. When @value{GDBN} finds the entry function in a backtrace
it will terminate the backtrace, to avoid tracing into highly
system-specific (and generally uninteresting) code.
If you need to examine the startup code, or limit the number of levels
in a backtrace, you can change this behavior:
@table @code
@item set backtrace-below-main off
@item set backtrace past-main
@itemx set backtrace past-main on
Backtraces will continue past the user entry point.
@item set backtrace past-main off
Backtraces will stop when they encounter the user entry point. This is the
default.
@item set backtrace-below-main
@itemx set backtrace-below-main on
Backtraces will continue past the user entry point to the top of the stack.
@item show backtrace past-main
Display the current user entry point backtrace policy.
@item show backtrace-below-main
Display the current backtrace policy.
@item set backtrace limit @var{n}
@itemx set backtrace limit 0
@cindex backtrace limit
Limit the backtrace to @var{n} levels. A value of zero means
unlimited.
@item show backtrace limit
Display the current limit on backtrace levels.
@end table
@node Selection

View File

@ -135,9 +135,11 @@ struct frame_info
static int frame_debug;
/* Flag to indicate whether backtraces should stop at main. */
/* Flag to indicate whether backtraces should stop at main et.al. */
static int backtrace_past_main;
static unsigned int backtrace_limit = UINT_MAX;
static int backtrace_below_main;
void
fprint_frame_id (struct ui_file *file, struct frame_id id)
@ -1802,7 +1804,7 @@ get_prev_frame (struct frame_info *this_frame)
gdb_assert (this_frame != NULL);
if (this_frame->level >= 0
&& !backtrace_below_main
&& !backtrace_past_main
&& inside_main_func (get_frame_pc (this_frame)))
/* Don't unwind past main(), bug always unwind the sentinel frame.
Note, this is done _before_ the frame has been marked as
@ -1814,6 +1816,11 @@ get_prev_frame (struct frame_info *this_frame)
return NULL;
}
if (this_frame->level > backtrace_limit)
{
error ("Backtrace limit of %d exceeded", backtrace_limit);
}
/* If we're already inside the entry function for the main objfile,
then it isn't valid. Don't apply this test to a dummy frame -
dummy frame PC's typically land in the entry func. Don't apply
@ -2370,18 +2377,39 @@ legacy_frame_p (struct gdbarch *current_gdbarch)
extern initialize_file_ftype _initialize_frame; /* -Wmissing-prototypes */
static struct cmd_list_element *set_backtrace_cmdlist;
static struct cmd_list_element *show_backtrace_cmdlist;
static void
set_backtrace_cmd (char *args, int from_tty)
{
help_list (set_backtrace_cmdlist, "set backtrace ", -1, gdb_stdout);
}
static void
show_backtrace_cmd (char *args, int from_tty)
{
cmd_show_list (show_backtrace_cmdlist, from_tty, "");
}
void
_initialize_frame (void)
{
obstack_init (&frame_cache_obstack);
/* FIXME: cagney/2003-01-19: This command needs a rename. Suggest
`set backtrace {past,beyond,...}-main'. Also suggest adding `set
backtrace ...-start' to control backtraces past start. The
problem with `below' is that it stops the `up' command. */
add_prefix_cmd ("backtrace", class_maintenance, set_backtrace_cmd, "\
Set backtrace specific variables.\n\
Configure backtrace variables such as the backtrace limit",
&set_backtrace_cmdlist, "set backtrace ",
0/*allow-unknown*/, &setlist);
add_prefix_cmd ("backtrace", class_maintenance, show_backtrace_cmd, "\
Show backtrace specific variables\n\
Show backtrace variables such as the backtrace limit",
&show_backtrace_cmdlist, "show backtrace ",
0/*allow-unknown*/, &showlist);
add_setshow_boolean_cmd ("backtrace-below-main", class_obscure,
&backtrace_below_main, "\
add_setshow_boolean_cmd ("past-main", class_obscure,
&backtrace_past_main, "\
Set whether backtraces should continue past \"main\".\n\
Normally the caller of \"main\" is not of interest, so GDB will terminate\n\
the backtrace at \"main\". Set this variable if you need to see the rest\n\
@ -2390,8 +2418,17 @@ Show whether backtraces should continue past \"main\".\n\
Normally the caller of \"main\" is not of interest, so GDB will terminate\n\
the backtrace at \"main\". Set this variable if you need to see the rest\n\
of the stack trace.",
NULL, NULL, &setlist, &showlist);
NULL, NULL, &set_backtrace_cmdlist,
&show_backtrace_cmdlist);
add_setshow_uinteger_cmd ("limit", class_obscure,
&backtrace_limit, "\
Set an upper bound on the number of backtrace levels.\n\
No more than the specified number of frames can be displayed or examined.\n
Zero is unlimited.", "\
Show the upper bound on the number of backtrace levels.",
NULL, NULL, &set_backtrace_cmdlist,
&show_backtrace_cmdlist);
/* Debug this files internals. */
add_show_from_set (add_set_cmd ("frame", class_maintenance, var_zinteger,