PyCharm 2017.2 Help

Step 2. Debugging Your First Python Application

Finding out the origin of the problem

Remember, in the previous tutorial you've created and run the Car script? Let’s play a little more with it.

Let's see what happens when we start our script up, and try to find out our average speed:

/help/img/idea/2017.2/py_run_error.png

Oops... PyCharm reports a run-time error: a ZeroDivisionError.

Let’s dig a little deeper into our code to find out what’s going wrong. We can use the PyCharm debugger to see exactly what’s happening in our code. To start debugging, you have to set some breakpoints first. To create breakpoints, just click in the left gutter:

Next, click the /help/img/idea/2017.2/run_from_left_gutter_icon.png icon in the left gutter, next to the main clause, and choose Debug 'Car'. PyCharm starts a debugging session and shows the Debug tool window.

/help/img/idea/2017.2/py_debugToolWindow.png

In the Console tab, enter S:

/help/img/idea/2017.2/py_debugToolWindow1.png

As you see, the breakpoint marker became blue. It means that we've reached the breakpoint; note that the highlighted line of code hasn't yet been executed at this point.

Click the /help/img/idea/2017.2/debug_resume.png button to resume the script execution. Now lo and behold! The exception is here. Another breakpoint appeared as well: by default PyCharm will halt for any exception that wasn't caught in your code, and it'll show an icon of a breakpoint with a lightning bolt. If you're interested in all types of breakpoints supported by PyCharm, see the table of breakpoint signs.

/help/img/idea/2017.2/py_debugToolWindow2.png

The Console also shows the error message. So we’ve found our problem. You can also see in the debugger, that the value self.time is equal to zero:

/help/img/idea/2017.2/py_debugToolWindow3.png

Surrounding code

To avoid running into the same problem again, let's add an if statement to check whether the time equals zero. To do that, select the statement return self.odometer / self.time in the method average_speed and then press Ctrl+Alt+T (Code | Surround with):

/help/img/idea/2017.2/py_surround.png

PyCharm creates a stub if construct, leaving you with the task of filling it with the proper contents.

After editing, we get the following:

/help/img/idea/2017.2/py_surround_result.png

Let's take a closer look to see how the debugger can show your what your code is doing.

Debugging in detail

The Debug tool window shows dedicated panes for frames, variables, and watches, and the console, where all the input and output information is displayed. If you want the console to be always visible, you can drag it to one of the PyCharm window's edges.

Stepping

If you want to see what your code does line by line, there's no need to put a breakpoint on every line, you can step through your code.

Let's see what it looks like to step through our example program: click the /help/img/idea/2017.2/debug_resume.png button, go to the Console to ask for the car's average speed (type 'S'), and we can see that we hit our breakpoint.

We can use the stepping toolbar buttons to choose on which line we'd like to stop next.

/help/img/idea/2017.2/py_stepping_toolbar.png

For example, click the Step Over button (/help/img/idea/2017.2/frames_step_over.png) and see the blue marker moving to the next line of code:

/help/img/idea/2017.2/py_debugging1_step_over.png

If you click the Step Into button (/help/img/idea/2017.2/frames_step_into.png), you will see that after the line action = input("What should I do? [A]ccelerate, [B]rake, " "show [O]dometer, or show average [S]peed?").upper() the debugger goes into the file parse.py:

/help/img/idea/2017.2/py_debugging1_step_into.png

However, if you continue using /help/img/idea/2017.2/frames_step_over.png, you'll see that your application just passes to the next loop:

/help/img/idea/2017.2/py_debugging1_next_input.png

If you want to concentrate on your own code, use the Step Into My Code button (/help/img/idea/2017.2/step_into_my_code.png) - thus you'll avoid stepping into library classes.

See the Stepping toolbar and Stepping Through the Program sections for details.

Watching

PyCharm allows you to watch any variable. Just click /help/img/idea/2017.2/new-watch.png on the toolbar of the Variables tab, and type the name of the variable you want to watch - let it be self.time. Note that code completion is available here:

/help/img/idea/2017.2/py_debugging1_watch_completion.png

At first, you see an error - it means that the variable is not yet defined:

/help/img/idea/2017.2/py_debugging1_watch_error.png

However, when the program execution continues to the scope that defines the variable, the watch gets the following view:

/help/img/idea/2017.2/py_debugging1_watch_normal.png

See Adding, Editing and Removing Watches section for details.

Inline debugging

You may have noticed another PyCharm feature that makes it easy to see what your code is doing: the inline debugger. As soon as you hit any breakpoint, PyCharm shows you the value of many of your variables right in the editor:

/help/img/idea/2017.2/py_debugging.png

This inline debugging feature is enabled by default. If you don't see the inline debugging values, please check that it's enabled using the settings icon /help/img/idea/2017.2/projectToolWindowSettingsIcon.png on the Debug Tool Window:

/help/img/idea/2017.2/inline_debugging.png

Evaluating expressions

Finally, you can evaluate any expression at any time. For example, if you want to see the value of a variable, click the /help/img/idea/2017.2/variables_evaluate_expr.png button:

/help/img/idea/2017.2/py_debugging1_evaluate_expression.png

Then in the dialog box that opens, click Evaluate:

/help/img/idea/2017.2/py_debugging1_evaluate_expression_action.png

Actually, you could see the same thing with a watch. With evaluate expression you can do things that you can't do with a watch: you can change things.

For example, if you enter the desired value of the odometer, say, 50, and then continue stepping through your script, you will get the following:

/help/img/idea/2017.2/py_debugging1_evaluate_expression_change_value.png

See the Evaluating Expressions section for details.

Summary

So, you've done it! Congrats! Let's repeat what you've done with the help of PyCharm:

  • Found out the origin of the problem
  • Set breakpoints
  • Stepped through your program
  • Created a watch
  • Evaluated an expression
Last modified: 26 October 2017

See Also