static struct frame_info *sentinel_frame;
+/* Number of calls to reinit_frame_cache. */
+static unsigned int frame_cache_generation = 0;
+
+/* See frame.h. */
+
+unsigned int
+get_frame_cache_generation ()
+{
+ return frame_cache_generation;
+}
+
/* The values behind the global "set backtrace ..." settings. */
set_backtrace_options user_set_backtrace_options;
{
struct frame_info *fi;
+ ++frame_cache_generation;
+
/* Tear down all frame caches. */
for (fi = sentinel_frame; fi != NULL; fi = fi->prev)
{
if (prev_frame->level == 0)
return prev_frame;
+ unsigned int entry_generation = get_frame_cache_generation ();
+
try
{
compute_frame_id (prev_frame);
}
catch (const gdb_exception &ex)
{
- prev_frame->next = NULL;
- this_frame->prev = NULL;
+ if (get_frame_cache_generation () == entry_generation)
+ {
+ prev_frame->next = NULL;
+ this_frame->prev = NULL;
+ }
throw;
}
static struct cmd_list_element *set_backtrace_cmdlist;
static struct cmd_list_element *show_backtrace_cmdlist;
-static void
-set_backtrace_cmd (const char *args, int from_tty)
-{
- help_list (set_backtrace_cmdlist, "set backtrace ", all_commands,
- gdb_stdout);
-}
-
-static void
-show_backtrace_cmd (const char *args, int from_tty)
-{
- cmd_show_list (show_backtrace_cmdlist, from_tty, "");
-}
-
/* Definition of the "set backtrace" settings that are exposed as
"backtrace" command options. */
gdb::observers::target_changed.attach (frame_observer_target_changed);
- add_prefix_cmd ("backtrace", class_maintenance, set_backtrace_cmd, _("\
+ add_basic_prefix_cmd ("backtrace", class_maintenance, _("\
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, _("\
+ &set_backtrace_cmdlist, "set backtrace ",
+ 0/*allow-unknown*/, &setlist);
+ add_show_prefix_cmd ("backtrace", class_maintenance, _("\
Show backtrace specific variables.\n\
Show backtrace variables such as the backtrace limit."),
- &show_backtrace_cmdlist, "show backtrace ",
- 0/*allow-unknown*/, &showlist);
+ &show_backtrace_cmdlist, "show backtrace ",
+ 0/*allow-unknown*/, &showlist);
add_setshow_uinteger_cmd ("limit", class_obscure,
&user_set_backtrace_options.backtrace_limit, _("\