How to quit ipdb while in post-mortem debugging?
Question:
I like to inspect error in a Python script by using:
$ python3 -m pdb my_script.py
This drops me into a pdb prompt from where I can c
continue the execution, and when it hits error, I can inspect the variables and then q
quit the script execution to get back to my shell.
I tried the same with iPython debugger module, since it is more colorful:
$ python3 -m ipdb my_script.py
However, I am not able to quit the debugger once I am done inspecting the error. Using the q
quit command just keeps switching it between re-executing the script and post-mortem mode:
$ 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
How to quit this debugger?
Answers:
As the user @ffeast commented, there is an open ipdb issue, and a few workarounds suggested. For me these worked well:
- press ctrl+z and
kill %1
(or whatever the Job number is)
- execute
ipdb> import os; os._exit(1)
This was a bug in IPython 5.1. It was fixed in this pull request and is no longer an issue from IPython 5.2 and onwards. You can now use q
, quit()
, or Ctrl+d to exit the debugger.
Use ctrl+z or open a second terminal, then look for the process (ps -ax | grep python
) and kill the process.
Step by Step:
-
Get access to a terminal:
- Option A: Press ctrl+z
- Option B: If you have access to a the Ubuntu GUI, open a second terminal (ctrl+alt+t)
- Option C: If you only have access to a command line, access a second tty (ctrl+alt+F2)
- Option D: If you are accessing a server through ssh, make a new connection from another terminal
ssh server
(use option B or C, so you can open a second connection to execute the command)
-
Look for the corresponding python PID
of the process ps -ax | grep python
. For example, the process id for my process (python my_stucked_process.py
) would be 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
- Kill the process
kill -9 112923
@tutuDajuju suggested using ctrl+z but their suggestion will only send the process to the background (it will still exists consuming memory). You need to do the abovein order to really kill the process
I like to inspect error in a Python script by using:
$ python3 -m pdb my_script.py
This drops me into a pdb prompt from where I can c
continue the execution, and when it hits error, I can inspect the variables and then q
quit the script execution to get back to my shell.
I tried the same with iPython debugger module, since it is more colorful:
$ python3 -m ipdb my_script.py
However, I am not able to quit the debugger once I am done inspecting the error. Using the q
quit command just keeps switching it between re-executing the script and post-mortem mode:
$ 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
How to quit this debugger?
As the user @ffeast commented, there is an open ipdb issue, and a few workarounds suggested. For me these worked well:
- press ctrl+z and
kill %1
(or whatever the Job number is) - execute
ipdb> import os; os._exit(1)
This was a bug in IPython 5.1. It was fixed in this pull request and is no longer an issue from IPython 5.2 and onwards. You can now use q
, quit()
, or Ctrl+d to exit the debugger.
Use ctrl+z or open a second terminal, then look for the process (ps -ax | grep python
) and kill the process.
Step by Step:
-
Get access to a terminal:
- Option A: Press ctrl+z
- Option B: If you have access to a the Ubuntu GUI, open a second terminal (ctrl+alt+t)
- Option C: If you only have access to a command line, access a second tty (ctrl+alt+F2)
- Option D: If you are accessing a server through ssh, make a new connection from another terminal
ssh server
(use option B or C, so you can open a second connection to execute the command)
-
Look for the corresponding python
PID
of the processps -ax | grep python
. For example, the process id for my process (python my_stucked_process.py
) would be112923
:
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
- Kill the process
kill -9 112923
@tutuDajuju suggested using ctrl+z but their suggestion will only send the process to the background (it will still exists consuming memory). You need to do the abovein order to really kill the process