bug-guile
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Segfault on armv5tel-linux-gnueabi


From: Ludovic Courtès
Subject: Re: Segfault on armv5tel-linux-gnueabi
Date: Thu, 30 Jun 2011 01:30:22 +0200
User-agent: Gnus/5.110017 (No Gnus v0.17) Emacs/24.0.50 (gnu/linux)

Hello,

Sooo, the test case can be reduced to this:

--8<---------------cut here---------------start------------->8---
(use-modules (ice-9 threads))

(define (test)
  (pk 'test)
  (let* ((m (make-mutex))
         (c (make-condition-variable))
         (t (begin-thread (begin (pk 'kid (current-thread)) (lock-mutex m)
                                 (wait-condition-variable c m)
                                 (pk 'kid-done (current-thread)))))
         (r (join-thread t (current-time))))
    (pk 'parent (current-thread))
    (cancel-thread t)
    (not r))) 

(test)
(test) ;; <- VM stack overflow, then segfault
(test)
--8<---------------cut here---------------end--------------->8---

With breakpoints at ‘pthread_cancel’ and ‘scm_error’, we get a nicer
backtrace:

--8<---------------cut here---------------start------------->8---
(gdb) thread apply all bt

Thread 2 (Thread 0x41257470 (LWP 23878)):
#0  scm_error (key=0xc7060, subr=0x0, message=0x403ba554 "Stack overflow", 
args=0x4, rest=0x4) at ../../libguile/error.c:61
#1  0x4036dbe0 in scm_report_stack_overflow () at ../../libguile/stackchk.c:58
#2  0x40392640 in scm_c_vm_run (vm=0x1f57e8, program=0x708e8, argv=0x41256cc8, 
nargs=4) at ../../libguile/vm.c:564
#3  0x40304344 in scm_call_4 (proc=0x708e8, arg1=<value optimized out>, 
arg2=<value optimized out>, arg3=<value optimized out>, arg4=0x1c1880) at 
../../libguile/eval.c:506
#4  0x4037ab40 in scm_catch_with_pre_unwind_handler (key=0x404, thunk=0x1c18a0, 
handler=0x1c1890, pre_unwind_handler=0x1c1880) at ../../libguile/throw.c:86
#5  0x402fb380 in scm_i_with_continuation_barrier (body=0x402fabdc <c_body>, 
body_data=0x41256d4c, handler=0x402faeb0 <c_handler>, handler_data=0x41256d4c, 
pre_unwind_handler=0x402fad10 <pre_unwind_handler>, 
    pre_unwind_handler_data=0xda340) at ../../libguile/continuations.c:450
#6  0x402fb440 in scm_c_with_continuation_barrier (func=<value optimized out>, 
data=<value optimized out>) at ../../libguile/continuations.c:546
#7  0x4012a2d8 in GC_call_with_stack_base () from 
/nix/store/iva9d3m74d1sw2ymas27kacnj2k3rp81-boehm-gc-7.2pre20110122/lib/libgc.so.1
#8  0x403788fc in scm_i_with_guile_and_parent (func=<value optimized out>, 
data=<value optimized out>) at ../../libguile/threads.c:919
#9  scm_with_guile (func=<value optimized out>, data=<value optimized out>) at 
../../libguile/threads.c:925
#10 0x4012a2d8 in GC_call_with_stack_base () from 
/nix/store/iva9d3m74d1sw2ymas27kacnj2k3rp81-boehm-gc-7.2pre20110122/lib/libgc.so.1
#11 0x4037861c in on_thread_exit (v=0x1a52a0) at ../../libguile/threads.c:716
#12 0x4015a348 in __nptl_deallocate_tsd () from 
/nix/store/x7n64n36xpqbsi10lgpr3x9f1z9jsp83-glibc-2.12.2/lib/libpthread.so.0
#13 0x40167ea4 in ?? () from 
/nix/store/x7n64n36xpqbsi10lgpr3x9f1z9jsp83-glibc-2.12.2/lib/libpthread.so.0
#14 0x40167ea4 in ?? () from 
/nix/store/x7n64n36xpqbsi10lgpr3x9f1z9jsp83-glibc-2.12.2/lib/libpthread.so.0
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Thread 1 (Thread 0x400a5000 (LWP 23877)):
#0  scm_cancel_thread (thread=<value optimized out>) at 
../../libguile/threads.c:1142
#1  0x40390524 in vm_regular_engine (vm=0xda3a8, program=0x0, argv=0x107160, 
nargs=404768) at ../../libguile/vm-i-system.c:892
#2  0x40392634 in scm_c_vm_run (vm=0xda3a8, program=0x1c1820, argv=0x0, 
nargs=0) at ../../libguile/vm.c:565
#3  0x40390524 in vm_regular_engine (vm=0xda3a8, program=0x107118, 
argv=0x10710c, nargs=404768) at ../../libguile/vm-i-system.c:892
#4  0x40392634 in scm_c_vm_run (vm=0xda3a8, program=0xe3670, argv=0xbed6b1ec, 
nargs=1) at ../../libguile/vm.c:565
#5  0x40304618 in scm_primitive_eval (exp=0x1b5820) at ../../libguile/eval.c:639
#6  0x40304698 in scm_eval (exp=0x1b5820, module_or_state=0x161828) at 
../../libguile/eval.c:673
#7  0x403566c4 in scm_shell (argc=<value optimized out>, argv=0xbed6b884) at 
../../libguile/script.c:402
#8  0x40321408 in invoke_main_func (body_data=0xbed6b718) at 
../../libguile/init.c:336
#9  0x402fabf0 in c_body (d=0xbed6b6c4) at ../../libguile/continuations.c:512
#10 0x4037a6f8 in apply_catch_closure (clo=<value optimized out>, args=0x304) 
at ../../libguile/throw.c:146
#11 0x4039031c in vm_regular_engine (vm=0xda3a8, program=0x107054, 
argv=0x107054, nargs=1747296) at ../../libguile/vm-i-system.c:960
#12 0x40392634 in scm_c_vm_run (vm=0xda3a8, program=0x708e8, argv=0xbed6b640, 
nargs=4) at ../../libguile/vm.c:565
#13 0x40304344 in scm_call_4 (proc=0x708e8, arg1=<value optimized out>, 
arg2=<value optimized out>, arg3=<value optimized out>, arg4=0x1aa940) at 
../../libguile/eval.c:506
#14 0x4037ab40 in scm_catch_with_pre_unwind_handler (key=0x404, thunk=0x1aa960, 
handler=0x1aa950, pre_unwind_handler=0x1aa940) at ../../libguile/throw.c:86
#15 0x402fb380 in scm_i_with_continuation_barrier (body=0x402fabdc <c_body>, 
body_data=0xbed6b6c4, handler=0x402faeb0 <c_handler>, handler_data=0xbed6b6c4, 
pre_unwind_handler=0x402fad10 <pre_unwind_handler>, 
    pre_unwind_handler_data=0xda340) at ../../libguile/continuations.c:450
