diff options
Diffstat (limited to 'gdb/frame.c')
-rw-r--r-- | gdb/frame.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/gdb/frame.c b/gdb/frame.c index ac1016b..a3599e8 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -53,6 +53,17 @@ 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; @@ -1843,6 +1854,8 @@ reinit_frame_cache (void) { struct frame_info *fi; + ++frame_cache_generation; + /* Tear down all frame caches. */ for (fi = sentinel_frame; fi != NULL; fi = fi->prev) { @@ -1922,6 +1935,8 @@ get_prev_frame_if_no_cycle (struct frame_info *this_frame) if (prev_frame->level == 0) return prev_frame; + unsigned int entry_generation = get_frame_cache_generation (); + try { compute_frame_id (prev_frame); @@ -1944,8 +1959,11 @@ get_prev_frame_if_no_cycle (struct frame_info *this_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; } |