PR backtrace/1760
authorDaniel Jacobowitz <drow@false.org>
Sat, 28 May 2005 22:51:37 +0000 (22:51 +0000)
committerDaniel Jacobowitz <drow@false.org>
Sat, 28 May 2005 22:51:37 +0000 (22:51 +0000)
* frame.c (backtrace_limit): Change type to int.
(get_prev_frame): Update backtrace limit support.
(_initialize_frame): Use add_setshow_integer_cmd for backtrace_limit.

gdb/ChangeLog
gdb/frame.c

index 8b4690e3d4e6271e7927f85eea7e1a896f503986..c6c45bde339375865336d33c2d9e966d17e3b0b1 100644 (file)
@@ -1,3 +1,11 @@
+2005-05-28  Daniel Jacobowitz  <dan@codesourcery.com>
+           Jonathan Larmour  <jifl@eCosCentric.com>
+
+       PR backtrace/1760
+       * frame.c (backtrace_limit): Change type to int.
+       (get_prev_frame): Update backtrace limit support.
+       (_initialize_frame): Use add_setshow_integer_cmd for backtrace_limit.
+
 2005-05-28  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * configure.tgt (powerpc64-*-linux*): Enable gdbserver.
index d692f33f6395a6df3ab3f3b209a3e92e928acfe0..dcdf2994d0dc561eaf23ab54e3011f7e5b87a3c3 100644 (file)
@@ -141,7 +141,7 @@ Whether backtraces should continue past the entry point of a program is %s.\n"),
                    value);
 }
 
-static unsigned int backtrace_limit = UINT_MAX;
+static int backtrace_limit = INT_MAX;
 static void
 show_backtrace_limit (struct ui_file *file, int from_tty,
                      struct cmd_list_element *c, const char *value)
@@ -1258,9 +1258,16 @@ get_prev_frame (struct frame_info *this_frame)
       return NULL;
     }
 
-  if (this_frame->level > backtrace_limit)
+  /* If the user's backtrace limit has been exceeded, stop.  We must
+     add two to the current level; one of those accounts for backtrace_limit
+     being 1-based and the level being 0-based, and the other accounts for
+     the level of the new frame instead of the level of the current
+     frame.  */
+  if (this_frame->level + 2 > backtrace_limit)
     {
-      error (_("Backtrace limit of %d exceeded"), backtrace_limit);
+      frame_debug_got_null_frame (gdb_stdlog, this_frame,
+                                 "backtrace limit exceeded");
+      return NULL;
     }
 
   /* If we're already inside the entry function for the main objfile,
@@ -1610,16 +1617,16 @@ the rest of the stack trace."),
                           &set_backtrace_cmdlist,
                           &show_backtrace_cmdlist);
 
-  add_setshow_uinteger_cmd ("limit", class_obscure,
-                           &backtrace_limit, _("\
+  add_setshow_integer_cmd ("limit", class_obscure,
+                          &backtrace_limit, _("\
 Set an upper bound on the number of backtrace levels."), _("\
 Show the upper bound on the number of backtrace levels."), _("\
 No more than the specified number of frames can be displayed or examined.\n\
 Zero is unlimited."),
-                           NULL,
-                           show_backtrace_limit,
-                           &set_backtrace_cmdlist,
-                           &show_backtrace_cmdlist);
+                          NULL,
+                          show_backtrace_limit,
+                          &set_backtrace_cmdlist,
+                          &show_backtrace_cmdlist);
 
   /* Debug this files internals. */
   add_setshow_zinteger_cmd ("frame", class_maintenance, &frame_debug,  _("\