#16 0x402fb440 in scm_c_with_continuation_barrier (func=<value optimized out>, 
data=<value optimized out>) at ../../libguile/continuations.c:546
#17 0x4037871c in with_guile_and_parent (base=0xbed6b6f0, data=<value optimized 
out>) at ../../libguile/threads.c:876
#18 0x4012a2d8 in GC_call_with_stack_base () from 
/nix/store/iva9d3m74d1sw2ymas27kacnj2k3rp81-boehm-gc-7.2pre20110122/lib/libgc.so.1
#19 0x403788fc in scm_i_with_guile_and_parent (func=<value optimized out>, 
data=<value optimized out>) at ../../libguile/threads.c:919
#20 scm_with_guile (func=<value optimized out>, data=<value optimized out>) at 
../../libguile/threads.c:925
#21 0x403214d0 in scm_boot_guile (argc=<value optimized out>, argv=<value 
optimized out>, main_func=<value optimized out>, closure=<value optimized out>) 
at ../../libguile/init.c:319
#22 0x000089a8 in main (argc=<value optimized out>, argv=<value optimized out>) 
at ../../libguile/guile.c:70
(gdb) thread 1
[Switching to thread 1 (Thread 0x400a5000 (LWP 23877))]#0  scm_cancel_thread 
(thread=<value optimized out>) at ../../libguile/threads.c:1142
1142    }
(gdb) p t
$14 = (scm_i_thread *) 0x1a52a0
(gdb) thread 2
[Switching to thread 2 (Thread 0x41257470 (LWP 23878))]#0  scm_error 
(key=0xc7060, subr=0x0, message=0x403ba554 "Stack overflow", args=0x4, 
rest=0x4) at ../../libguile/error.c:61
61          (key,
(gdb) p scm_i_current_thread 
$15 = (scm_i_thread *) 0x1a52a0
--8<---------------cut here---------------end--------------->8---

The thread experiencing the stack overflow is the one being canceled.
Its ‘on_thread_exit’ is called because it’s a pthread key destructor.

When ‘on_thread_exit’ is called, t->guile_mode == 1, which causes
‘with_guile_and_parent’ to keep t->base unchanged, which eventually
causes SCM_STACK_OVERFLOW_P to misdiagnose a stack overflow.

Adding ‘t->guile_mode = 0’ at the beginning of ‘on_thread_exit’ solves
this problem, because it forces t->base to be adjusted.

I’ll see how to solve it correctly.

Ludo’.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]