Comment quitter pdb et permettre au programme de continuer?

111

J'utilise le module pdb pour déboguer un programme. J'aimerais comprendre comment je peux quitter pdb et permettre au programme de continuer jusqu'à son terme. Le programme est coûteux à exécuter, donc je ne veux pas quitter sans que le script tente de se terminer. continuene semble pas fonctionner. Comment puis-je quitter pdb et continuer mon programme?

tortue
la source
2
continuequitte les boucles, returnquitte les méthodes / fonctions
Stephan
7
@Stephan: Il parle de continuela commande pdb. Pas la déclaration Python.
voithos
1
@turtle: continuedevrait "Continuer l'exécution, s'arrêter uniquement lorsqu'un point d'arrêt est rencontré", selon la documentation. Avez-vous un ensemble de points d'arrêt qui est touché?
voithos
1
ah. OK je vois. oui, j'ai un point de rupture défini dans une boucle. de toute façon pour contourner cela? la boucle est appelée des milliers de fois, donc je ne peux pas continuer à appuyer manuellement.
tortue
1
@turtle: Avez-vous un point d'arrêt défini dans Pdb, ou en avez-vous pdb.set_trace()dans votre code source?
voithos

Réponses:

190

continuedevrait "Continuer l'exécution, s'arrêter uniquement lorsqu'un point d'arrêt est rencontré", donc vous avez un point d'arrêt défini quelque part. Pour supprimer le point d'arrêt (si vous l'avez inséré manuellement):

(Pdb) break
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at /path/to/test.py:5
(Pdb) clear 1
Deleted breakpoint 1
(Pdb) continue

Ou, si vous utilisez pdb.set_trace(), vous pouvez essayer ceci (bien que si vous utilisez pdb de manière plus sophistiquée, cela peut casser les choses ...)

(Pdb) pdb.set_trace = lambda: None  # This replaces the set_trace() function!
(Pdb) continue
# No more breaks!
voithos
la source
10
Ce qui précède ne pas quitter pdb.
Steve Barnes
7
Environ le 15e mot de la question!
Steve Barnes
13
@SteveBarnes: Je pense que vous le prenez trop littéralement. L'OP ne fait que frapper un point d'arrêt encore et encore. Tout ce dont ils ont besoin est de poursuivre leur processus de longue durée sans atteindre les points d'arrêt. Que Pdb soit en cours d'exécution ou non n'a aucune importance.
voithos
35
Nice tip on setting set_trace = lambda: None:)
randlet
2
Pour les cas extrêmes, rien ne vaut set_trace = lambda: None. L'organisation Python devrait ajouter une commande qui vous permet simplement de sortir de pdb.
ErezO
26

Un simple Ctrl- Dva sortir de pdb. Si vous voulez continuer plutôt que de rompre, appuyez simplement sur cplutôt que sur toute la continuecommande

Minh Triet
la source
7
Qu'en est-il lorsque vous êtes à l'intérieur d'une fonction, à l'intérieur d'une boucle? Cela semble aller simplement à la boucle suivante pour moi, et je ne peux pas réellement fermer pdb, ou même fermer python, sans fermer tout le terminal?
Marses
@LimokPalantaemon Weird, avez-vous essayé de taperexit
Minh Triet
Cela ne fonctionne pas si vous définissez une trace ou si vous avez des points d'arrêt, sauf si vous continuez à appuyer sur c.
Alex
embarrassant, mais cela m'a évité d'être coincé trop longtemps -_-
jmcg
7

La réponse de @voithos est correcte, je vais donc ajouter une alternative dans le cas où vous utilisez set_trace. Oui, le pdb.set_trace = lambda: Nonehack fonctionne bien, mais pas si vous avez défini d'autres points d'arrêt et que vous souhaitez le réactiver plus tard. Pour moi, cela souligne le fait qu'il pdbmanque malheureusement un tas de fonctionnalités (même des éléments de base comme les listes d'affichage), et c'est un autre cas.

La bonne nouvelle est que pdb++c'est un excellent remplacement pour pdb, et l'une des choses qu'il résout est exactement le problème de la désactivation set_trace. Vous pouvez donc simplement faire:

pip install pdbpp

puis à l' (Pdb++)invite, tapez:

pdb.disable()

Si vous souhaitez le réactiver plus tard, cela fonctionne sans surprise:

pdb.enable()

Facile! Et vous obtiendrez en plus de nombreux autres goodies utiles.

Adam Spires
la source
4

Si vous souhaitez vraiment quitter le débogueur, vous devez exécuter quelque chose comme WinPdb qui vous permet de vous détacher du processus, puis de quitter le débogueur, (NB: il est multi-plateforme).

Si vous souhaitez continuer le débogage mais ne plus vous arrêter à un point d'arrêt donné, vous devez:

  1. Notez le numéro du point d'arrêt (ou le numéro de fichier et de ligne),
  2. Soit, cl bp_number soit clear file:line pour supprimer définitivement le point d'arrêt, soit disable pb_number pour le désactiver, mais pouvoir le réactiver.
  3. Ensuite continue, votre programme s'exécute jusqu'à ce que le prochain point d'arrêt différent soit atteint.

Pour plus de détails sur ce qui précède, consultez le manuel .

Steve Barnes
la source
0

trouver une nouvelle façon de quitter le pdb sans rien installer: - lorsque le programme commence à s'exécuter, appuyez sur ctrl + c, puis passez la fenêtre à une autre (n'importe quelle fenêtre), puis le shell d'origine avec pdb en cours d'exécution devrait afficher quelque chose comme: (pdb) ..... - revenez à pdb, puis appuyez sur Entrée, maintenant vous êtes prêt, le shell de commande pdb réapparaît

CerveauAtom
la source