[Idle-dev] IDLE freezing/hanging
John Zelle
john.zelle at wartburg.edu
Thu Feb 24 21:43:33 CET 2005
I haven't had a chance yet to try out Kurt's debugging suggestions, but
I have attached strace. This hang is so bad on my platform (Debian
testing, 2.6.10 stock [non-debian] kernel, KDE 3.3) as to render IDLE
unuseable. All I have to do is fire up IDLE and start doing any kind of
editing on a new file or an existing one, and in very short order, the
process locks up. Somtimes I am typing, sometimes just when I leave it
idleing. I have not noticed that typing rate is a factor. The strace
sequence always ends up the same, I'm attaching one example run. It
always dies with a FUTEX_WAKE, FUTEX_WAIT, FUTEX_WAKE sequence, with
strace not printing the complete final call. I have no idea what that
means. Perhaps someone who knows more can make sense of it.
When I get a chance, I'll run some more experiments along the lines
suggested below. The really strange part of this is that I had this
problem before, and _somehow_ managed to get IDLE useable again. I
thought it was a library upgrade that fixed it. But I now have a clean
install with all libs up-t0-date, and it's worse than ever.
I am going to try building from the Python source to see if this could
be a problem with the Debian binary distribution.
--John Zelle
Kurt B. Kaiser wrote:
> Grégoire Dooms <dooms at info.ucl.ac.be> writes:
>
>
>>Me too.
>>I use Debian unstable and Idle patched with Raphael Noam's
>>enhancements (they are great I would love to see this merged).
>
>
> This will happen fairly soon. He has an enthusiatic following.
>
>
>>I tried to debug the problem but am not aware of a way to attach a
>>debugger to a python process (I would like to do it at a higher level
>>than interpreter level with gdb).
>
>
> There is a graphics version of gdb: ddd
>
> http://www.gnu.org/software/ddd/ddd.html
>
>
>>All I could do up to now is strace both processes and see one of them
>>repeating a sequence of futex and select calls (this is normal I think)
>> while the other is blocked in a futex call.
>
>
> OK, it may be that the subprocess is somehow blocked looking for input
> from the GUI.
>
>
>>I tried to get that process out of the futex call by sending a signal
>>but all signals I tried up to now made it exit (HUP and CHLD, if I
>>remember correctly). The problem is not easily reproductible as it
>>seems to occur at random. But I feel it could be related to rate of
>>typing as I nearly always get it when typing on my laptop keyboard.
>
>
> The blizzard of futex calls is due to polling the sockets. That is
> done by both the GUI and the subprocess (execution server). The tricky
> thing debugging IDLE is to do it amid all that activity.
>
> If you can get to a point where you have something at least partially
> reproducible, try running IDLE with the -n switch :
>
> (cd ..../Lib/idlelib && ../../python ./PyShell.py -n) or idle -n,
> depending on how your system is set up. See if the problem goes away.
>
>
>>I did not submit a bug as this is patched code and I never had a
>>student annoyed by this bug.
>>I'm willing to help trace and fix the bug if you can direct me in the
>>right direction.
>
>
> One thing you can try is to turn on the tracing built into IDLE's
> rpc.py:
>
> File / Open Module : rpc
>
> In class RPCHandler and class RPCClient there are 'debugging'
> variables. Set them to True and restart IDLE. You'll now see
> extensive output in the command window. Note that this output is an
> interleave of everything going on, and, as is typical of output from
> several threads, may be slightly out of sequence. But there are
> sequence numbers associated with each rpc call to help you decode all
> that. If that isn't enough, there are some print>>sys.__stderr__
> statements in rpc.py which are commented out. You can turn them on to
> get a veritable blizzard of traces :-)
>
> When IDLE freezes, I assume you mean that the GUI is unresponsive, and
> that you can't restart the shell from the Shell menu. If so, try
> this: kill the subprocess with
>
> 'kill -KILL xxxxx'. The subprocess is the one with '8833' in its
> command line (ps ax).
>
> IDLE should then spawn a fresh subprocess and you should be able to
> continue without losing any of your work.
>
> If it doesn't, that points to a problem with Tk. Does it happen while
> you're typing quickly, or will it freeze while you're having lunch?
>
> I must say: I've been using IDLE for years, on W98, W2K, WXP, RH6.2,
> Arch Linux, and OpenBSD. I've never had IDLE freeze on me unless I
> made a coding error while working on IDLE itself. Then I see a
> traceback in the command window.
>
> I have had X crash. And even a couple of emacs hangs. These things
> seem to happen once in a blue moon when I'm using Gnome on Arch (which
> is pretty bleeding edge). What's your desktop/window manager?
>
> (I mostly use Ion, it works extremely well with IDLE because Ion uses
> non-overlapping panes and each pane can contain multiple tabbed IDLE
> windows which can be dragged/dropped into different panes. After you
> use Ion for awhile you realize that overlapping windows are just an
> awful design choice made at Xerox PARC lo those many years ago. It's
> also super lightweight and stable.)
>
> IDLE is written in pure Python. So if the 'freeze' isn't due to some
> hitherto undetected GUI/subprocess interaction deadlock (which can be
> resolved w/o losing work by killing the subprocess), then there is an
> issue in the C code implementing Python or Tk. Hardware seems to be
> ruled out because all of you are having problems on Debian Sid.
>
> And the way to debug that is to attach gdb to it. It won't be pretty.
> The subprocess has two threads: one executing user code, and one
> minding the sockets. The GUI has one thread which executes the Tk
> event loop, with polling implemented using after() calls. Additional
> threads are created as necessary for callbacks from the subprocess.
>
-------------- next part --------------
ioctl(3, FIONREAD, [32]) = 0
read(3, "\36\360\6\v\26\36:\0^\0\0\3\22\0\200\1\1\0\0\0\37\0\0\0"..., 32) = 32
gettimeofday({1108935078, 484691}, {360, 0}) = 0
select(6, [5], [], [], {0, 50000}) = 0 (Timeout)
gettimeofday({1108935078, 535532}, {360, 0}) = 0
gettimeofday({1108935078, 535816}, {360, 0}) = 0
gettimeofday({1108935078, 536192}, {360, 0}) = 0
write(3, "\31\0\v\0\22\0\200\1\0\0\0\0\37\244\252\267\26\36:\0\22"..., 44) = 44
gettimeofday({1108935078, 536926}, {360, 0}) = 0
write(7, "\0", 1) = 1
futex(0x81c3c50, FUTEX_WAKE, 1) = 1
futex(0x83b5e70, FUTEX_WAKE, 1) = 1
futex(0x83b5e80, FUTEX_WAIT, 492, NULL
More information about the IDLE-dev
mailing list