[Gc] OpenBSD

Taylan Ulrich B. taylanbayirli at gmail.com
Sun Jul 15 08:43:51 PDT 2012


On OpenBSD 5.1/i386, gc 7.2c fails the tests gctest and threadleaktest.

It seems to be the same issue as:
http://www.hpl.hp.com/hosted/linux/mail-archives/gc/2012-January/004921.html
(Note that it tests 7.2alpha6 on OpenBSD 4.9/x68.)

As also seen in the above link, gctest and threadleaktest output:
GC_push_all_stacks: sp not set!
Abort trap (core dumped)

Here is the backtrace from gctest.core:
#0  0x06b3b9ad in kill () from /usr/lib/libc.so.64.0
#1  0x06ba6775 in abort () at /usr/src/lib/libc/stdlib/abort.c:68
#2  0x0aa5652f in GC_abort (msg=Variable "msg" is not available.
) at misc.c:1455
#3  0x0aa5c157 in GC_push_all_stacks () at pthread_stop_world.c:355
#4  0x0aa58047 in GC_default_push_other_roots () at os_dep.c:2574
#5  0x0aa55846 in GC_push_roots (all=1, 
    cold_gc_frame=0x85263d88 "{ä\nð\236¤*°¸¤\nDR¤*¸=&\205\236Ȥ\n°¸¤\nXR¤*") at mark_rts.c:780
#6  0x0aa55046 in GC_mark_some (
    cold_gc_frame=0x85263d88 "{ä\nð\236¤*°¸¤\nDR¤*¸=&\205\236Ȥ\n°¸¤\nXR¤*") at mark.c:366
#7  0x0aa4c3fd in GC_stopped_mark (stop_func=0xaa4b8b0 <GC_never_stop_func>) at alloc.c:634
#8  0x0aa4c89e in GC_try_to_collect_inner (stop_func=0xaa4b8b0 <GC_never_stop_func>) at alloc.c:457
#9  0x0aa4cadb in GC_collect_or_expand (needed_blocks=1, ignore_off_page=0, retry=0) at alloc.c:1243
#10 0x0aa4d18c in GC_allocobj (gran=170, kind=0) at alloc.c:1330
#11 0x0aa51c9b in GC_generic_malloc_inner (lb=1028, k=0) at malloc.c:121
#12 0x0aa5661b in GC_new_free_list_inner () at misc.c:1485
#13 0x0aa50d4d in GC_init_gcj_malloc (mp_index=0, mp=0x1c003070) at gcj_mlc.c:100
#14 0x1c0028bf in run_one_test () at tests/test.c:1212
#15 0x1c002eab in thr_run_one_test (arg=0x0) at tests/test.c:1688
#16 0x0aa5ac74 in GC_inner_start_routine (sb=0x85263fb0, arg=0x3c038fd8) at pthread_start.c:56
#17 0x0aa5606c in GC_call_with_stack_base (fn=0xaa5ac20 <GC_inner_start_routine>, arg=0x3c038fd8)
    at misc.c:1556
#18 0x0aa5af67 in GC_start_routine (arg=0x3c038fd8) at pthread_support.c:1549
#19 0x093aaa2e in _thread_start () at /usr/src/lib/libpthread/uthread/uthread_create.c:242
#20 0x0000002b in ?? ()
#21 0x00000000 in ?? ()

And here from threadleaktest.core:
#0  0x092229ad in kill () from /usr/lib/libc.so.64.0
#1  0x0928d775 in abort () at /usr/src/lib/libc/stdlib/abort.c:68
#2  0x0a4e852f in GC_abort (msg=Variable "msg" is not available.
) at misc.c:1455
#3  0x0a4ee157 in GC_push_all_stacks () at pthread_stop_world.c:355
#4  0x0a4ea047 in GC_default_push_other_roots () at os_dep.c:2574
#5  0x0a4e7846 in GC_push_roots (all=1, 
    cold_gc_frame=0x88e56e88 "{ãM\nð¾M*°ØM\nDrM*¸nå\210\236èM\n°ØM\n") at mark_rts.c:780
#6  0x0a4e7046 in GC_mark_some (cold_gc_frame=0x88e56e88 "{ãM\nð¾M*°ØM\nDrM*¸nå\210\236èM\n°ØM\n")
    at mark.c:366
#7  0x0a4de3fd in GC_stopped_mark (stop_func=0xa4dd8b0 <GC_never_stop_func>) at alloc.c:634
#8  0x0a4de89e in GC_try_to_collect_inner (stop_func=0xa4dd8b0 <GC_never_stop_func>) at alloc.c:457
#9  0x0a4deca0 in GC_try_to_collect_general (stop_func=0xa4dd8b0 <GC_never_stop_func>, force_unmap=0)
    at alloc.c:981
#10 0x0a4ded96 in GC_gcollect () at alloc.c:1007
#11 0x1c000a20 in test (arg=0x0) at tests/thread_leak_test.c:27
#12 0x0a4ecc74 in GC_inner_start_routine (sb=0x88e56fb0, arg=0x3c024fd8) at pthread_start.c:56
#13 0x0a4e806c in GC_call_with_stack_base (fn=0xa4ecc20 <GC_inner_start_routine>, arg=0x3c024fd8)
    at misc.c:1556
#14 0x0a4ecf67 in GC_start_routine (arg=0x3c024fd8) at pthread_support.c:1549
#15 0x08d41a2e in _thread_start () at /usr/src/lib/libpthread/uthread/uthread_create.c:242
#16 0x0000002b in ?? ()
#17 0x00000000 in ?? ()


In addition to all that, and I doubt this is relevant, I've found that
leaktest will *sometimes* fail, due to GC_err_printf.
It seems to never fail when stdout and stderr are redirected to a file.
In emacs's eterm, which is slow, it seems to always fail.
In plain urxvt, there seems to be a small chance that it will fail.
The generated backtraces differ, except that GC_abort is always called
from the last line of GC_err_printf, via ABORT("write to stderr failed").

Here is a sample:
#0  0x0742f9ad in kill () from /usr/lib/libc.so.64.0
#1  0x0749a775 in abort () at /usr/src/lib/libc/stdlib/abort.c:68
#2  0x05d7552f in GC_abort (msg=Variable "msg" is not available.
) at misc.c:1455
#3  0x05d75842 in GC_err_printf (format=0x25d628d6 "\t\t%s\n") at misc.c:1341
#4  0x05d77782 in GC_print_callers (info=0x3c025f80) at os_dep.c:4710
#5  0x05d6d783 in GC_print_obj (p=0x3c025f78 "") at dbg_mlc.c:385
#6  0x05d6d7be in GC_debug_print_heap_obj_proc (p=0x3c025f78 "") at dbg_mlc.c:392
#7  0x05d782be in GC_print_all_errors () at reclaim.c:91
#8  0x05d6bda7 in GC_gcollect () at alloc.c:1008
#9  0x05d76177 in GC_exit_check () at misc.c:609
#10 0x0748f0c5 in __cxa_finalize (dso=0x0) at /usr/src/lib/libc/stdlib/atexit.c:153
#11 0x074711be in exit (status=0) at /usr/src/lib/libc/stdlib/exit.c:57
#12 0x1c00069f in ___start ()
#13 0x1c000612 in _start ()


Regards,
Taylan


More information about the Gc mailing list