Skip to content

Instantly share code, notes, and snippets.

@donkey-hotei
Created March 30, 2016 14:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save donkey-hotei/ed01e4f54e1a6fa345d206f751a4f2f9 to your computer and use it in GitHub Desktop.
Save donkey-hotei/ed01e4f54e1a6fa345d206f751a4f2f9 to your computer and use it in GitHub Desktop.
import errno, os, socket, sys
#
# Debug python progams over network with TCP sockets.
#
#
_dbg = _socket = None
class Socket(object):
def __init__(self, socket):
self._socket = socket
self._buf = ''
def write(self, data):
self._socket.send(data)
def readline(self):
recv = self._socket.recv
data = self._buf
while True:
i = 1 + data.find('\n')
if i:
self._buf = data[i:]
return data[:i]
try:
d = recv(4096)
except socket.error, e:
if e.errno != errno.EINTR:
raise
else:
data += d
if not d:
self._buf = ''
return data
def flush(self): pass
def closed(self):
self._socket.setblocking(0)
try:
self._socket.recv(0)
except socket.error, (err, _):
if err != errno.EAGAIN:
raise
self._socket.setblocking(1)
return False
self._socket.close()
return True
# pdb to direct stdin/out via open TCP socket
def pdb(frame=None):
global _dbg, _socket
if _dbg is None or _socket.closed():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('127.0.0.1', 0))
s.listen(0)
_socket = Socket(s.accept()[0])
finally:
s.close()
import pdb
_dbg = pdb.Pdb(stdin=_socket, stdout=_socket)
elif _dbg.lastcmd != 'c':
return
if frame is None:
frame = sys._getframe(1)
_dbg.set_trace(frame)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment