Maison  >  Article  >  développement back-end  >  Comment utiliser pdb pour déboguer Python dans un environnement Linux

Comment utiliser pdb pour déboguer Python dans un environnement Linux

小云云
小云云original
2018-03-30 16:20:492826parcourir


pdb est un package fourni avec Python. Il fournit une fonction de débogage de code source interactive pour les programmes Python. Ses principales fonctionnalités incluent la définition de points d'arrêt, le débogage en une seule étape, la saisie du débogage de fonction, l'affichage du code actuel, l'affichage des fragments de pile et la dynamique. Changer la valeur d'une variable, etc. pdb fournit certaines commandes de débogage couramment utilisées.

Description des commandes courantes pour pdb :

l #step opération en une seule étape, peut entrer dans la fonction
p points d'arrêt variables
cl                                                                                                          🎜>
Journal de débogage :
des points d'arrêt définis par pdb peuvent être ajoutés au programme :
import pdb
Ajoutez pdb.set_trace() là où les points d'arrêt doivent être définis
Exécutez python -m pdb test.py

Ce qui suit décrit comment utiliser pdb pour le débogage avec des exemples spécifiques.


Listing 1. Exemple de code de test
import pdb
a = "aaa"
pdb.set_trace()
b = "bbb"
c = " ccc"
final = a + b + c
print final

Listing 2. Utiliser pdb pour déboguer
[root@rcc-pok-idg-2255 ~]# python epdb1.py
> /root/epdb1.py(4)?()
-> b = "bbb"
(Pdb) n
> ( )
-> c = "ccc"
(Pdb)
> /root/epdb1.py(6)?()
final = a + b + c
(Pdb) list
1 import pdb
2 a = "aaa"
3 pdb.set_trace()
4 b = "bbb"
5 c = "ccc"
6 -> final = a + b + c
7 imprimer final
[EOF]
(Pdb)
[EOF]
(Pdb) n
/root / epdb1.py(7)?()
-> print final
(Pdb)

Imprimer la valeur de la variable : Si vous devez imprimer la valeur de la variable pendant le débogage, vous pouvez utiliser directement p plus au-dessus du nom de la variable, mais il convient de noter que l'impression ne peut voir la valeur spécifique qu'après l'exécution de l'instruction en cours, sinon une erreur NameError: a83acfb4706c82a37955eab5f9d83764 être signalé.

Listing 3. Impression des variables pendant le processus de débogage
[root@rcc-pok-idg-2255 ~]# python epdb1.py
> )
-> b = "bbb"
(Pdb) n
> /root/epdb1.py(5)?()
-> (Pdb) p b
'bbb'
(Pdb)
'bbb'
(Pdb) n
> /root/epdb1.py(6)?()
- > final = a + b + c
(Pdb) p c
'ccc'
(Pdb) p final
*** NameError : db5662ede2b4275fb6114e762b5e5986 > (Pdb) n
> /root/epdb1.py(7)?()
-> imprimer final
(Pdb) p final
'aaabbbccc'
(Pdb)

Utilisez c pour arrêter le débogage en cours et permettre au programme de continuer à s'exécuter. S'il y a d'autres instructions de set_statement() dans le programme suivant, il entrera à nouveau dans l'état de débogage. Les lecteurs peuvent ajouter la vérification set_trace() avant l'impression finale du code.


Listing 4. Arrêtez le débogage et continuez l'exécution du programme
[root@rcc-pok-idg-2255 ~]# python epdb1.py
> (4 )?()
-> b = "bbb"
(Pdb) n
> /root/epdb1.py(5)?()
-> ccc"
(Pdb) c
aaabbbccc

Afficher le code : le bloc de code actuel peut ne pas être mémorisé lors du débogage. Si vous souhaitez afficher un bloc de code spécifique, vous pouvez l'afficher à l'aide de la commande list ou l. list utilisera la flèche -> pour pointer vers l'instruction de débogage actuelle.

