[Zope] Re: Zope hangs and Python eats all memory
Dieter Maurer
dieter at handshake.de
Wed Jan 17 17:03:15 EST 2007
Nico Grubert wrote at 2007-1-17 10:08 +0100:
> ...
>(gdb) thread 1
>[Switching to thread 1 (Thread 47050976353024 (LWP 6613))]#0
>0x00002acae8a3e202 in ?? () from /lib64/libc.so.6
>
>(gdb) call PyRun_SimpleString("import sys, traceback;
>sys.stderr=open('/tmp/tb','w',0); traceback.print_stack()")
>
>Program received signal SIGSEGV, Segmentation fault.
>0x000000000048fb9d in PyImport_AddModule (name=0x4d5ae9 "__main__") at
>Python/import.c:320
> ...
>After I attached the pid "6613", Zope does not answers anymore until I
>quit "GDB". Is this the normal behavior?
>
>Any idea, why no '/tmp/tb' logfile is created?
Because, the program get a SIGSEGV before it could create the file.
I found that this is often the case when you call Python functions
from GDB.
My hypothesis is that this happens because in the thread where the
Python function is called some important invariant is not met.
E.g. almost all Python functions expect to be called only when the
global interpreter lock (GIL) is held. But, this is the case
at most in a single thread of Zope's multiple threads.
For Zope debugging at C level, I therefore avoid calling
Python functions directly but use emulations on the C level.
Following are GDB commands to display the value of a Python string
object ("ps") and to display the Python stack frame information
in an "eval_frame" (C level) call frame ("pfr").
def ps
x/s ({PyStringObject}$arg0)->ob_sval
end
def pfr
ps f->f_code->co_filename
ps f->f_code->co_name
#p f->f_lineno
lineno
end
define lineno
set $__co = f->f_code
set $__lasti = f->f_lasti
set $__sz = ((PyStringObject *)$__co->co_lnotab)->ob_size/2
set $__p = (unsigned char *)((PyStringObject *)$__co->co_lnotab)->ob_sval
set $__li = $__co->co_firstlineno
set $__ad = 0
while ($__sz-1 >= 0)
set $__sz = $__sz - 1
set $__ad = $__ad + *$__p
set $__p = $__p + 1
if ($__ad > $__lasti)
# break -- interpreted as "breakpoint"
set $__sz = -1
end
if ($__sz >= 0)
set $__li = $__li + *$__p
set $__p = $__p + 1
end
end
printf "%d\n", $__li
end
--
Dieter
More information about the Zope
mailing list