14. Дебуболечкване

14. Дебуболечкване

14. Дебуболечкване

17 април 2013

Ако не винаги успявате от първият път

Логаритмично дебъгване

Дебъгване чрез логване

import logging
logging.basicConfig(level=logging.DEBUG)

logging.debug("Just a debug message! DON'T PANIC")
logging.info("Here, sir, have my info")
logging.critical("OMGOMGOMGOMG")

Нива на логване, по ред на страшност:

Нивото по подразбиране е WARNING

Пример

logging.basicConfig(
       level=logging.DEBUG,
       filename='debug.txt',
       format='%(asctime)s %(levelname)s: %(message)s',
       datefmt='%Y-%m-%d %H:%M:%S'
)

Използвайте logging вместо print() когато пишете пограма която е по-голяма от две прости функции, за да знаете винаги какво се случва.

Хардкор дебуболечкване

Трудно е да се дебъгва с print()/logging когато програмата забива или отказва да работи

>>> make_a_sandwich(for=me)
'NO!'
Segmentation fault (core dumped)

На помощ идват дебъгерите!

PDB

python -m pdb buggy.py
> /buggy.py(1)<module>()
-> from doomsday import Appocalypse
(Pdb) 
>>> import pdb()
>>> from doomsday import Appocalypse
Traceback (most recent call last):
  File "/appocalypse.py", line 1, in <module>
  DeathAndDestruction
>>> pdb.pm()

PDB breakpoint

Breakpoint е място в което изпълнението на кода спира и се пуска дебъгера.

def bubblesort(data):
 data = deepcopy( data )
 for repeat in range(0, len(data)-1):
  index = 0
  while(index < len(data) - 1):
   if data[index] > data[index + 1] :
    # Something smells fishy here
    import pdb; pdb.set_trace()
    data[index], data[index + 1] = data[index + 1], data[index]
   index += 1
 return data

PDB breakpoint 2

Добавяне на breakpoint без пипане на кода

$ python3 -m pdb python.py
> /python.py(1)<module>()
-> from food import sandwich
(Pdb) break 42
Breakpoint 1 at /python.py:42
(Pdb) break 84
Breakpoint 2 at /python.py:84

PDB команди

Изглеждат много и страшни, но половината са синоними

(Pdb) help

Documented commands (type help <topic>):
========================================
EOF    cl         disable  interact  next     return  u          where
a      clear      display  j         p        retval  unalias  
alias  commands   down     jump      pp       run     undisplay
args   condition  enable   l         print    rv      unt      
b      cont       exit     list      q        s       until    
break  continue   h        ll        quit     source  up       
bt     d          help     longlist  r        step    w        
c      debug      ignore   n         restart  tbreak  whatis

PDB команди 2

Профилиране с cProfile

cProfile.run() приема произволен питонски код като низ

import cProfile
cProfile.run("answer_to_the_question_of_life_universe_and_everything()")

Можете да пуснете и цяла програма:

$ python -m cProfile -o <output-file-name> <script-name> <script-options>

Визуализация с RunSnakeRun

$ pip install runsnakerun
$ runsnake <cProfile dump>
$ runsnakemem <Meliae memory dump>
e профилер за памет https://launchpad.net/meliae

Въпроси?