Listing 6. Code affiché pendant le processus de débogage
[root@rcc-pok-idg-2255 ~]# python epdb1.py
> )
-> b = "bbb"
(Pdb) liste
1 import pdb
2 a = "aaa"
3 pdb.set_trace()
4 -> b = "bbb"
5 c = "ccc"
6 final = a + b + c
7 pdb.set_trace()
8 print final
[EOF]
( Pdb) c
> /root/epdb1.py(8)?()
-> imprimer la liste finale
(Pdb)
3 pdb.set_trace()
4 b = "bbb"
5 c = "ccc"
6 final = a + b + c
7 pdb.set_trace()
8 -> imprimer final
[EOF]
(Pdb)


Débogage lors de l'utilisation de fonctions


Listing 6. Exemple d'utilisation de fonctions
import pdb
def combine(s1,s2 ) : # définir sous-programme combiner, qui...
s3 = s1 + s2 + s1 # prend en sandwich s2 entre les copies de s1, ...
s3 = '"' + s3 +'"' # le met entre guillemets doubles,. ..
renvoie s3 # et le renvoie
a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
final = combiner. (a,b)
print final

Si vous utilisez n directement pour le débogage, cela sera traité comme une affectation normale lorsque vous atteindrez la phrase final=combine(a,b). traitement, entrez l'impression finale. Que faire si vous souhaitez déboguer une fonction ? Vous pouvez directement utiliser s pour entrer dans le bloc fonctionnel. Le débogage en une seule étape dans la fonction est similaire à l'introduction ci-dessus. Si vous ne souhaitez pas parcourir la fonction, vous pouvez appuyer sur r directement au point d'arrêt pour quitter le lieu appelant.

清单 7. 对函数进行 debug
[root@rcc-pok-idg-2255 ~]# python epdb2.py 
 > /root/epdb2.py(10)?() 
 -> b = "bbb"
 (Pdb) n 
 > /root/epdb2.py(11)?() 
 -> c = "ccc"
 (Pdb) n 
 > /root/epdb2.py(12)?() 
 -> final = combiner(a,b) 
 (Pdb) s 
 --Appel-- 
 > /root/epdb2.py(3)combine() 
 -> def combine(s1,s2):      # définit le sous-programme combiner, qui... 
 (Pdb) n 
 > /root/epdb2.py(4)combine() 
 -> s3 = s1 + s2 + s1    # sandwichs s2 entre les copies de s1, ... 
 (Pdb) list 
  1     import pdb 
  2 
  3     def combine(s1,s2):      # définir le sous-programme combiner, ce qui... 
  4  ->     s3 = s1 + s2 + s1    # prend en sandwich s2 entre les copies de s1, ... 
  5         s3 = '"' + s3 +'"'   # le met entre guillemets doubles,... 
  6         return s3            # et le renvoie. 
  7 
  8     a = "aaa"
  9     pdb.set_trace() 
 10     b = "bbb"
 11     c = "ccc"
 (Pdb) n 
> /root/epdb2.py(5)combine() 
 -> s3 = '"' + s3 +'"'   # le met entre guillemets doubles,... 
 (Pdb) n 
 > /root/epdb2.py(6)combine() 
 -> return s3            # et le renvoie. 
 (Pdb) n 
 --Retour-- 
 > /root/epdb2.py(6)combine()->'"aaabbbaaa"'
 -> return s3            # et le renvoie. 
 (Pdb) n 
 > /root/epdb2.py(13)?() 
 -> imprimer final 
 (Pdb)


在调试的时候动态改变值.下实例。需要注意的是下面有个错误,原因是 b 已经被赋值了,如果想重新改变 b 的赋值,则应该使用!b。


清单 8.态改变值
[root@rcc-pok- idg-2255 ~]# python epdb2.py 

> /root/epdb2.py(10)?() 
 -> b = "bbb"
 (Pdb) var = "1234"
 (Pdb) b = "avfe"
 *** The specified object '= "avfe"' is not a function 
 or was not found along sys.path. 
 (Pdb) !b="afdfd"
 (Pdb)

相关推荐:

用Pdb库调试Python的方式及常用的命令

Python pour PDB

Python pour PDB

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn