-- Debugging techniques
Debugging with print
Debugging with a custom function
custom.py
def debug(*msg, print_separator=True):
print(*msg)
if print_separator:
print('-' * 40)
debug('Data is ...')
debug('Different', 'Strings', 'Are not a problem')
debug('After while loop', print_separator=False)
$ python custom.py
custom_timestamp.py
from time import sleep
def debug(*msg, timestamp=[None]):
print(*msg)
from time import time # local import
if timestamp[0] is None:
timestamp[0] = time() #1
else:
now = time()
print(' Time elapsed: {:.3f}s'.format(
now - timestamp[0]))
timestamp[0] = now #2
debug('Entering nasty piece of code...')
sleep(.3)
debug('First step done.')
sleep(.5)
debug('Second step done.')
$ python custom_timestamp.py
Inspecting the traceback
traceback_simple.py
d = {'some': 'key'}
key = 'some-other'
print(d[key])
$ python traceback_simple.py
traceback_validator.py
class ValidatorError(Exception):
"""Raised when accessing a dict results in KeyError. """
d = {'some': 'key'}
mandatory_key = 'some-other'
try:
print(d[mandatory_key])
except KeyError:
raise ValidatorError(
'`{}` not found in d.'.format(mandatory_key))
$ python traceback_validator.py
Using the Python debugger
ipdebugger.py
# d comes from a JSON payload we don't control
d = {'first': 'v1', 'second': 'v2', 'fourth': 'v4'}
# keys also comes from a JSON pay
load we don't controlkeys = ('first', 'second', 'third', 'fourth')
def do_something_with_value(value):
print(value)
for key in keys:
do_something_with_value(d[key])
print('Validation done.')
$ python ipdebugger.py
ipdebugger_ipdb.py
# d comes from a JSON payload we don't control
d = {'first': 'v1', 'second': 'v2', 'fourth': 'v4'}
# keys also comes from a JSON payload we don't control
keys = ('first', 'second', 'third', 'fourth')
def do_something_with_value(value):
print(value)
import ipdb
ipdb.set_trace() # we place a breakpoint here
for key in keys:
do_something_with_value(d[key])
print('Validation done.')
$ python ipdebugger_ipdb.py
Inspecting log files
log.py
import logging
logging.basicConfig(
filename='ch11.log',
level=logging.DEBUG, # minimum level capture in the file
format='[%(asctime)s] %(levelname)s:%(message)s',
datefmt='%m/%d/%Y %I:%M:%S %p')
mylist = [1, 2, 3]
logging.info('Starting to process `mylist`...')
for position in range(4):
try:
logging.debug('Value at position {} is {}'.format(
position, mylist[position]))
except IndexError:
logging.exception('Faulty position: {}'.format(position))
logging.info('Done parsing `mylist`.')
Other techniques
Profiling
Assertions
assertions.py
mylist = [1, 2, 3] # this ideally comes from some place
assert 4 == len(mylist) # this will break
for position in range(4):
print(mylist[position])
$ python assertions.py
Where to find information
-- Troubleshooting guidelines
Using console editors
Where to inspect
Using tests to debug
Monitoring
-- Summary
No comments:
Post a Comment