Skip to main content

zc.monitor plugin to debug running processes

Project description

zc.montorpdb is a small plugin for the (very) lightweight zc.monitor system. It allows a user to telnet to a monitor port and invoke a Python debugger (PDB) prompt.

To use it, one must first register the command so zc.monitor is aware of it.

>>> import zc.monitorpdb
>>> import zope.component
>>> import zc.monitor.interfaces
>>> zope.component.provideUtility(zc.monitorpdb.command,
...     zc.monitor.interfaces.IMonitorPlugin, 'pdb')

Since zc.monitor is implemented with zc.ngi, we can use zc.ngi’s testing helpers.

>>> import zc.ngi.testing
>>> connection = zc.ngi.testing.TextConnection()
>>> server = zc.monitor.Server(connection)

If we invoke the command, we’ll get the appropriate prompt.

>>> connection.test_input('pdb\n')
(Pdb)

Now we can do normal pdb things like list the code being executed.

>>> connection.test_input('l\n')
 34             global fakeout
 35
 36             fakeout = FakeStdout(connection.connection)
 37             debugger = pdb.Pdb(stdin=None, stdout=fakeout)
 38             debugger.reset()
 39  ->         debugger.setup(sys._getframe(), None)
 40
 41
 42         def command(connection, *args):
 43             global debugger
 44             global fakeout
(Pdb)

As well as go “up” in the function call stack.

>>> connection.test_input('u\n')
>   /graphted-storage/workspace/zc.monitorpdb/src/zc/monitorpdb/__init__.py(48)command()
-> reset(connection)
(Pdb)

There is a “reset” command that gives us a fresh debugger (just in case something bad happend to ours and we don’t want to restart the host process). Here we go from the current location being one thing (the result of the previous “u” command) to another.

>>> connection.test_input('l\n')
 57                 return zc.monitor.QUIT_MARKER
 58             else:
 59                 debugger.onecmd(' '.join(args))
 60
 61             connection.write(debugger.prompt)
 62  ->         return zc.monitor.MORE_MARKER
[EOF]
(Pdb)
>>> connection.test_input('reset\n')
(Pdb)
>>> connection.test_input('l\n')
 34             global fakeout
 35
 36             fakeout = FakeStdout(connection.connection)
 37             debugger = pdb.Pdb(stdin=None, stdout=fakeout)
 38             debugger.reset()
 39  ->         debugger.setup(sys._getframe(), None)
 40
 41
 42         def command(connection, *args):
 43             global debugger
 44             global fakeout
(Pdb)

Some features don’t work, however.

>>> connection.test_input('debug 1+1\n')
the "debug" command is not supported
(Pdb)

Once we’re done, we ask to be let go.

>>> connection.test_input('quit\n')
-> CLOSE

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

zc.monitorpdb-1.0.0.tar.gz (3.6 kB view details)

Uploaded Source

File details

Details for the file zc.monitorpdb-1.0.0.tar.gz.

File metadata

File hashes

Hashes for zc.monitorpdb-1.0.0.tar.gz
Algorithm Hash digest
SHA256 5ca84dd05e30cf8485c922526442cf701fee9e67349dd469efdd85040d9f6a55
MD5 6fa47b2283cfe09d4ad9c9efbb3cf386
BLAKE2b-256 8fe993db80c1bcdcf849e5aa0e6781c68ad85f4411416badf743593f26d80896

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page