Cet article vous apporte des connaissances pertinentes sur Python Il présente principalement le contenu pertinent sur l'outil de débogage pdb, y compris les commandes pdb de base, la définition de points d'arrêt avec break, etc.
【Recommandation associée : Tutoriel vidéo Python3】
pdb : débogueur python
1. de plus, dans la ligne de commande, vous pouvez déboguer en l'exécutant directement sous python3 -m pdb filename.py pdb.set_trace()
Lorsque vous voyez l'invite suivante sur la ligne de commande, cela signifie que pdb a été ouvert correctement(Pdb)
2. Commandes de base pdb
CommandExplication
break ou b
continue ou c | |
---|---|
liste ou l | afficher le segment de code de la ligne en cours |
étape ou s | Entrez la fonction (utilisez next au lieu de step pour entrer dans la boucle for) |
return ou r | exécutez le code jusqu'au retour de la fonction actuelle |
next ou n | exécutez la ligne suivante |
up ou u | Retour au dernier point d'appel (pas à la ligne précédente) |
p x | Imprimer la valeur de la variable En utilisation réelle, nous avons constaté que lors de l'exécution d'un fichier python avec un script shell, il peut ne pas être possible de déboguer à l'aide de pdb et il se fermera. Pour le moment, vous ne pouvez exécuter le fichier py que directement pour le débogage. 3. Utilisez la commande break pour définir un point d'arrêt à l'emplacement spécifié dans le fichier spécifié3.1 Définissez un point d'arrêt à l'emplacement spécifié dans ce fichierPar exemple, dans l'exemple suivant, si vous le souhaitez pour saisir le forward() du modèle Pour visualiser le processus de traitement des données lors de la propagation vers l'avant dans la méthode, vous ne pouvez définir un point d'arrêt que sur la première ligne de forward() (c'est-à-dire la ligne 26), pdb.set_trace() Mais parfois le modèle est très complexe, utilisez cette méthode. Cela fera que le programme signalera une erreur et se terminera directement (je ne connais pas la raison), alors nous pouvons envisager d'utiliser la commande break pour insérer un point d'arrêt dans cette ligne, afin que le programme s'arrêtera lorsqu'il atteindra forward(). import torchimport torch.nn as nnimport pdbclass EncoderLayer(nn.Module): def __init__(self): super().__init__() self.conv1 = nn.Conv2d(4, 10, (3, 3)) self.conv2 = nn.Conv2d(10, 4, (3, 3)) self.relu = nn.ReLU() def forward(self, x): x=self.relu(self.conv1(x)) return self.relu(self.conv2(x))class Encoder(nn.Module): def __init__(self,num_layers): super().__init__() # encoders 由 num_layers个 EncoderLayer子层组成,每个子层结构相同,但参数不一定相同。 self.ModelList = nn.ModuleList([EncoderLayer() for _ in range(num_layers)]) def forward(self, x): # ModuleList是一个list,只能通过list的操作方式(如用for循环、下标索引等)进行forward计算。 for layer in self.ModelList: x = layer(x) return xif __name__=="__main__": pdb.set_trace() input = torch.rand(5, 4, 30, 30) model = Encoder(num_layers=4) output = model(input) Copier après la connexion Méthode spécifique : (1) Définissez d’abord pdb.set_trace() sur n’importe quelle ligne précédente pour arrêter le programme. (2) Entrez simplement le break 26. Comme le montre l'image : De cette façon, le point d'arrêt est défini avec succès et le programme s'arrêtera lorsqu'il atteindra forward(). Le 26 ici est le nombre de lignes. Il est à noter que la position du point d'arrêt ne peut pas être un commentaire Par exemple, si nous définissons un point d'arrêt sur la ligne 25 (ligne de commentaire), cela échouera : To. résumer, dans le même fichier La commande pour définir un point d'arrêt est la suivante :
3.2 Définir des points d'arrêt à des emplacements spécifiés dans d'autres fichiersSi le point d'arrêt que vous souhaitez définir n'est pas lors de l'exécution initiale fichier, comment pouvez-vous le définir dans d'autres fichiers ? Comment utiliser la commande break pour définir un point d'arrêt ? Regardons cet exemple : Divisez le code 3.1 en trois fichiers py et placez-les dans le même chemin : ![Résumé de lutilisation de loutil de débogage Python pdb (Python Debugger)](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4b5d476ba5b14b0ba541d78930b9704a~tplv-k3u1fbpfcp-zoom-1.image) Copier après la connexion Regardez le contenu de chaque fichier : run.py: Initial pdb.set_trace( ) est défini dans run.py. import torchfrom encoder import Encoderimport pdbif __name__=="__main__": pdb.set_trace() input = torch.rand(5, 4, 30, 30) model = Encoder(num_layers=4) output = model(input) Copier après la connexion encoder.py: from encoder_layer import EncoderLayerimport torch.nn as nnclass Encoder(nn.Module): def __init__(self,num_layers): super().__init__() # encoders 由 num_layers个 EncoderLayer子层组成,每个子层结构相同,但参数不一定相同。 self.ModelList = nn.ModuleList([EncoderLayer() for _ in range(num_layers)]) def forward(self, x): # ModuleList是一个list,只能通过list的操作方式(如用for循环、下标索引等)进行forward计算。 for layer in self.ModelList: x = layer(x) return x Copier après la connexion encoder_layer.py: import torch.nn as nnclass EncoderLayer(nn.Module): def __init__(self): super().__init__() self.conv1 = nn.Conv2d(4, 10, (3, 3)) self.conv2 = nn.Conv2d(10, 4, (3, 3)) self.relu = nn.ReLU() def forward(self, x): x=self.relu(self.conv1(x)) return self.relu(self.conv2(x)) Copier après la connexion Maintenant, nous exécutons run.py et définissons un point d'arrêt sur la ligne 12 de encoder.py, qui est
La commande est :
c'est-à-dire break filename: lineNous pouvons voir que le programme peut entrer forward() à partir de output = model(input):Cela fonctionne Très facile à déboguer. Si le point d'arrêt initial et le point d'arrêt cible ne se trouvent pas dans le fichier dans le même répertoire, vous pouvez également définir le point d'arrêt via le nom du fichier sous le chemin relatif, par exemple : (Pdb) break ../transformer/asr_model.py:91Breakpoint 1 at /local/wenet/examples/aishell/s0/wenet/transformer/asr_model.py:91(Pdb) Copier après la connexion 4 Problèmes détectés lors de l'utilisation de pdb. 4.1 Lors de l'utilisation de liens symboliques, le chemin du fichier affiché par pdb n'est pas cohérent avec le chemin réel. Comme le montre la figure, pdb se compose de trois lignes. La première ligne est le chemin du fichier, la deuxième ligne est la ligne de code actuellement exécutée. , et la troisième ligne est la ligne de commande d'entrée. Lorsqu'il y a un lien symbolique, le chemin affiché par pdb est le chemin pointé par le lien symbolique, mais le chemin du code réel est le chemin qui copie le contenu du lien symbolique. Ces deux chemins sont différents, alors assurez-vous de le faire. Faites attention.4.2 pdb ne peut parfois pas ajouter de points d'arrêt dans la méthode forward() du modèle pdb ne peut parfois pas utiliser pdb.set_trace() pour ajouter des points d'arrêt dans la méthode forward() du modèle. : :Les fonctions compilées ne peuvent pas prendre un nombre variable d'arguments ou utiliser des arguments de mots-clés uniquement avec les paramètres par défautCela signifie probablement "Les fonctions compilées ne peuvent pas prendre un nombre variable d'arguments ou utiliser des arguments de mots-clés uniquement avec les paramètres par défaut". ”Je ne comprends pas ce que cela signifie et ce problème n'a pas été résolu. 5. Post-débogage après le crash du programme : pdb.pm() Comme mentionné ci-dessus, les points d'arrêt sont insérés lorsque le programme démarre et pdb est utilisé pour le débogage, c'est-à-dire le pré-débogage. En fait, pdb peut également être utilisé pour le débogage post-mortem, c'est-à-dire qu'après un bug et un crash du programme, utilisez le débogueur python pour l'afficher.Par exemple, test.py a évidemment un bug : Le programme plante : Nous pouvons utiliser la commande suivante pour un débogage simple : python -i test.pyL'option -i vous permet d'ouvrir un shell interactif une fois le programme terminé, comme suit : |
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!