Python Code Debugging: A Comprehensive Guide to Step-by-Step Debugging with pdb

Nov 19, 2025 · Programming · 10 views · 7.8

Keywords: Python debugging | pdb debugger | code debugging techniques

Abstract: This article provides a detailed guide to using Python's pdb debugger, covering command-line startup, essential debugging commands, and IDE integration. Through practical code examples, it demonstrates key debugging techniques including breakpoint setting, step execution, and variable inspection to help developers quickly identify and resolve issues in Python code.

Overview of Python Debugger pdb

The Python standard library includes a built-in debugger called pdb (Python Debugger), which allows developers to debug Python programs interactively. Similar to debugging experiences in languages like Java and C#, pdb supports core debugging features such as setting breakpoints, step-by-step execution, and variable value inspection.

Starting the pdb Debugger

There are several ways to start the pdb debugger, depending on the development scenario:

Starting from Command Line

The most straightforward method is to launch pdb from the command line:

python -m pdb myscript.py

After executing this command, the program pauses at the first executable line and enters interactive debugging mode.

Embedding Debugger in Code

For large projects or when debugging at specific locations is needed, you can embed the debugger directly in the code:

import pdb

class MyClass:
    def __init__(self, value):
        self.value = value
    
    def process_data(self):
        for i in range(self.value):
            pdb.set_trace()  # Set breakpoint here
            result = i * 2
            print(f"Result: {result}")

if __name__ == "__main__":
    obj = MyClass(5)
    obj.process_data()

Essential Debugging Commands

pdb provides a series of debugging commands. Here are detailed explanations of the core commands:

Breakpoint Management

The b command is used to set breakpoints, which can be specified by line number, function name, or file location:

(Pdb) b 10              # Set breakpoint at line 10 of current file
(Pdb) b MyClass.process_data  # Set breakpoint at function entry
(Pdb) b myscript.py:15  # Set breakpoint at specific file and line

Execution Control

Commands for controlling program execution include:

(Pdb) c                 # Continue execution until next breakpoint
(Pdb) n                 # Execute next line of code
(Pdb) s                 # Step into function call
(Pdb) r                 # Run until current function returns

Code Inspection

The l command displays source code around the current execution position:

(Pdb) l                 # Show 11 lines around current line
(Pdb) l 5, 15          # Show lines 5 to 15

Variable Inspection

The p command is used to print variable values:

(Pdb) p variable_name   # Print variable value
(Pdb) p locals()        # View all local variables
(Pdb) p globals()       # View global variables

Call Stack Navigation

When debugging multi-layer function calls, use stack navigation commands:

(Pdb) u                 # Move up the call stack
(Pdb) d                 # Move down the call stack
(Pdb) w                 # Display complete call stack information

IDE Integrated Debugging Tools

In addition to command-line tools, many Python IDEs provide graphical debugging interfaces:

PyCharm Debugging Features

PyCharm Community Edition offers complete debugging support, including:

Visual Studio Code Debugging

VS Code provides debugging support through Python extensions:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal"
        }
    ]
}

Advanced Debugging Techniques

Conditional Breakpoints

Set breakpoints that trigger only under specific conditions:

(Pdb) b 20, i > 3       # Break at line 20 when i is greater than 3

Variable Modification

Modify variable values during debugging:

(Pdb) !variable_name = "new_value"  # Modify variable value

Command Aliases

Create aliases for frequently used commands:

(Pdb) alias pl p locals()  # Create alias for viewing local variables

Debugging Practice Examples

Debugging Recursive Functions

The following example demonstrates how to debug recursive functions:

def factorial(n):
    import pdb
    pdb.set_trace()
    if n <= 1:
        return 1
    else:
        return n * factorial(n-1)

result = factorial(5)
print(f"Factorial of 5 is: {result}")

Debugging Exception Handling

Set breakpoints at exception occurrence points:

def divide_numbers(a, b):
    try:
        result = a / b
        return result
    except ZeroDivisionError:
        import pdb
        pdb.set_trace()  # Debug within exception handling
        return "Division by zero is not allowed"

print(divide_numbers(10, 0))

Debugging Best Practices

Systematic Debugging Approach

Effective debugging should follow a systematic approach:

  1. Reproduce the problem: Ensure the bug can be consistently reproduced
  2. Locate the issue: Use breakpoints to narrow down the problem scope
  3. Analyze the cause: Check variable states and program flow
  4. Verify the fix: Confirm that the modification resolves the issue

Performance Considerations in Debugging

In performance-sensitive scenarios:

Conclusion

Python's pdb debugger provides powerful code debugging capabilities. By mastering core debugging commands and techniques, developers can efficiently locate and fix code issues. Combined with modern IDE graphical debugging tools, the Python debugging experience is now comparable to that of languages like Java and C#. Whether for simple script debugging or complex project development, pdb is an essential tool for every Python developer.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.