Python debugging instruments


In all programming workouts, it’s troublesome to go far and deep and not using a useful debugger. The built-in debugger, pdb, in Python is a mature and succesful one that may assist us lots if you know the way to make use of it. On this tutorial we’re going see what the pdb can do for you in addition to a few of its various.

On this tutorial you’ll study:

  • What can a debugger do
  • management a debugger
  • The limitation of Python’s pdb and its alternate options

Let’s get began.

Python debugging instruments
Photograph by Thomas Park. Some rights reserved.

Tutorial Overview

This tutorial is in 4 components, they’re

  • The idea of working a debugger
  • Stroll-through of utilizing a debugger
  • Debugger in Visible Studio Code
  • Utilizing GDB on a working Python program

The idea of working a debugger

The aim of a debugger is to offer you a gradual movement button to regulate the circulate of a program. It additionally assist you to freeze this system at sure level of time and study the state.

The best operation underneath a debugger is to step by the code. That’s to run one line of code at a time and wait on your acknowledgment earlier than continuing into subsequent. The explanation we wish to run this system in a stop-and-go vogue is to permit us to examine the logic and worth or confirm the algorithm.

For a bigger program, we could not wish to step by the code from the start as it might take a very long time earlier than we reached the road that we’re enthusiastic about. Subsequently, debuggers additionally present a breakpoint characteristic that may kick in when a particular line of code is reached. From that time onward, we are able to step by it line by line.

Stroll-through of utilizing a debugger

Let’s see how we are able to make use of a debugger with an instance. The next is the Python code for displaying particle swarm optimization in an animation:

The particle swarm optimization is completed by executing the replace() perform quite a lot of occasions. Every time it runs, we’re nearer to the optimum answer to the target perform. We’re utilizing matplotlib’s FuncAnimation() perform as a substitute of a loop to run replace(). So we are able to seize the place of the particles at every iteration.

Assume this program is saved as, to run this program in command line is solely to enter:

and the answer shall be print out to the display and the animation shall be saved as PSO.gif. But when we wish to run it with the Python debugger, we enter the next in command line:

The -m pdb half is to load the pdb module and let the module to execute the file for you. Whenever you run this command, you can be welcomed with the pdb immediate as follows:

On the immediate, you’ll be able to sort within the debugger instructions. To indicate the checklist of supported instructions, we are able to use h. And to indicate the element of the precise command (resembling checklist), we are able to use h checklist:

In the beginning of a debugger session, we begin with the primary line of this system. Usually a Python program would begin with a number of traces of import. We are able to use n to maneuver to the subsequent line, or s to step right into a perform:

In pdb, the road of code shall be printed earlier than the immediate. Often n command is what we would like because it executes that line of code and strikes the circulate on the similar degree with out drill down deeper. Once we are at a line that calls a perform (resembling line 11 of the above program, that runs z = f(x, y)) we are able to use s to step into the perform. Within the above instance, we first step into f() perform, then one other step to execute the computation, and at last, accumulate the return worth from the perform to provide it again to the road that invoked the perform. We see there are a number of s command wanted for a perform so simple as one line as a result of discovering the perform from the assertion, calling the perform, and return every takes one step. We are able to additionally see that within the physique of the perform, we known as np.sin() like a perform however the debugger’s s command doesn’t go into it. It’s as a result of the np.sin() perform isn’t applied in Python however in C. The pdb doesn’t help compiled code.

If this system is lengthy, it’s fairly boring to make use of the n command many occasions to maneuver to someplace we have an interest. We are able to use till command with a line quantity to let the debugger run this system till that line is reached:

A command much like till is return, which can execute the present perform till the purpose that it’s about to return. You possibly can take into account that as till with the road quantity equal to the final line of the present perform. The till command is one-off, which means it should convey you to that line solely. If you wish to cease at a specific line at any time when it’s being run, we are able to make a breakpoint on it. For instance, if we’re enthusiastic about how every iteration of the optimization algorithm strikes the answer, we are able to set a breakpoint proper after the replace is utilized:

After we set a breakpoint with the b command, we are able to let the debugger run our program till the breakpoint is hit. The c command means to proceed till a set off is met. At any level, we are able to use bt command to indicate the traceback to examine how we reached right here. We are able to additionally use the p command to print the variables (or an expression) to examine what worth they’re holding.

