[Python-checkins] r47182 - sandbox/trunk/pdb/mconnection.py sandbox/trunk/pdb/mpdb.py
Neal Norwitz
nnorwitz at gmail.com
Fri Jun 30 22:45:30 CEST 2006
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 at 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 at python.org
> http://mail.python.org/mailman/listinfo/python-checkins
>
More information about the Python-checkins
mailing list