diff options
author | Tom Tromey <tromey@redhat.com> | 2011-03-09 14:22:06 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2011-03-09 14:22:06 +0000 |
commit | 029fb512f2fd983b7084a7278d2b1a3ff35c054e (patch) | |
tree | ac84f82d5312240924145b8ce0e2b19eba1b6714 | |
parent | 142db50201b1b1c69ebdc2dcdb1181cde1db3b08 (diff) | |
download | gdb-029fb512f2fd983b7084a7278d2b1a3ff35c054e.tar.gz |
* thread.c (restore_selected_frame): Handle frame_level == -1.
(make_cleanup_restore_current_thread): Use
get_selected_frame_if_set.
* frame.h (get_selected_frame_if_set): Declare.
* frame.c (get_selected_frame_if_set): New function.
-rw-r--r-- | gdb/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/frame.c | 8 | ||||
-rw-r--r-- | gdb/frame.h | 3 | ||||
-rw-r--r-- | gdb/thread.c | 16 |
4 files changed, 34 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3a26f18e0d6..ddb885df391 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2011-03-09 Tom Tromey <tromey@redhat.com> + + * thread.c (restore_selected_frame): Handle frame_level == -1. + (make_cleanup_restore_current_thread): Use + get_selected_frame_if_set. + * frame.h (get_selected_frame_if_set): Declare. + * frame.c (get_selected_frame_if_set): New function. + 2011-03-09 Pedro Alves <pedro@codesourcery.com> * cli/cli-cmds.c (shell_escape): Use lbasename. diff --git a/gdb/frame.c b/gdb/frame.c index 36fcefe6f7b..bf3ce77ba7e 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -1247,6 +1247,14 @@ get_selected_frame (const char *message) return selected_frame; } +/* If there is a selected frame, return it. Otherwise, return NULL. */ + +struct frame_info * +get_selected_frame_if_set (void) +{ + return selected_frame; +} + /* This is a variant of get_selected_frame() which can be called when the inferior does not have a frame; in that case it will return NULL instead of calling error(). */ diff --git a/gdb/frame.h b/gdb/frame.h index 2c5276e0fa6..252b75e0539 100644 --- a/gdb/frame.h +++ b/gdb/frame.h @@ -260,6 +260,9 @@ extern void reinit_frame_cache (void); and then return that thread's previously selected frame. */ extern struct frame_info *get_selected_frame (const char *message); +/* If there is a selected frame, return it. Otherwise, return NULL. */ +extern struct frame_info *get_selected_frame_if_set (void); + /* Select a specific frame. NULL, apparently implies re-select the inner most frame. */ extern void select_frame (struct frame_info *); diff --git a/gdb/thread.c b/gdb/thread.c index 7d8f6da353b..b48909f1e48 100644 --- a/gdb/thread.c +++ b/gdb/thread.c @@ -1019,6 +1019,13 @@ restore_selected_frame (struct frame_id a_frame_id, int frame_level) struct frame_info *frame = NULL; int count; + /* This means there was no selected frame. */ + if (frame_level == -1) + { + select_frame (NULL); + return; + } + gdb_assert (frame_level >= 0); /* Restore by level first, check if the frame id is the same as @@ -1137,7 +1144,14 @@ make_cleanup_restore_current_thread (void) && target_has_registers && target_has_stack && target_has_memory) - frame = get_selected_frame (NULL); + { + /* When processing internal events, there might not be a + selected frame. If we naively call get_selected_frame + here, then we can end up reading debuginfo for the + current frame, but we don't generally need the debuginfo + at this point. */ + frame = get_selected_frame_if_set (); + } else frame = NULL; |