Certainly, we are able to place a breakpoint with a situation, so that it’ll cease provided that the situation is met. The beneath will impose a situation that the primary random quantity (r1) is larger than 0.5:

Certainly, we are able to additionally attempt to manipulate variables whereas we’re debugging.

Within the above, we use l command to checklist the code across the present assertion (recognized by the arrow ->). Within the itemizing, we are able to additionally see the breakpoint (marked with B) is about at line 40. As we are able to see the present worth of V and r1, we are able to modify r1 from 0.54 to 0.2 and run the assertion on V once more through the use of j (soar) to line 38. And as we see after we execute the assertion with n command, the worth of V is modified.

If we use a breakpoint and located one thing surprising, chances are high that it was brought on by points in a unique degree of the decision stack. Debuggers would assist you to navigate to totally different ranges:

Within the above, the primary bt command provides the decision stack once we are on the backside body, i.e., the deepest of the decision stack. We are able to see that we’re about to execute the assertion X = X + V. Then the up command strikes our focus to at least one degree up on the decision stack, which is the road working replace() perform (as we see on the line preceded with >). Since our focus is modified, the checklist command l will print a unique fragment of code and the p command can study a variable in a unique scope.

The above covers many of the helpful instructions within the debugger. If we wish to terminate the debugger (which additionally terminates this system), we are able to use the q command to give up or hit Ctrl-D in case your terminal helps.

Debugger in Visible Studio Code

If you’re not very comfy to run the debugger in command line, you’ll be able to depend on the debugger out of your IDE. Virtually all the time the IDE will present you some debugging facility. In Visible Studio Code for instance, you’ll be able to launch the debugger within the “Run” menu.

The display beneath exhibits Visible Studio Code at debugging session. The buttons on the heart high are correspond to pdb instructions proceed, subsequent, step, return, restart, and give up respectively. A breakpoint might be created by clicking on the road quantity, which a crimson dot shall be appeared to determine that. The bonus of utilizing an IDE is that the variables are proven instantly at every debugging step. We are able to additionally look ahead to an categorical and present the decision stack. These are at left aspect of the display beneath.

Utilizing GDB on a working Python program

The pdb from Python is appropriate just for packages working from scratch. If we have now a program already working however caught, we can’t use pdb to hook into it to examine what’s happening. The Python extension from GDB, nonetheless, can do that.

To reveal, let’s take into account a GUI utility. It should wait till consumer’s motion earlier than this system can finish. Therefore it’s a excellent instance to see how we are able to use gdb to hook right into a working course of. The code beneath is a “howdy world” program utilizing PyQt5 that simply create an empty window and ready for consumer to shut it:

Let’s save this program as and run it utilizing the next in Linux underneath X window atmosphere:

The ultimate & will make it run in background. Now we are able to examine for its course of ID utilizing the ps command:

The ps command will inform you the method ID on the first column. You probably have gdb put in with python extension, we are able to run

and it’ll convey you into the GDB’s immediate:

GDB is meant to be a debugger for compiled packages (normally from C or C++). The Python extension lets you examine the code (written in Python) being run by the Python interpreter (which is written in C). It’s much less feature-rich than the Python’s pdb when it comes to dealing with Python code however helpful while you wish to have to hook right into a working course of.

The command supported underneath GDB are py-list, py-bt, py-up, py-down, and py-print. They’re akin to the identical instructions in pdb with out the py- prefix.

GDB is beneficial in case your Python code makes use of a library that’s compiled from C (resembling numpy) and wish to examine how the it runs. Additionally it is helpful to study why your program is frozen by checking the decision stack in run time. Nonetheless, it might be not often the case that it’s good to use GDB to debug your machine studying challenge.

Additional Readings

The Python pdb module’s doc is at

However pdb isn’t the one debugger out there. Some third-party instruments are listed in:

For GDB with Python extension, it’s most mature for use in Linux atmosphere. Please see the next for extra particulars on its utilization:

The command interface of pdb is influenced by that of GDB. Therefore we are able to study the strategy of debugging a program basically from the latter. A great primer on find out how to use a debugger can be


On this tutorial, you found the options of Python’s pdb

Particularly, you discovered:

  • What can pdb do and find out how to use it
  • The limitation and alternate options of pdb

Within the subsequent publish, we’ll see that pdb can also be a Python perform that may be known as inside a Python program.