New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
IDLE debugger causes crash if not quitted properly before next run #68643
Comments
# Open a module using IDLE Congratulations! You got yourself a crash! One way to avoid this crash is to press quit before the third run. But even without it, this shouldn't happen. Sometimes the programmer may simply forget that there is an active debugger running... I'm using |
This seems like an extension of bpo-15348, but I will leave it open for now. The additional details may be useful. |
I have reviewed the patch(http://bugs.python.org/msg172439) submitted in issue bpo-15348 and works very well for solving this particular issue too. Although I have checked it only on Linux but it works arguably fine. |
Thank you for testing this. I am hoping that you left the patch applied for testing in routine use. I an now reviewing the code so I can understand it well enough to apply, and to see what non-debug functions might possibly be affected, and need testing with the patch applied. |
Like bpo-15347 and bpo-15348, this was also caused by nested event loops, though the exact problem is slightly different. I've attached fix-mainloop2.patch which has a lengthy comment explaining the problem and how the patch solves it. This patch also includes the changes from fix-nested-mainloop.patch. |
New changeset f51467273d3b by Terry Jan Reedy in branch '2.7': New changeset 1ddd77a5e8c8 by Terry Jan Reedy in branch '3.4': |
Patch does two things. On startup, check if debugger is already active and if it is, send 'finish' signal to existing interaction and try again after .1 second. This is the part aimed at the particular problem of this issue. During active running, use the tcl vwait mechanism https://www.tcl.tk/man/tcl/TclCmd/vwait.htm intended for suspending and resuming a function without blocking the event loop. Using root.mainloop and root.quit for this purpose was a hack that sort of worked but created the shutdown problems in bpo-15347 and bpo-15348. To further explain the suspend/resume ping-ponging of control: IDLE's bebugger is based on the bdb.Bdb debug engine. User interaction is added by overriding Bdb.user_xyz methods. The overrides tell Bdb what to do after they return by calling Bdb.set_uvw methods. idlelib.Debugger.Idb defines .user_line and .user_exception, which are called when the debugger stops on a line or with an exception. Both end by calling Debugger.Debugger.interaction. This method updates the gui and activates the buttons. It must then pause (now with vwait waitvar) and allow button presses (and other IDLE gui events) to be handled *without* returning. (The stdlib pdb can instead just call "cmd = input('pdb>')" and block waiting for user input.) When a debugger button is pressed, a Bdb.set_uvw method is called and waitvar is set. Then .interaction resumes, disables the buttons, and returns so Bdb can do the action requested. Thanks Mark for working this out and finding the proper pause/resume method. On my Windows 10 machine, at least, the patch did not completely solve the hang-on-close issues. One or two exceptions are raised instead of hanging. This is improvement. Details are on bpo-15348. Pending a better solution, I added try-except around the gui.interaction call to ignore the exception. After numerous tests (at least 10) where I started and either stopped the debugger or restarted from the editor, I encountered a hang. But this was not something I could reproduce, and Restart Shell worked, whereas it had not previously. |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: