Python | Basic Program Crash Debugging

If the program is crashing with an exception, running the program as python3 -i can be a useful tool for simply looking around. The -i option starts an interactive shell as soon as a program terminates. From there, the environment can be explored.

Code #1: Given the code

filter_none

edit
close

play_arrow

link
brightness_4
code

# abc.py
def func(n):
    return n + 10
  
func('Hello')

chevron_right


Code #2: Running python3 -i produces the following



filter_none

edit
close

play_arrow

link
brightness_4
code

bash % python3 -i sample.py
Traceback (most recent call last):
    File "sample.py", line 6, in <module>
        func('Hello')
    File "sample.py", line 4, in func
        return n + 10
TypeError: Can't convert 'int' object to str implicitly

chevron_right


filter_none

edit
close

play_arrow

link
brightness_4
code

func(10)

chevron_right


Output :

20

A further step is to launch the Python debugger after a crash as shown in the code below.

Code #3 :

filter_none

edit
close

play_arrow

link
brightness_4
code

import pdb
pdb.pm()

chevron_right


Output :

> sample.py(4)func()
-> return n + 10
(Pdb) w
  sample.py(6)()
-> func('Hello')
> sample.py(4)func()
-> return n + 10
(Pdb) print n
'Hello'
(Pdb) q

If the code is deeply buried in an environment where it is difficult to obtain an interactive shell (e.g., in a server), catch errors and produce tracebacks as shown in the code below.

Code #4:

filter_none

edit
close

play_arrow

link
brightness_4
code

import traceback
import sys
  
try:
    func(arg)
except:
    print('**** AN ERROR OCCURRED ****')
    traceback.print_exc(file = sys.stderr)

chevron_right


If the program isn’t crashing, but it’s producing wrong answers or working wrong, there is often nothing wrong with just injecting a few print() calls in places of interest. However, there are related techniques of interest. First, the traceback.print_stack() function will create a stack track of your program immediately at that point as shown in the code below.

Code #5 :

filter_none

edit
close

play_arrow

link
brightness_4
code

def sample(n):
    if n > 0:
        sample(n-1)
    else:
        traceback.print_stack(file = sys.stderr)
  
sample(5)

chevron_right


Output :

File "", line 1, in <module>
File "", line 3, in sample
File "", line 3, in sample
File "", line 3, in sample
File "", line 3, in sample
File "", line 3, in sample
File "", line 5, in sample

Alternatively, the debugger at any point in the program cab also be launched manually using pdb.set_trace() as –

Code #6:

filter_none

edit
close

play_arrow

link
brightness_4
code

import pdb
def func(arg):
    ...
    pdb.set_trace()
    ...

chevron_right


This can be a useful technique for poking around in the internals of a large program and answering questions about the control flow or arguments to functions.



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.




Article Tags :

Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.