web-dev-qa-db-fra.com

Comment quitter ipdb pendant le débogage post-mortem?

J'aime inspecter les erreurs dans un script Python en utilisant:

$ python3 -m pdb my_script.py

Cela me place dans une invite pdb à partir de laquelle je peux c continuer l'exécution, et quand il rencontre une erreur, je peux inspecter les variables puis q quitter l'exécution du script pour revenir à mon shell .

J'ai essayé la même chose avec le module de débogage iPython, car il est plus coloré:

$ python3 -m ipdb my_script.py

Cependant, je ne peux pas quitter le débogueur une fois que j'ai fini d'inspecter l'erreur. L'utilisation de la commande q quit ne fait que basculer entre la réexécution du script et le mode post mortem:

$ python3 -m ipdb my_script.py
ipdb> c
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
ipdb> Inspect some variables at this point
ipdb> q
Post mortem debugger finished. The my_script.py will be restarted
ipdb> q
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
ipdb> q
Post mortem debugger finished. The my_script.py will be restarted
ipdb> q
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
ipdb> q
Post mortem debugger finished. The my_script.py will be restarted
ipdb> q
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program

Comment quitter ce débogueur?

24
Ashwin Nanjappa

C'était un bogue dans IPython 5.1. Il a été corrigé dans cette demande de tirage et n'est plus un problème à partir d'IPython 5.2 et versions ultérieures. Vous pouvez maintenant utiliser q, quit() ou Ctrl+d pour quitter le débogueur.

6
joelostblom

Comme l'a commenté l'utilisateur @ffeast, il y a n problème ouvert d'ipdb , et quelques solutions de contournement suggérées. Pour moi, cela a bien fonctionné:

  • presse ctrl+z et kill %1 (ou quel que soit le numéro de tâche)
  • exécuter ipdb> import os; os._exit(1)
28
tutuDajuju

Utilisation ctrl+z ou ouvrez un deuxième terminal, puis recherchez le processus (ps -ax | grep python) et tue le processus .

Pas à pas:

  1. Accédez à un terminal:

    • Option A: Appuyez sur ctrl+z
    • Option B: Si vous avez accès à une interface graphique Ubuntu , ouvrez un deuxième terminal (ctrl+alt+t)
    • Option C: Si vous n'avez accès qu'à une ligne de commande , accédez à un second tty (ctrl+alt+F2)
    • Option D: Si vous accédez à un serveur via ssh , établissez une nouvelle connexion à partir d'un autre terminal ssh server (utilisez l'option B ou C pour pouvoir ouvrir une deuxième connexion pour exécuter la commande)
  2. Recherchez le python PID correspondant du processus ps -ax | grep python. Par exemple, l'ID de processus pour mon processus (python my_stucked_process.py) serait 112923:

   3085 tty1     Sl+   15:53 /usr/bin/python /usr/bin/x-terminal-emulator
   112923 pts/2    Tl     0:01 python my_stucked_process.py
   113118 pts/2    S+     0:00 grep --color=auto python
  1. Tuez le processus kill -9 112923

@tutuDajuju a suggéré d'utiliser ctrl+z mais leur suggestion n'enverra le processus qu'en arrière-plan (il existera toujours en consommant de la mémoire). Vous devez faire ce qui précède pour vraiment tuer le processus

1
toto_tico