Developers often find themselves in situations where the code they've written is not working quite right. When that happens, a developer debugs their code by instrumenting, executing and inspecting the code to determine what state of the application does not match the assumptions of how the code should be correctly running.
There are bugs in every modest sized or larger application. Every developer has to learn how to debug code in order to write programs that work as correctly as time and budget allow.
In addition to fixing bugs, debugging is an important skill for improving the efficiency of an application by optimizing performance and improving the logic. Debugging is a complex skill that takes time and practice for a developer to gain as a capability.
Some common debugging techniques include:
Printing out or displaying values of variables and state at certain times during the execution of an application
Changing the state of a program to make it do different things. This is called altering the "path" of the program
Stepping through the execution of a program line by line
Breakpoints
Trace Points
Stopping the program at certain events
Viewing the output of a program in a debugger window
There are many debugging tools, some of which are built into IDEs like PyCharm and others that are standalone applications. The following list contains mostly standalone tools that you can use in any development environment.
pdb is a debugger built into the Python standard library and is the one most developers come across first when trying to debug their programs.
Web-PDB provides a web-based user interface for pdb to make it easier to understand what is happening while inspecting your running code.
wdb uses WebSockets to allow you to debug running Python code from a web browser.
Pyflame (source code) is a profiling tool that generates flame graphs for executing Python program code.
objgraph (source code) uses graphviz to draw the connections between Python objects running in an application
pdb is the most commonly-used debugger for Python because it is built into the standard library. The following walkthroughs will show you how to use pdb while fixing your own code.
How to Use Pdb to Debug Your Code is a wonderful code-first tutorial on getting started with pdb.
pdb - Interactive Debugger is featured on the Python Module of the Week blog and has some great detail on using the program effectively.
pdb: Using the Python debugger in Django is a tutorial specific to working with pdb in Django projects.
Debugging your Python code walks through a scenario where pdb can be used to find a defect in a block of Python code.
pdb Tutorial is a code-heavy beginners tutorial for pdb.
Debugging in Python elaborates on what pdb does and how it can be used.
The Python ecosystem has a range of tools to help with debugging your code. These tutorials show you how to either use a tool other than pdb or provide an overview of the debugging ecosystem for Python.
Python debugging tools provides a list of tools such as pdb and its derivatives ipdb, pudb and pdb++ along with how they can be used in the hunt for defects.
Profiling Python web applications with visual tools details a configuration for visualizing code execution using KCachegrind.
My Startling Encounter With Python Debuggers along with the follow-up second post are a fantastic couple of posts that walk through a specific scenario of how a well-tested distributed web crawler failed and how tools like gdb, top and Winpdb were used to debug a multithreaded application.
Debugging Python like a boss covers several Python debuggers such as pudb, pydbgr and ipdb.
The case of the mysterious Python crash explains the symptoms that happened during a crash and what steps the author took to figure out what was going on.
The following resources are not specific to Python development but give solid programming language-agnostic debugging advice.
The art of debugging provides a whirlwind overview for how to fix issues in your code.
Linux debugging tools you'll love is an awesome comic that covers the Linux ecosystem for debugging.