r47182 - sandbox/trunk/pdb/mconnection.py sandbox/trunk/pdb/mpdb.py
![](https://secure.gravatar.com/avatar/8ac615df352a970211b0e3d94a307c6d.jpg?s=120&d=mm&r=g)
Author: matt.fleming Date: Fri Jun 30 22:12:21 2006 New Revision: 47182 Modified: sandbox/trunk/pdb/mconnection.py sandbox/trunk/pdb/mpdb.py Log: Allow mpdb to use pydb's restart command, both locally and remotely. Modified: sandbox/trunk/pdb/mconnection.py ============================================================================== --- sandbox/trunk/pdb/mconnection.py (original) +++ sandbox/trunk/pdb/mconnection.py Fri Jun 30 22:12:21 2006 @@ -126,7 +126,7 @@ def disconnect(self): if self.output is None or self._sock is None: return - self.output.close() + self.output.shutdown(socket.SHUT_RDWR) self._sock.close() self._sock = None self.listening = False Modified: sandbox/trunk/pdb/mpdb.py ============================================================================== --- sandbox/trunk/pdb/mpdb.py (original) +++ sandbox/trunk/pdb/mpdb.py Fri Jun 30 22:12:21 2006 @@ -111,7 +111,8 @@ ret = self.connection.readline() if ret == '': self.errmsg('Connection closed unexpectedly') - raise Exit + self.onecmd = lambda x: pydb.Pdb.onecmd(self, x) + self.do_rquit(None) # The output from the command that we've just sent to the server # is returned along with the prompt of that server. So we keep reading # until we find our prompt. @@ -121,14 +122,34 @@ # We're probably _never_ going to get that data and that # connection is probably dead. self.errmsg('Connection died unexpectedly') - raise Exit + self.onecmd = lambda x: pydb.Pdb.onecmd(self, x) + self.do_rquit(None) else: ret += self.connection.readline() i += 1 + + # Some 'special' actions must be taken depending on the data returned + if 'restart_now' in ret: + self.connection.write('ACK:restart_now') + self.errmsg('Pdbserver restarting..') + # We've acknowledged a restart, which means that a new pdbserver + # process is started, so we have to connect all over again. + self._disconnect() + time.sleep(3.0) + self.do_target(self.target_addr) + return self.msg_nocr(ret) self.lastcmd = line return + def _disconnect(self): + """ Disconnect a connection. """ + self.connection.disconnect() + self.connection = None + self.target = 'local' + if hasattr(self, 'local_prompt'): + self.prompt = self.local_prompt + def msg_nocr(self, msg, out=None): """Common routine for reporting messages. Derived classes may want to override this to capture output. @@ -248,7 +269,7 @@ return if self.target == 'remote': self.errmsg('Already connected to a remote machine.') - return + return if target == 'tcp': # TODO: need to save state of current debug session if self.connection: self.connection.disconnect() @@ -301,6 +322,7 @@ # in remote_onecmd, because it may be different to this client's. self.local_prompt = self.prompt self.prompt = "" + self.target_addr = target + " " + addr line = self.connection.readline() if line == '': self.errmsg('Connection closed unexpectedly') @@ -382,6 +404,7 @@ except ConnectionFailed, err: self.errmsg("Failed to connect to %s: (%s)" % (comm, err)) return + self.pdbserver_addr = comm self.target = 'remote' self._rebind_input(self.connection) self._rebind_output(self.connection) @@ -395,15 +418,33 @@ return self._rebind_output(self.orig_stdout) self._rebind_input(self.orig_stdin) - if self.connection != None: - self.connection.disconnect() - if hasattr(self, 'local_prompt'): - self.prompt = self.local_prompt - self.msg('Exiting remote debugging...') + self._disconnect() self.target = 'local' self.do_quit(None) raise Exit + def do_restart(self, arg): + """ Extend pydb.do_restart to signal to any clients connected on + a debugger's connection that this debugger is going to be restarted. + All state is lost, and a new copy of the debugger is used. + """ + # We don't proceed with the restart until the action has been + # ACK'd by any connected clients + if self.connection != None: + self.msg('restart_now\n(MPdb)') + line = "" + while not 'ACK:restart_now' in line: + line = self.connection.readline() + try: + self.do_rquit(None) + except Exit: + pass + else: + self.msg("Re exec'ing\n\t%s" % self._sys_argv) + os.execvp(self._sys_argv[0], self._sys_argv) + + + def do_thread(self, arg): """Use this command to switch between threads. The new thread ID must be currently known.
![](https://secure.gravatar.com/avatar/e6facc7b962c35bc84dd526698529a6b.jpg?s=120&d=mm&r=g)
Note: you probably shouldn't be calling shutdown(), but there is a bug in 2.5 where this is currently required. n -- On 6/30/06, matt.fleming <python-checkins@python.org> wrote:
Author: matt.fleming Date: Fri Jun 30 22:12:21 2006 New Revision: 47182
Modified: sandbox/trunk/pdb/mconnection.py sandbox/trunk/pdb/mpdb.py Log: Allow mpdb to use pydb's restart command, both locally and remotely.
Modified: sandbox/trunk/pdb/mconnection.py ============================================================================== --- sandbox/trunk/pdb/mconnection.py (original) +++ sandbox/trunk/pdb/mconnection.py Fri Jun 30 22:12:21 2006 @@ -126,7 +126,7 @@ def disconnect(self): if self.output is None or self._sock is None: return - self.output.close() + self.output.shutdown(socket.SHUT_RDWR) self._sock.close() self._sock = None self.listening = False
Modified: sandbox/trunk/pdb/mpdb.py ============================================================================== --- sandbox/trunk/pdb/mpdb.py (original) +++ sandbox/trunk/pdb/mpdb.py Fri Jun 30 22:12:21 2006 @@ -111,7 +111,8 @@ ret = self.connection.readline() if ret == '': self.errmsg('Connection closed unexpectedly') - raise Exit + self.onecmd = lambda x: pydb.Pdb.onecmd(self, x) + self.do_rquit(None) # The output from the command that we've just sent to the server # is returned along with the prompt of that server. So we keep reading # until we find our prompt. @@ -121,14 +122,34 @@ # We're probably _never_ going to get that data and that # connection is probably dead. self.errmsg('Connection died unexpectedly') - raise Exit + self.onecmd = lambda x: pydb.Pdb.onecmd(self, x) + self.do_rquit(None) else: ret += self.connection.readline() i += 1 + + # Some 'special' actions must be taken depending on the data returned + if 'restart_now' in ret: + self.connection.write('ACK:restart_now') + self.errmsg('Pdbserver restarting..') + # We've acknowledged a restart, which means that a new pdbserver + # process is started, so we have to connect all over again. + self._disconnect() + time.sleep(3.0) + self.do_target(self.target_addr) + return self.msg_nocr(ret) self.lastcmd = line return
+ def _disconnect(self): + """ Disconnect a connection. """ + self.connection.disconnect() + self.connection = None + self.target = 'local' + if hasattr(self, 'local_prompt'): + self.prompt = self.local_prompt + def msg_nocr(self, msg, out=None): """Common routine for reporting messages. Derived classes may want to override this to capture output. @@ -248,7 +269,7 @@ return if self.target == 'remote': self.errmsg('Already connected to a remote machine.') - return + return if target == 'tcp': # TODO: need to save state of current debug session if self.connection: self.connection.disconnect() @@ -301,6 +322,7 @@ # in remote_onecmd, because it may be different to this client's. self.local_prompt = self.prompt self.prompt = "" + self.target_addr = target + " " + addr line = self.connection.readline() if line == '': self.errmsg('Connection closed unexpectedly') @@ -382,6 +404,7 @@ except ConnectionFailed, err: self.errmsg("Failed to connect to %s: (%s)" % (comm, err)) return + self.pdbserver_addr = comm self.target = 'remote' self._rebind_input(self.connection) self._rebind_output(self.connection) @@ -395,15 +418,33 @@ return self._rebind_output(self.orig_stdout) self._rebind_input(self.orig_stdin) - if self.connection != None: - self.connection.disconnect() - if hasattr(self, 'local_prompt'): - self.prompt = self.local_prompt - self.msg('Exiting remote debugging...') + self._disconnect() self.target = 'local' self.do_quit(None) raise Exit
+ def do_restart(self, arg): + """ Extend pydb.do_restart to signal to any clients connected on + a debugger's connection that this debugger is going to be restarted. + All state is lost, and a new copy of the debugger is used. + """ + # We don't proceed with the restart until the action has been + # ACK'd by any connected clients + if self.connection != None: + self.msg('restart_now\n(MPdb)') + line = "" + while not 'ACK:restart_now' in line: + line = self.connection.readline() + try: + self.do_rquit(None) + except Exit: + pass + else: + self.msg("Re exec'ing\n\t%s" % self._sys_argv) + os.execvp(self._sys_argv[0], self._sys_argv) + + + def do_thread(self, arg): """Use this command to switch between threads. The new thread ID must be currently known. _______________________________________________ Python-checkins mailing list Python-checkins@python.org http://mail.python.org/mailman/listinfo/python-checkins
participants (2)
-
matt.fleming
-
Neal Norwitz