inducer / pudb

Full-screen console debugger for Python
https://documen.tician.de/pudb/
Other
2.94k stars 226 forks source link

“I/O operation on closed file” when try with "Debugging from a separate terminal" #598

Closed guoyejun closed 1 month ago

guoyejun commented 1 year ago

Hi, I met “I/O operation on closed file” when try with "Debugging from a separate terminal" at https://documen.tician.de/pudb/starting.html#debugging-from-a-separate-terminal.

I'm using conda with below versions:

$ python --version
Python 3.9.7
$ pudb --version    
pudb v2022.1.3
$ which pudb
/home/testit/miniconda3/envs/trypudb/bin/pudb

my python code:

$ cat try.py
from datetime import datetime
import os
import sys

from pudb.remote import set_trace
set_trace()

if __name__ == "__main__":
    print(' '.join(sys.argv))
    begin = datetime.now()
    print("begin process", os.getpid(), "at", begin.strftime('%Y-%m-%d %H:%M:%S'))

On the first terminal, I tried with:

$ tty
/dev/pts/3
$ perl -MPOSIX -e pause

On the second terminal, I met the below issue. Should I run with 'root'? thanks.

$ PUDB_TTY=/dev/pts/3 pudb try.py
Traceback (most recent call last):
  File "/home/testit/miniconda3/envs/trypudb/lib/python3.9/site-packages/pudb/debugger.py", line 2434, in call_with_ui
    return f(*args, **kwargs)
  File "/home/testit/miniconda3/envs/trypudb/lib/python3.9/site-packages/pudb/debugger.py", line 2740, in interaction
    self.event_loop()
  File "/home/testit/miniconda3/envs/trypudb/lib/python3.9/site-packages/pudb/debugger.py", line 2696, in event_loop
    self.screen.draw_screen(self.size, canvas)
  File "/home/testit/miniconda3/envs/trypudb/lib/python3.9/site-packages/urwid/raw_display.py", line 708, in draw_screen
    self._setup_G1()
  File "/home/testit/miniconda3/envs/trypudb/lib/python3.9/site-packages/urwid/raw_display.py", line 687, in _setup_G1
    self.write(escape.DESIGNATE_G1_SPECIAL)
  File "/home/testit/miniconda3/envs/trypudb/lib/python3.9/site-packages/urwid/raw_display.py", line 286, in write
    self._term_output_file.write(data)
ValueError: I/O operation on closed file.
axman6 commented 1 year ago

I’m also having this issue, which is problematic because when the app I’m debugging prints anything, the pudb UI disappears until I terminate the app.

axman6 commented 1 year ago

I believe I’ve found an alternative way to achieve the PUDB_TTY trick, instead of setting the end var, if you redirect stein to be the tty, it seems to work:

$ tty
/dev/pts/17
$ perl -MPOSIX -e pause
$ pudb something.py args < /dev/pts/17
# TUI appears

if you also pipe the output into that tty, you end up with the UI being drawn in the first terminal, and being able to interact with it there.

Sadly this doesn’t solve the issue I have that when the app prints anything, the tui disappears completely in the second shell, and doesn’t reappear until the app exits. sending Ctrl-l via the first terminal doesn’t seem to redraw. Surely I’m not the first person to ever debug an app that logs to stdout?

Looks like the issue above isn’t related to to printing to stdout (they were just correlated in time), something strange seems to be happening with tkinter which causes the tui to disappear completely sometime before the main window appears.

stdedos commented 11 months ago

The latest version

Installing collected packages: pudb
  Attempting uninstall: pudb
    Found existing installation: pudb 2022.1.3
    Uninstalling pudb-2022.1.3:
      Successfully uninstalled pudb-2022.1.3
Successfully installed pudb-2023.1

also gives me

Traceback (most recent call last):
  File ".venv/lib/python3.11/site-packages/pudb/debugger.py", line 466, in user_line
    self.interaction(frame)
  File ".venv/lib/python3.11/site-packages/pudb/debugger.py", line 436, in interaction
    self.ui.call_with_ui(self.ui.interaction, exc_tuple,
  File ".venv/lib/python3.11/site-packages/pudb/debugger.py", line 2540, in call_with_ui
    self.show()
  File ".venv/lib/python3.11/site-packages/pudb/debugger.py", line 2531, in show
    self.screen.start()
  File ".venv/lib/python3.11/site-packages/urwid/display_common.py", line 813, in start
    self._start(*args, **kwargs)
  File ".venv/lib/python3.11/site-packages/urwid/raw_display.py", line 222, in _start
    self.write(escape.SWITCH_TO_ALTERNATE_BUFFER)
  File ".venv/lib/python3.11/site-packages/urwid/raw_display.py", line 286, in write
    self._term_output_file.write(data)
ValueError: I/O operation on closed file.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File ".venv/lib/python3.11/site-packages/pudb/debugger.py", line 2456, in show_internal_exc_dlg
    self._show_internal_exc_dlg(exc_tuple)
  File ".venv/lib/python3.11/site-packages/pudb/debugger.py", line 2479, in _show_internal_exc_dlg
    urwid=".".join(map(str, urwid.version.version)),
                            ^^^^^^^^^^^^^^^^^^^^^
AttributeError: module 'urwid.version' has no attribute 'version'

😕

stdedos commented 11 months ago

Also seems to be related to https://github.com/inducer/pudb/issues/317#issue-369787196?

marc-h38 commented 9 months ago

ValueError: I/O operation on closed file.

I successfully git bisected this. Reverting one-line commit 277980e92e (July 2022) avoids this issue. That tty.close() really does look like a smoking gun!

Revert successfully tested on top of current version 8c8f9d4a25e2.

I don't know yet if this revert has any undesired side-effect; I only found this right now and wanted to share this "breakthrough" ASAP. That commit message and the corresponding PR #534 were both empty. I will for sure use that one-line revert "in anger" and report back if I find any problem.

--- a/pudb/__init__.py
+++ b/pudb/__init__.py
@@ -80,6 +80,7 @@ def _get_debugger(**kwargs):
             kwargs.setdefault("stdin", tty_file)
             kwargs.setdefault("stdout", tty_file)
             kwargs.setdefault("term_size", term_size)
+            tty_file.close()

         from pudb.debugger import Debugger
         dbg = Debugger(**kwargs)
stdedos commented 9 months ago

That's awesome work!

Can you contribute your testing methodology? 🙏

marc-h38 commented 9 months ago

That's awesome work!

Can you confirm it works for you too?

Can you contribute your testing methodology?

export PUDB_TTY=/dev/pts/X
./try-the-debugger.sh 
marc-h38 commented 9 months ago

I will for sure use that one-line revert "in anger" and report back if I find any problem.

This revert did not last long. It makes PUDB_TTY go further but things are still not OK: many keys don't work and the terminal acts strangely. Even without a commit message I guess this line was there for a reason.

Instead I installed the last official release before this commit and so far things seem to work: pip install pudb==2022.1.2 https://pypi.org/project/pudb/#history

ejeffrey commented 7 months ago

I'm having this issue too, and for me removing tty_file.close() call fixed the problem entirely.

msbrogli commented 6 months ago

I also had the same issues and removing the tty_file.close() fixed the issue entirely.

MatrixManAtYrService commented 1 month ago

Same here, so I made a PR.

inducer commented 1 month ago

Fixed by #656.