# Debugging Tools Baserow development dependencies include some useful tools for debugging that you can use. ## snoop [snoop](https://github.com/alexmojaki/snoop) is a powerful set of Python debugging tools. ### Automatic tracing One of the common things to do is to use the `@snoop` decorator or the `snoop` context manager to trace the execution of a piece of Python code and show how variable values change over time: ```python @snoop def test(): for i in range(5): a = i*2 # or with snoop: for i in range(5): a = i*2 ``` The depth can be controlled with `depth` parameter, e.g. `@snoop(depth=2)` for tracing functions that go deep. Objects and dictionaries can be expanded automatically to show all their items or attributes using the `watch_explode` parameter taking a list of watched variable names: ```python @snoop(watch_explode=['d']) def test(): d = {'key1': 0, 'key2': 1} for i in range(5): d["key1"] += 1 ``` ### Pretty printing Besides automatic tracing, variables can be pretty printed manually with `pp` function: ```python d = {'key1': 0, 'key2': 1} pp(d) ``` Note that `import snoop` or `from snoop import pp` is not necessary as snoop is installed and available automatically. ## django-extensions [django-extensions](https://github.com/django-extensions/django-extensions) is available to provide a variety of features like a shell with auto-imported Django models or a command to list all registered urls. You can use django-extensions commands inside backend docker containers: * `django-admin shell_plus` starts an interactive Python shell with loaded Django contexts and imported models. * `django-admin show_urls` lists all registered urls in the Baserow. ## django-silk [django-silk](https://github.com/jazzband/django-silk) is a live profiling and inspection tool for executed requests and database queries. The interface can be accessed at http://localhost:8000/silk/ after Baserow is started in the debug mode. Every request is logged and can be analyzed, including the list of performed database queries. django-silk can be also configured and used for profiling using the Python's built-in profiler, see the official documentation for details.