Skip to content

debuglib ​

PyPI-Version


Library README scraped 2024-03-11

debuglib-py ​

python debugger tool with easy integration into any program

To install the development version use:
pip3 install git+https://github.com/utility-libraries/debuglib-py.git@dev#egg=debuglib[all]

Installation ​

PyPI - Version

bash
pip install debuglib
pip install debuglib[all]  # recommended
extradescriptionclient/server
debuglib[dev]better exceptions printingclient
debuglib[orjson]for faster packing/unpackingclient/server
debuglib[cli]required to run the CLI Debuggerserver
debuglib[all]installs all of the ones above-

Note: It's recommended to install all for the best debugging experience

Why are there extras? ​

There are two reasons why some dependencies are marked as extra.

1. Separation between script/program and debugger ​

Some dependencies are only used for the client/script and some are only used by the debugger (CLI). In case you have different environments for both the dependencies work over extras

2. To not overload the environment ​

The more dependencies your project has the likelier it is that version-conflicts arise or that your project gets to big. debuglib tries to avoid that by requiring as few dependencies as possible but offers support for various packages for a better debugging experience.

Examples ​

Note: there is no need for a server to run/exist. That way you don't have to change anything when going into production but would still have the option to monitor when errors occur.

1: logging ​

code.py

python
import logging
from debuglib.logging import BlockingDebugHandler

logging.basicConfig(
    level=logging.DEBUG,
    handlers=[BlockingDebugHandler()],
    # the following is also possible for tiny performance boost
    # handlers=[logging.NullHandler() if prod else BlockingDebugHandler()],
)

logging.info("Hello World")
try:
    num = "Hi"
    print(int(num))
except ValueError as error:
    logging.error("failed to convert to integer", exc_info=error)
bash
$ debuglib listen  # and start code.py in another terminal
New Connection from 127.0.0.1 (localhost)
23:48:42.183558 | 127.0.0.1 | INFO | Hello World
23:48:42.184598 | 127.0.0.1 | ERROR | failed to convert to integer
--------------------------------------------------------------------------------
  File "/home/<user>/code.py", line 12, in <module>
    print(int(num))
              └ 'Hi'

ValueError: invalid literal for int() with base 10: 'Hi'
================================================================================
Connection closed from 127.0.0.1 (localhost)

2: function monitoring ​

code.py

python
from debuglib.decorator import Decorator as DebugDecorator
# from debuglib.decorator import monitor  # shorthand if you only use it once

# better performance than the single `monitor` decorator as everything 
# registered with debugger.monitor() shares the same connection
debugger = DebugDecorator()

@debugger.monitor()
def my_function(name: str = "World"):
    print(f"Hello {name}")

my_function()
my_function("debuglib")
my_function(name="debuglib")
bash
$ debuglib listen  # and start code.py in another terminal
Listening on localhost:35353
New Connection from 127.0.0.1:43998 (localhost)
15:09:23.947665 | 127.0.0.1:43998 | INF | __main__.my_function() returned None after 6μs+803ns
15:09:23.947693 | 127.0.0.1:43998 | INF | __main__.my_function('debuglib') returned None after 2μs+234ns
15:09:23.947714 | 127.0.0.1:43998 | INF | __main__.my_function(name='debuglib') returned None after 2μs+405ns
Connection closed from 127.0.0.1:43998 (localhost)

crash-hook ​

in case your program crashes, and you want to know the reason, you can install the custom excepthook

with the shortcut

python
import debuglib.hook.install  # noqa
...

or the alternative/manual installation

python
import debuglib.hook
...
debuglib.hook.hook()
bash
$ debuglib listen  # and start code.py in another terminal
New Connection from 127.0.0.1:41302 (localhost)
15:09:23.528303 | 127.0.0.1:41302 | ERR | sys.excepthook
  File "/home/<user>/script.py", line 6, in <module>
    raise RuntimeError("testing error")

RuntimeError: testing error
--------------------------------------------------------------------------------
Connection closed from 127.0.0.1:41302 (localhost)