On Fri, 30 Sep 2005, Leopold Toetsch via RT wrote:
> Andy Dougherty (via RT) wrote:
>
> > With a a fresh checkout (r9274) I get a number of errors where parrot
> > eventually
> > gobbles up all the memory on the system. Here's the first such one:
> >
> > t/op/gc........................
> > # Failed test (t/op/gc.t at line 279)
>
> > # './parrot --gc-debug
> > "/home/doughera/src/parrot/parrot-andy/t/op/gc_13.pir"' failed with exit
> > code 131
> > # Looks like you failed 1 test of 22.
>
> Strange. The test succeeds on linux/86 and OS/X 10.3 darwin. Running it
> through valgrind on the linux box doesn't show any indication of an error.
>
> t/op/gc_13 is using continuations for backtracking and a few closures.
> Maybe you can compare used features of other failing tests, so that the
> error reason can be narrowed a bit.
After resetting my ulimit so that the tests can run without adversely
impacting other uses of the system, I end up with 267 test failures. I
haven't had time to look for common themes. (This is all on Solaris
8/SPARC).
Failed 26/162 test scripts, 83.95% okay. 267/2734 subtests failed, 90.23% okay.
Failed Test Stat Wstat Total Fail Failed List of Failed
-------------------------------------------------------------------------------
t/dynclass/gdbmhash.t 13 3328 13 13 100.00% 1-13
t/examples/japh.t 1 256 15 1 6.67% 12
t/library/dumper.t 27 6912 27 27 100.00% 1-27
t/library/getopt_long.t 1 256 1 1 100.00% 1
t/library/md5.t 6 1536 6 6 100.00% 1-6
t/library/parrotlib.t 5 1280 6 5 83.33% 1-4 6
t/library/pcre.t 1 256 1 1 100.00% 1
t/library/pge.t 4 1024 6 4 66.67% 2 4-6
t/library/streams.t 18 4608 20 18 90.00% 1-17 19
t/op/calling.t 1 256 37 1 2.70% 35
t/op/gc.t 1 256 22 1 4.55% 13
t/op/string_cclass.t 2 512 6 2 33.33% 5-6
t/op/trans.t 1 256 19 1 5.26% 13
t/p6rules/anchors.t 26 6656 26 26 100.00% 1-26
t/p6rules/backtrack.t 15 3840 15 15 100.00% 1-15
t/p6rules/builtins.t 41 10496 41 41 100.00% 1-41
t/p6rules/capture.t 38 9728 38 38 100.00% 1-38
t/p6rules/cclass.t 18 4608 18 18 100.00% 1-18
t/p6rules/escape.t 19 4864 19 19 100.00% 1-19
t/p6rules/subrules.t 5 1280 5 5 100.00% 1-5
t/p6rules/ws.t 19 4864 21 19 90.48% 1-15 18-21
t/pmc/delegate.t 1 256 9 1 11.11% 9
t/pmc/fixedpmcarray.t 1 256 13 1 7.69% 10
t/pmc/mmd.t 1 256 30 1 3.33% 27
t/pmc/namespace.t 1 256 15 1 6.67% 12
t/src/hash.t 1 256 10 1 10.00% 6
5 tests and 100 subtests skipped.
So far, I've identified 14 tests that panic with 'Out of mem!'. These all
get a null access internal exception, and then try to exit. During
Parrot_exit, the exit handlers get called. The very first one apparently
tries to do a backtrace, and that backtrace ends up gobbling up all the
memory.
Here are some examples:
# got: 'Null PMC access in clone()
# current instr.: '(null)' pc 199
(/home/doughera/src/parrot/parrot-andy/t/op/gc_13.pir:123)
# called from Sub '(null)' pc 199
(/home/doughera/src/parrot/parrot-andy/t/op/gc_13.pir:123)
# Parrot VM: PANIC: Out of mem!
# Null PMC access in get_string()
# current instr.: 'delegate :: __get_string' pc 50
(/home/doughera/src/parrot/parrot-andy/t/pmc/delegate_9.pir:27)
# called from Sub 'delegate :: __get_string' pc 50
(/home/doughera/src/parrot/parrot-andy/t/pmc/delegate_9.pir:27)
# Parrot VM: PANIC: Out of mem!
# Null PMC access in get_iter()
# current instr.: 'cmp_fun' pc 80
(/home/doughera/src/parrot/parrot-andy/t/pmc/fixedpmcarray_10.pir:27)
# called from Sub 'cmp_fun' pc 80
(/home/doughera/src/parrot/parrot-andy/t/pmc/fixedpmcarray_10.pir:27)
# Parrot VM: PANIC: Out of mem!
# got: 'Null PMC access in set_integer_keyed_int()
# current instr.: 'Digest :: _md5_init' pc 72
(runtime/parrot/library/Digest/MD5.pir:81)
# called from Sub 'Digest :: _md5_init' pc 72
(runtime/parrot/library/Digest/MD5.pir:81)
# Parrot VM: PANIC: Out of mem!
(all the t/library/md5_*.pir tests fail in the same way).
Here's a backtrace from t/op/gc_13.pir
[EMAIL PROTECTED] ([EMAIL PROTECTED]) terminated by signal QUIT (Quit)
(dbx) where
current thread: [EMAIL PROTECTED]
=>[1] __sigprocmask(0x0, 0xffbecff0, 0x0, 0x0, 0x0, 0x0), at 0xff0d91f0
[2] _resetsig(0xff0db7f4, 0x0, 0x0, 0x225c98, 0xff0ec000, 0x0), at 0xff0ce56c
[3] _sigon(0x225c98, 0xff0f38a8, 0x3, 0xffbed0c4, 0x225c98, 0x5), at
0xff0cdd0c
[4] _thrp_kill(0x0, 0x1, 0x3, 0xff0ec000, 0x1, 0x1dbd80), at 0xff0d0d4c
[5] raise(0x3, 0x224800, 0x1dbc00, 0x1dbc00, 0x40d320, 0x21f), at 0xff14bce0
[6] mem__internal_allocate_zeroed(0x0, 0x1ccf30, 0x3b, 0x43fc40, 0x226b78,
0x0), at 0x4cdf0
[7] compact_pool(0x225f10, 0x226b78, 0x0, 0xffffffff, 0x226af0, 0xa3670), at
0xa3714
[8] mem_allocate(0x225f10, 0xffbed2ec, 0x226b78, 0x90, 0x100, 0x0), at 0xa35f8
[9] Parrot_allocate_string(0x225f10, 0x3cdb48, 0x80, 0xfffffff8, 0x2100,
0x247838), at 0xa3da4
[10] string_make_empty(0x3cdb48, 0x1, 0x80, 0x247798, 0x225c00, 0x1), at
0x53624
[11] Parrot_sprintf_format(0x225f10, 0x3cdb70, 0xffbef4b0, 0x7c200, 0x0,
0xffbef52c), at 0x7ad94
[12] Parrot_sprintf_c(0x225f10, 0x20ad68, 0x1dc580, 0x0, 0xc7, 0x247ba8), at
0x7a8a8
[13] Parrot_Context_infostr(0x0, 0x4d8c28, 0x263598, 0x4d8c20, 0x40d320,
0x4d5e40), at 0xd658c
[14] PDB_backtrace(0x225f10, 0x40d2f0, 0x4fa5a, 0xff191c14, 0x40, 0x0), at
0x76e28
[15] Parrot_exit(0x2b, 0xff1c3a54, 0xff1bfca8, 0xa, 0x1e12a0, 0x21e400), at
0x7a58c
[16] internal_exception(0x2b, 0x1e12a0, 0x0, 0xb1eb0, 0x52e7c, 0x52e94), at
0xd0f2c
[17] Parrot_Null_clone(0x225f10, 0x263598, 0x38, 0xe, 0x4d5e40, 0x17a920), at
0x17a93c
[18] Parrot_clone_p_p(0x4d5cb4, 0xf, 0x4d5e40, 0x92, 0x4d5e40, 0x84ee0), at
0x84f0c
[19] runops_slow_core(0x4d5cb4, 0x1dc400, 0x0, 0xd6400, 0x0, 0xd2800), at
0xd6674
[20] runops_int(0x225f10, 0x4d5998, 0x226058, 0x1, 0x0, 0x1), at 0xd2688
[21] runops(0x225f10, 0x0, 0x1bc1eb, 0x226058, 0x21e400, 0x247bf0), at 0xd5830
[22] Parrot_runcode(0x225f10, 0x443748, 0x70, 0x8, 0x488200, 0x0), at 0x71d54
[23] Parrot_runcode(0x225f10, 0x1, 0xffbefaf4, 0x0, 0x42ae48, 0x226af0), at
0x71aa4
[24] main(0x21e400, 0x225f10, 0xffbefafc, 0x2248ac, 0x0, 0x0), at 0x4aa84
(dbx) quit
Though it doesn't run out of memory, op/calling_35.pir also dumps core.
Here's its backtrace:
(dbx) run t/op/calling_35.pir
Running: parrot t/op/calling_35.pir
(process id 5567)
Foo ok 1
[EMAIL PROTECTED] ([EMAIL PROTECTED]) signal SEGV (no mapping at the fault
address) in Parrot_free_context at 0x4be10
0x0004be10: Parrot_free_context+0x0030: st %g1, [%o0 - 0x64]
(dbx) where
current thread: [EMAIL PROTECTED]
=>[1] Parrot_free_context(0x0, 0x248400, 0x1, 0x42863c, 0x4f, 0x138), at 0x4be10
[2] Parrot_RetContinuation_invoke(0x225f10, 0x2483f0, 0x563ee8, 0x3e99c0,
0x247e90, 0x253c40), at 0x1841e0
[3] Parrot_returncc(0x563ee4, 0x225f10, 0x5198a0, 0x8, 0x5198a0, 0x826b0), at
0x826c8
[4] runops_slow_core(0x563ee4, 0x1dc400, 0x0, 0xd6400, 0x0, 0xd2800), at
0xd6674
[5] runops_int(0x225f10, 0x563df0, 0x226058, 0x1, 0x0, 0x1), at 0xd2688
[6] runops(0x225f10, 0x0, 0x1bc1eb, 0x226058, 0x21e400, 0x4b6d38), at 0xd5830
[7] Parrot_runcode(0x225f10, 0x443748, 0x70, 0x3e99c0, 0x8, 0x253508), at
0x71d54
[8] Parrot_runcode(0x225f10, 0x1, 0xffbefa78, 0x0, 0x42ae48, 0x226af0), at
0x71aa4
[9] main(0x21e400, 0x225f10, 0xffbefa80, 0x2248ac, 0x0, 0x0), at 0x4aa84
(dbx) quit
One common theme I see is that the interpreter arguments to
Parrot_Context_infostr()
and Parrot_free_context() are both null. I don't know why.
I don't know what to make of it all yet, but anyone running tests on
shared systems should probably consider setting a conservative ulimit
value.
--
Andy Dougherty [EMAIL PROTECTED]