This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: TUI + gdbserver broken?


Daniel Jacobowitz escreveu:
On Mon, Mar 19, 2007 at 10:57:53PM +0000, Pedro Alves wrote:
That has exactly the same effect as it was before the your select frame changes.
That is, only try to get the selected frame when there is one. Maybe there should
still be a function like this in frame.c ?

struct frame_info *
deprecated_get_selected_frame ()
{
return selected_frame;
}


Neither this, or your (level >= 0), worked - they both make tui enter some kind of loop, that I can't get a trace. Perhaps in some other host it would be easier (I'm on Cygwin). Bummer.

(or perhaps call it get_selected_frame_if_any)

The problem is that when we reinitialize the frame cache, the selected
frame is indeterminate - the selected_frame global may randomly be
initialized or NULL depending on what else has been called since we
last did reinit_frame_cache.

Maybe that has something to do with the hangs I see.


How about the attached?  Move the selected_frame creation logic
to select_frame.
It fixes both the remote debugging problem, and the repainting
problems - probably caused by the get_selected_frame calling
select_frame generating extra spurious events.

It would need a testsuite run and a bit of cleanup, since the
get_selected_frame would lose the parameter.

Cheers,
Pedro Alves


gdb/ChangeLog

	* frame.c (get_selected_frame): Move selected frame
	to current frame mapping to ...
	(select_frame): ... here.

---
 gdb/frame.c |   28 +++++++++++++++-------------
 1 file changed, 15 insertions(+), 13 deletions(-)

Index: src/gdb/frame.c
===================================================================
--- src.orig/gdb/frame.c	2007-03-18 23:22:10.000000000 +0000
+++ src/gdb/frame.c	2007-03-20 00:29:42.000000000 +0000
@@ -953,19 +953,6 @@ static struct frame_info *selected_frame
 struct frame_info *
 get_selected_frame (const char *message)
 {
-  if (selected_frame == NULL)
-    {
-      if (message != NULL && (!target_has_registers
-			      || !target_has_stack
-			      || !target_has_memory))
-	error (("%s"), message);
-      /* Hey!  Don't trust this.  It should really be re-finding the
-	 last selected frame of the currently selected thread.  This,
-	 though, is better than nothing.  */
-      select_frame (get_current_frame ());
-    }
-  /* There is always a frame.  */
-  gdb_assert (selected_frame != NULL);
   return selected_frame;
 }
 
@@ -994,6 +981,21 @@ select_frame (struct frame_info *fi)
   if (deprecated_selected_frame_level_changed_hook)
     deprecated_selected_frame_level_changed_hook (frame_relative_level (fi));
 
+  if (fi == NULL)
+    {
+      if (!target_has_registers
+	  || !target_has_stack
+	  || !target_has_memory)
+	return;
+
+      /* Hey!  Don't trust this.  It should really be re-finding the
+	 last selected frame of the currently selected thread.  This,
+	 though, is better than nothing.  */
+      selected_frame = get_current_frame ();
+    }
+  /* There is always a frame.  */
+  gdb_assert (selected_frame != NULL);
+
   /* FIXME: kseitz/2002-08-28: It would be nice to call
      selected_frame_level_changed_event() right here, but due to limitations
      in the current interfaces, we would end up flooding UIs with events


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]