Make it easier to attach the remote debugger.
authorNathan Binkert <binkertn@umich.edu>
Wed, 12 Oct 2005 17:45:21 +0000 (13:45 -0400)
committerNathan Binkert <binkertn@umich.edu>
Wed, 12 Oct 2005 17:45:21 +0000 (13:45 -0400)
base/remote_gdb.cc:
    Keep track of a vector of all of the usable debuggers and provide
    a current_debugger variable that can be set from gdb to specify
    which remote debugger is desired.
    If debugger() is called and the current_debugger is not attached,
    call accept on its listener so we can still attach a remote debugger
    from the gdb prompt if we had forgotten to before.
    Print out more information when the simulator starts so we can
    distinguish debuggers more easily.
base/remote_gdb.hh:
    Have a remote debugger instance keep track of its listener.
    Number the remote debuggers so it's easier to figure out which is which.

--HG--
extra : convert_revision : 97119597ac3772ea4df6da3b3a4827f50253a51f

base/remote_gdb.cc
base/remote_gdb.hh

index 3af73179a9bbab380cb13457c5905d8e0e9ca9b1..1f3a60bbf94430ee82b2f3b74c8be52707033605 100644 (file)
 using namespace std;
 
 #ifdef DEBUG
-RemoteGDB *theDebugger = NULL;
+vector<RemoteGDB *> debuggers;
+int current_debugger = -1;
 
 void
 debugger()
 {
-    if (theDebugger)
-        theDebugger->trap(ALPHA_KENTRY_IF);
+    if (current_debugger >= 0 && current_debugger < debuggers.size()) {
+        RemoteGDB *gdb = debuggers[current_debugger];
+        if (!gdb->isattached())
+            gdb->listener->accept();
+        if (gdb->isattached())
+            gdb->trap(ALPHA_KENTRY_IF);
+    }
 }
 #endif
 
@@ -161,7 +167,10 @@ GDBListener::Event::process(int revent)
 
 GDBListener::GDBListener(RemoteGDB *g, int p)
     : event(NULL), gdb(g), port(p)
-{}
+{
+    assert(!gdb->listener);
+    gdb->listener = this;
+}
 
 GDBListener::~GDBListener()
 {
@@ -183,9 +192,21 @@ GDBListener::listen()
         port++;
     }
 
-    cerr << "Listening for remote gdb connection on port " << port << endl;
     event = new Event(this, listener.getfd(), POLLIN);
     pollQueue.schedule(event);
+
+#ifdef DEBUG
+    gdb->number = debuggers.size();
+    debuggers.push_back(gdb);
+#endif
+
+#ifdef DEBUG
+    ccprintf(cerr, "%d: %s: listening for remote gdb #%d on port %d\n",
+             curTick, name(), gdb->number, port);
+#else
+    ccprintf(cerr, "%d: %s: listening for remote gdb on port %d\n",
+             curTick, name(), port);
+#endif
 }
 
 void
@@ -228,7 +249,8 @@ RemoteGDB::Event::process(int revent)
 }
 
 RemoteGDB::RemoteGDB(System *_system, ExecContext *c)
-    : event(NULL), fd(-1), active(false), attached(false),
+    : event(NULL), listener(NULL), number(-1), fd(-1),
+      active(false), attached(false),
       system(_system), pmem(_system->physmem), context(c)
 {
     memset(gdbregs, 0, sizeof(gdbregs));
@@ -260,9 +282,6 @@ RemoteGDB::attach(int f)
 
     attached = true;
     DPRINTFN("remote gdb attached\n");
-#ifdef DEBUG
-    theDebugger = this;
-#endif
 }
 
 void
index f9a220a5d01c66dc4cdf9762de13a0471fdf2a8d..652a58317d91b79665895b8f7984d6ddcab648cc 100644 (file)
@@ -40,8 +40,13 @@ class System;
 class ExecContext;
 class PhysicalMemory;
 
+class GDBListener;
 class RemoteGDB
 {
+  private:
+    friend void debugger();
+    friend class GDBListener;
+
   protected:
     class Event : public PollEvent
     {
@@ -55,6 +60,8 @@ class RemoteGDB
 
     friend class Event;
     Event *event;
+    GDBListener *listener;
+    int number;
 
   protected:
     int fd;