Je vais résumer le débogage à l'aide d'ipdb, y compris l'organisation de ce que les débutants en développement Web ont appris.
Il fournit une extension de pdb, qui est un ** débogueur ** fourni en standard avec Python.
Entrez le code suivant à l'endroit où vous souhaitez démarrer le débogueur et exécuter le programme.
import ipdb; ipdb.set_trace()
Lorsqu'il est exécuté, il attend ** l'entrée standard **, vous pouvez donc faire fonctionner le débogueur en entrant une commande. Ce qui suit est un résumé des commandes fréquemment utilisées (probables).
commander | mouvement |
---|---|
n | Passer à la ligne suivante |
s | Exécuter jusqu'à la fonction suivante |
p nom de variable | Afficher la valeur de la variable |
a | Afficher les arguments de la fonction en cours d'exécution |
h | Aidez-moi |
q | Fin |
Utilisons en fait ipdb en utilisant le programme Aggressive Cows de POJ No.3468.
Aggressive.py
import ipdb
n = 5
m = 3
x = [1, 2, 8, 4, 9]
def C(d):
last = 0
for _ in range(1, m):
crt = last + 1
while crt<n and x[crt]-x[last]<d:
crt += 1
if crt == n:
return False
last = crt
return True
x.sort()
lb, ub = 0, max(x)
while ub-lb > 1:
ipdb.set_trace()
mid = int( (lb+ub)/2 )
if C(mid):
lb = mid
else:
ub = mid
print(lb)
Exécuter.
$ python Aggressive.py
>c:/users/~/aggressive.py(21)<module>()
20 import ipdb; ipdb.set_trace()
---> 21 mid = int( (lb+ub)/2 )
22 if C(mid):
Le point d'arrêt défini est affiché sous forme de flèche.
ipdb> h
Documented commands (type help <topic>):
========================================
EOF cl disable interact next psource rv unt
a clear display j p q s until
alias commands down jump pdef quit source up
args condition enable l pdoc r step w
b cont exit list pfile restart tbreak whatis
break continue h ll pinfo return u where
bt d help longlist pinfo2 retval unalias
c debug ignore n pp run undisplay
Miscellaneous help topics:
==========================
exec pdb
Une liste de commandes utilisables est sortie.
ipdb> p mid
*** NameError: name 'mid' is not defined
La variable «mid» n'est pas définie car la ligne 21 n'a pas encore été exécutée.
ipdb> n
> c:/users/~/aggressive.py(22)<module>()
21 mid = int( (lb+ub)/2 )
---> 22 if C(mid):
23 lb = mid
La flèche indiquant le point d'arrêt se décale de un.
ipdb> p mid
4
Puisque la 21e ligne est exécutée, la valeur de la variable «mid» est affichée.
ipdb> s
--Call--
> c:/users/~/aggressive.py(6)C()
5
----> 6 def C(d):
7 last = 0
Il semble que l'appel à la fonction suivante a été exécuté.
ipdb> a
d = 4
Puisque l'appel à la fonction suivante était juste en dessous, la valeur de la variable «mid» confirmée plus tôt est affichée comme argument.
ipdb> q
Exiting Debugger.
Quittez le débogueur.
J'ai utilisé toutes les commandes (probables) qui sont souvent utilisées dans ipdb. C'était la première fois que j'utilisais le débogueur, mais j'ai exécuté le programme ** à mi-chemin ** et vérifié le contenu des variables à chaque fois, ou je l'ai exécuté à la position souhaitée sans réécrire le programme. J'ai trouvé très pratique d'y aller. Il est difficile d'écrire un programme car il s'agit d'un débogage, je veux donc utiliser à bon escient le débogueur pour écrire un programme efficace et sans erreur.
Recommended Posts