Remote vanilla PDB (over TCP sockets) done right: no extras, proper handling around connection failures and CI. Based on pdbx.
- Free software: BSD 2-Clause License
pip install remote-pdb
To open a remote PDB on first available port:
from remote_pdb import set_trace set_trace() # you'll see the port number in the logs
To use some specific host/port:
from remote_pdb import RemotePdb RemotePdb('127.0.0.1', 4444).set_trace()
To connect just run
telnet 127.0.0.1 4444. When you are finished
debugging, either exit the debugger, or press Control-], then Control-d.
Alternately, one can connect with NetCat:
nc -C 127.0.0.1 4444 or Socat:
tcp:127.0.0.1:4444 (for line editing and history support). When finished debugging, either exit
the debugger, or press Control-c.
Note that newer Ubuntu disabled readline support in socat, so if you get
unknown device/address "readline" try using rlwrap like this:
rlwrap socat - tcp:127.0.0.1:4444
Using in containers
If you want to connect from the host to remote-pdb running inside the container you should make sure that:
- The port you will use is mapped (eg:
- The host is set to
localhost` or ``127.0.0.1will not work because Docker doesn't map the port on the local interface).
Integration with breakpoint() in Python 3.7+
If you are using Python 3.7 one can use the new
breakpoint() built in to invoke
remote PDB. In this case the following environment variable must be set:
The debugger can then be invoked as follows, without any imports:
breakpoint() function does not take any arguments, environment variables can be used to
specify the host and port that the server should listen to. For example, to run
script.py in such a
way as to make
telnet 127.0.0.1 4444 the correct way of connecting, one would run:
PYTHONBREAKPOINT=remote_pdb.set_trace REMOTE_PDB_HOST=127.0.0.1 REMOTE_PDB_PORT=4444 python script.py
REMOTE_PDB_HOST is omitted then a default value of 127.0.0.1 will be used. If
omitted then the first available port will be used. The connection information will be logged to the console,
as with calls to
To quiet the output, set
REMOTE_PDB_QUIET=1, this will prevent
RemotePdb from producing any output -- you'll probably want to specify
REMOTE_PDB_PORT as well since the randomized port won't be printed.
Note about OS X
In certain scenarios (backgrounded processes) OS X will prevent readline to be imported (and readline is a dependency of pdb). A workaround (run this early):
import signal signal.signal(signal.SIGTTOU, signal.SIG_IGN)
Python 2.6, 2.7, 3.2, 3.3 and PyPy are supported.