[New-bugs-announce] [issue2077] Interpreter crash on shutdown
Rupert Summerton
report at bugs.python.org
Tue Feb 12 12:50:25 CET 2008
New submission from Rupert Summerton:
1. Description: The Python interpretor is crashing on shutdown due to a
segmentation fault:
Unhandled exception at 0x1e03d41f in python.exe: 0xC0000005: Access
violation reading location 0x0000002c.
2. Reproducibility: At least 10% on Windows XP Professional SP2, P4
3.20GHz, 2.00GB RAM, when running the attached module, threadpool.py.
(Running with Python 2.5.1). Unfortunately I cannot get the attached
test case to crash on Linux or Solaris. However, executing this code as
part of our Python test framework (see context below), with Python
2.4.1, what looks like the same crash produced the following backtrace:
#0 reset_exc_info (tstate=0x8254458) at
/tools/src/python/python-2.4.1/Python/ceval.c:2861
tstate = (PyThreadState *) 0x8254458
frame = (PyFrameObject *) 0x0
tmp_type = (PyObject *) 0x82a3a18
tmp_value = (PyObject *) 0x0
tmp_tb = (PyObject *) 0x2
#1 0x080a9b56 in PyEval_EvalFrame (f=0x82a38ac) at
/tools/src/python/python-2.4.1/Python/ceval.c:2490
stack_pointer = (PyObject **) 0x82a3a18
next_instr = (unsigned char *) 0x81d4f1e ""
opcode = 136660056
oparg = 0
why = WHY_RETURN
err = 0
x = (PyObject *) 0x810d940
v = (PyObject *) 0x81d4f1e
w = (PyObject *) 0xf6462fc0
u = (PyObject *) 0xf642ec50
t = (PyObject *) 0x0
stream = (PyObject *) 0x0
fastlocals = (PyObject **) 0x82a39f8
freevars = (PyObject **) 0x82a3a18
retval = (PyObject *) 0x810d940
tstate = (PyThreadState *) 0x8254458
co = (PyCodeObject *) 0xf6134c60
instr_ub = -1
instr_lb = 0
instr_prev = -1
first_instr = (unsigned char *) 0x81d4d9c "|"
names = (PyObject *) 0xf63d762c
consts = (PyObject *) 0xf6134c2c
#2 0x080aa263 in PyEval_EvalCodeEx (co=0xf6134c60, globals=0xf6075824,
locals=0x0, args=0x82c1080, argcount=2, kws=0x82c1088, kwcount=0,
defs=0xf6414298,
defcount=1, closure=0x0) at
/tools/src/python/python-2.4.1/Python/ceval.c:2730
co = (PyCodeObject *) 0xf6134c60
globals = (PyObject *) 0x8254458
locals = (PyObject *) 0x82a38ac
args = (PyObject **) 0x82c1080
argcount = 2
kws = (PyObject **) 0x82c1088
kwcount = 0
defs = (PyObject **) 0xf6414298
defcount = 1
closure = (PyObject *) 0x0
f = (PyFrameObject *) 0x82a38ac
retval = (PyObject *) 0x0
fastlocals = (PyObject **) 0x82a39f8
freevars = (PyObject **) 0x82a3a18
tstate = (PyThreadState *) 0x8254458
x = (PyObject *) 0x82a38ac
u = (PyObject *) 0x82a38ac
#3 0x080acda7 in fast_function (func=0xf613e8b4, pp_stack=0xe951f3dc,
n=2, na=2, nk=0) at /tools/src/python/python-2.4.1/Python/ceval.c:3643
func = (PyObject *) 0x82a38ac
co = (PyCodeObject *) 0x8254458
globals = (PyObject *) 0xf6075824
argdefs = (PyObject *) 0x8254458
d = (PyObject **) 0xf6414298
nd = 1
#4 0x080ab08a in call_function (pp_stack=0xe951f3dc, oparg=1) at
/tools/src/python/python-2.4.1/Python/ceval.c:3568
oparg = 136660056
na = 2
nk = 0
n = 2
pfunc = (PyObject **) 0x82c1080
func = (PyObject *) 0xf613e8b4
x = (PyObject *) 0x8172f54
w = (PyObject *) 0x82a38ac
#5 0x080a9338 in PyEval_EvalFrame (f=0x82c0f1c) at
/tools/src/python/python-2.4.1/Python/ceval.c:2163
sp = (PyObject **) 0x82c1088
stack_pointer = (PyObject **) 0x82c1088
next_instr = (unsigned char *) 0x81f58cc "\001q\225"
opcode = 136660056
oparg = 1
why = WHY_NOT
err = 0
x = (PyObject *) 0x82a37ec
v = (PyObject *) 0x81f58cc
w = (PyObject *) 0xf6444de0
u = (PyObject *) 0xf642ec50
t = (PyObject *) 0x1
stream = (PyObject *) 0x0
fastlocals = (PyObject **) 0x82c1068
freevars = (PyObject **) 0x82c1080
retval = (PyObject *) 0x0
tstate = (PyThreadState *) 0x8254458
co = (PyCodeObject *) 0xf618c920
instr_ub = -1
instr_lb = 0
instr_prev = -1
first_instr = (unsigned char *) 0x81f57f4 "|"
names = (PyObject *) 0xf63a484c
consts = (PyObject *) 0xf6164a1c
#6 0x080aa263 in PyEval_EvalCodeEx (co=0xf618c920, globals=0xf5d658ac,
locals=0x0, args=0x827d690, argcount=1, kws=0x827d694, kwcount=1,
defs=0xf5d77e78,
defcount=2, closure=0x0) at
/tools/src/python/python-2.4.1/Python/ceval.c:2730
co = (PyCodeObject *) 0xf618c920
globals = (PyObject *) 0x8254458
locals = (PyObject *) 0x82a38ac
args = (PyObject **) 0x8136f18
argcount = 1
kws = (PyObject **) 0x827d694
kwcount = 1
defs = (PyObject **) 0xf5d77e78
defcount = 2
closure = (PyObject *) 0x0
f = (PyFrameObject *) 0x82c0f1c
retval = (PyObject *) 0x0
fastlocals = (PyObject **) 0x82c1068
freevars = (PyObject **) 0x82c1080
tstate = (PyThreadState *) 0x8254458
x = (PyObject *) 0x82a38ac
u = (PyObject *) 0x82c0f1c
#7 0x080acda7 in fast_function (func=0xf616af7c, pp_stack=0xe951f5ac,
n=3, na=1, nk=1) at /tools/src/python/python-2.4.1/Python/ceval.c:3643
func = (PyObject *) 0x82a38ac
co = (PyCodeObject *) 0x8254458
globals = (PyObject *) 0xf5d658ac
argdefs = (PyObject *) 0x8254458
d = (PyObject **) 0xf5d77e78
nd = 2
#8 0x080ab08a in call_function (pp_stack=0xe951f5ac, oparg=256) at
/tools/src/python/python-2.4.1/Python/ceval.c:3568
oparg = 136660056
na = 1
nk = 1
n = 3
pfunc = (PyObject **) 0x827d690
func = (PyObject *) 0xf616af7c
x = (PyObject *) 0x81284cc
w = (PyObject *) 0x82a38ac
#9 0x080a9338 in PyEval_EvalFrame (f=0x827d534) at
/tools/src/python/python-2.4.1/Python/ceval.c:2163
sp = (PyObject **) 0x827d69c
stack_pointer = (PyObject **) 0x827d69c
next_instr = (unsigned char *) 0x81f9e53 "}\002"
opcode = 136660056
oparg = 256
why = WHY_NOT
err = 0
x = (PyObject *) 0x8136f18
v = (PyObject *) 0x81f9e53
w = (PyObject *) 0xf63cabe0
u = (PyObject *) 0x18c
t = (PyObject *) 0x100
stream = (PyObject *) 0x0
fastlocals = (PyObject **) 0x827d680
freevars = (PyObject **) 0x827d690
retval = (PyObject *) 0x0
tstate = (PyThreadState *) 0x8254458
co = (PyCodeObject *) 0xf613f8a0
instr_ub = -1
instr_lb = 0
instr_prev = -1
first_instr = (unsigned char *) 0x81f9d6c "z\n\003yò\002xë\002|"
names = (PyObject *) 0xf63cc8c4
consts = (PyObject *) 0xf6165e9c
#10 0x080acd43 in fast_function (func=0xf6171064, pp_stack=0xe951f6ec,
n=1, na=1, nk=0) at /tools/src/python/python-2.4.1/Python/ceval.c:3629
retval = (PyObject *) 0x827d680
fastlocals = (PyObject **) 0x827d680
i = 136660056
f = (PyFrameObject *) 0x827d534
tstate = (PyThreadState *) 0x8254458
stack = (PyObject **) 0x82a38ac
func = (PyObject *) 0x82a38ac
co = (PyCodeObject *) 0x8254458
globals = (PyObject *) 0x827d680
argdefs = (PyObject *) 0x8254458
d = (PyObject **) 0x8254458
nd = 0
#11 0x080ab08a in call_function (pp_stack=0xe951f6ec, oparg=0) at
/tools/src/python/python-2.4.1/Python/ceval.c:3568
oparg = 136660056
na = 1
nk = 0
n = 1
pfunc = (PyObject **) 0x827b2a8
func = (PyObject *) 0xf6171064
x = (PyObject *) 0x7f
w = (PyObject *) 0x82a38ac
#12 0x080a9338 in PyEval_EvalFrame (f=0x827b14c) at
/tools/src/python/python-2.4.1/Python/ceval.c:2163
sp = (PyObject **) 0x827b2ac
stack_pointer = (PyObject **) 0x827b2ac
next_instr = (unsigned char *) 0x81d4b2f "\001Wn)\001\004t\021"
opcode = 136660056
oparg = 0
why = WHY_NOT
err = 0
x = (PyObject *) 0xf5e7cd4c
v = (PyObject *) 0x81d4b2f
w = (PyObject *) 0xf61360e0
u = (PyObject *) 0xf5e87f4c
t = (PyObject *) 0x0
stream = (PyObject *) 0x0
fastlocals = (PyObject **) 0x827b298
freevars = (PyObject **) 0x827b2a8
retval = (PyObject *) 0x0
tstate = (PyThreadState *) 0x8254458
co = (PyCodeObject *) 0xf61386e0
instr_ub = -1
instr_lb = 0
instr_prev = -1
first_instr = (unsigned char *) 0x81d4a84 "zõ\001t"
names = (PyObject *) 0xf643295c
consts = (PyObject *) 0xf613a0cc
#13 0x080aa263 in PyEval_EvalCodeEx (co=0xf61386e0, globals=0xf6075824,
locals=0x0, args=0xf5de6f38, argcount=1, kws=0x0, kwcount=0, defs=0x0,
defcount=0,
closure=0x0) at /tools/src/python/python-2.4.1/Python/ceval.c:2730
co = (PyCodeObject *) 0xf61386e0
globals = (PyObject *) 0x8254458
locals = (PyObject *) 0x82a38ac
args = (PyObject **) 0xf5de6f38
argcount = 1
kws = (PyObject **) 0x0
kwcount = 0
defs = (PyObject **) 0x0
defcount = 0
closure = (PyObject *) 0x0
f = (PyFrameObject *) 0x827b14c
retval = (PyObject *) 0x0
fastlocals = (PyObject **) 0x827b298
freevars = (PyObject **) 0x827b2a8
tstate = (PyThreadState *) 0x8254458
x = (PyObject *) 0x82a38ac
u = (PyObject *) 0x827b14c
#14 0x080ee2b7 in function_call (func=0xf613edbc, arg=0xf5de6f2c,
kw=0x0) at /tools/src/python/python-2.4.1/Objects/funcobject.c:548
result = (PyObject *) 0x0
argdefs = (PyObject *) 0x0
d = (PyObject **) 0x0
k = (PyObject **) 0x0
nk = 136660056
nd = 0
#15 0x0805a7f4 in PyObject_Call (func=0xf613edbc, arg=0xf5de6f2c,
kw=0x0) at /tools/src/python/python-2.4.1/Objects/abstract.c:1751
result = (PyObject *) 0xf5de6f2c
func = (PyObject *) 0x8254458
call = 0x82a38ac
#16 0x08061497 in instancemethod_call (func=0xf613edbc, arg=0xf642902c,
kw=0x0) at /tools/src/python/python-2.4.1/Objects/classobject.c:2431
arg = (PyObject *) 0xf5de6f2c
self = (PyObject *) 0x0
class = (PyObject *) 0xf5de6f2c
result = (PyObject *) 0xf5de6f2c
#17 0x0805a7f4 in PyObject_Call (func=0xf5e858c4, arg=0xf642902c,
kw=0x0) at /tools/src/python/python-2.4.1/Objects/abstract.c:1751
result = (PyObject *) 0xf642902c
func = (PyObject *) 0x8254458
call = 0x82a38ac
co = (PyCodeObject *) 0xf61386e0
instr_ub = -1
instr_lb = 0
instr_prev = -1
first_instr = (unsigned char *) 0x81d4a84 "zõ\001t"
names = (PyObject *) 0xf643295c
consts = (PyObject *) 0xf613a0cc
#13 0x080aa263 in PyEval_EvalCodeEx (co=0xf61386e0, globals=0xf6075824,
locals=0x0, args=0xf5de6f38, argcount=1, kws=0x0, kwcount=0, defs=0x0,
defcount=0,
closure=0x0) at /tools/src/python/python-2.4.1/Python/ceval.c:2730
co = (PyCodeObject *) 0xf61386e0
globals = (PyObject *) 0x8254458
locals = (PyObject *) 0x82a38ac
args = (PyObject **) 0xf5de6f38
argcount = 1
kws = (PyObject **) 0x0
kwcount = 0
defs = (PyObject **) 0x0
defcount = 0
closure = (PyObject *) 0x0
f = (PyFrameObject *) 0x827b14c
retval = (PyObject *) 0x0
fastlocals = (PyObject **) 0x827b298
freevars = (PyObject **) 0x827b2a8
tstate = (PyThreadState *) 0x8254458
x = (PyObject *) 0x82a38ac
u = (PyObject *) 0x827b14c
#14 0x080ee2b7 in function_call (func=0xf613edbc, arg=0xf5de6f2c,
kw=0x0) at /tools/src/python/python-2.4.1/Objects/funcobject.c:548
result = (PyObject *) 0x0
argdefs = (PyObject *) 0x0
d = (PyObject **) 0x0
k = (PyObject **) 0x0
nk = 136660056
nd = 0
#15 0x0805a7f4 in PyObject_Call (func=0xf613edbc, arg=0xf5de6f2c,
kw=0x0) at /tools/src/python/python-2.4.1/Objects/abstract.c:1751
result = (PyObject *) 0xf5de6f2c
func = (PyObject *) 0x8254458
call = 0x82a38ac
#16 0x08061497 in instancemethod_call (func=0xf613edbc, arg=0xf642902c,
kw=0x0) at /tools/src/python/python-2.4.1/Objects/classobject.c:2431
arg = (PyObject *) 0xf5de6f2c
self = (PyObject *) 0x0
class = (PyObject *) 0xf5de6f2c
result = (PyObject *) 0xf5de6f2c
#17 0x0805a7f4 in PyObject_Call (func=0xf5e858c4, arg=0xf642902c,
kw=0x0) at /tools/src/python/python-2.4.1/Objects/abstract.c:1751
result = (PyObject *) 0xf642902c
func = (PyObject *) 0x8254458
call = 0x82a38ac
---Type <return> to continue, or q <return> to quit---
#18 0x080ac52b in PyEval_CallObjectWithKeywords (func=0xf5e858c4,
arg=0xf642902c, kw=0x0) at
/tools/src/python/python-2.4.1/Python/ceval.c:3419
arg = (PyObject *) 0xf642902c
kw = (PyObject *) 0x0
result = (PyObject *) 0x0
#19 0x080d0c86 in t_bootstrap (boot_raw=0x82543f8) at
/tools/src/python/python-2.4.1/Modules/threadmodule.c:432
boot_raw = (void *) 0x82543f8
gstate = PyGILState_UNLOCKED
res = (PyObject *) 0x82a38ac
#20 0xf65cede8 in start_thread () from /lib/tls/libpthread.so.0
No symbol table info available.
#21 0xf654693a in clone () from /lib/tls/libc.so.6
3. Context: We have an automated test framework written in Python. To
speed up execution it has been multi-threaded so that tests can be run
in parallel. Rather than re-invent the wheel we simply used this
threadpool (http://chrisarndt.de/en/software/python/threadpool/), work
requests essentially being calls to a method that runs an individual
test case. However, we have substantially modified the code to add
functionality. Specifically, we need to find a way to limit the number
of tests that can run concurrently because: (1) different tests place
different loads on a machine, and (2) different machines have different
capacities (CPUs, memory, etc.). We do this by associating a cost with
each work request, and by using the number of CPUs on the machine as a
limit (crude, but reasonably effective) -- if running the next job would
exceed the cost limit, the thread sleeps, and then checks again. In
order to verify that this cost logic works, we have also added some
logging code that can be activated by setting a flag. The other
significant modification has been to extend the Python Queue module to
add a peek method, because peeking at the front of the job queue to
determine the cost of the next job, and not removing it until there is
sufficient capacity to run it, speeds up the execution of tests. The
crash in the Python interpretor occurs only when (1) the cost logging is
switched on AND (2) the module peekablequeue is used instead of the
built in Queue module. I am quite willing to believe that these
modifications could be better implemented, but however bad the code, the
Python interpretor should not crash.
----------
components: Interpreter Core
files: python_crash_test.zip
messages: 62310
nosy: rupert.summerton
severity: normal
status: open
title: Interpreter crash on shutdown
type: crash
versions: Python 2.5
Added file: http://bugs.python.org/file9415/python_crash_test.zip
__________________________________
Tracker <report at bugs.python.org>
<http://bugs.python.org/issue2077>
__________________________________
More information about the New-bugs-announce
mailing list