[ruby-dev:24240] tcltk-stubs 有効時 Tcl 側 exit で abort

From: Hidetoshi NAGAI <nagai@...>
Date: 2004-09-09 05:40:13 UTC
List: ruby-dev #24240
永井@知能.九工大です.

表題の状況で困っています.どなたかお助けいただけると助かります.

Tcl/Tk インタープリタの exit プロシージャを呼び出すと異常終了します.
例えば,

% /usr/local/bin/ruby -r tcltklib -e 'TclTkIp.new._eval("exit")'

が "Tcl_Release couldn't find reference for 0x814ed38" などと 
文句を言って abort してしまいます.
stub を使わないようにした場合には正常終了し,問題が生じません.

# あまり役には立たないかもしれませんが,backtrace は後ろに付けます.

実行時の Tcl_Preserve / Tcl_Release の呼び出しはチェックしましたが,
呼び出し回数に問題はないようです.
また,問題のある Tcl_Release を呼び出している関数の先頭で,
Tcl_Release の対象を Tcl_Preserve した場合,
Tcl_Preserve も Tcl_Release も正常に実行され abort もなく終了します.

まぁ,Tcl/Tk 側の exit で終了させること自体が illegal と言えるのですが,
異常終了というのも気持ちが悪いので何とかしたいと思ってます.

exit プロシージャを置き換えて ruby 側の exit を呼び出すようにも
してみたのですが,Tcl/Tk インタープリタオブジェクトの解放時に
資源の後始末をしている関係もあって,"DeleteInterpProc called with 
active evals" となって正常に終了してくれません.
本来はインタープリタを殺すだけでいいとは思うのですが,
そうしようとすると "DeleteInterpProc called with active evals" です.

どうするのが一番良いでしょうか???

----------------------------------------------------------
Program received signal SIGABRT, Aborted.
0x400a1951 in __kill () from /lib/libc.so.6
(gdb) bt
#0  0x400a1951 in __kill () from /lib/libc.so.6
#1  0x400a16a4 in raise (sig=6) at ../sysdeps/posix/raise.c:27
#2  0x400a2d91 in abort () at ../sysdeps/generic/abort.c:88
#3  0x40306413 in Tcl_PanicVA () from /usr/local/lib/libtcl8.4.so
#4  0x4030643e in Tcl_Panic () from /usr/local/lib/libtcl8.4.so
#5  0x4030d4e8 in Tcl_Release () from /usr/local/lib/libtcl8.4.so
#6  0x4038b5c1 in TkSendCleanup () from /usr/local/lib/libtk8.4.so
#7  0x403805d5 in TkpCloseDisplay () from /usr/local/lib/libtk8.4.so
#8  0x4037a4cd in TkCloseDisplay () from /usr/local/lib/libtk8.4.so
#9  0x4037c76f in DeleteWindowsExitProc () from /usr/local/lib/libtk8.4.so
#10 0x402e03bb in Tcl_Finalize () from /usr/local/lib/libtcl8.4.so
#11 0x402e01a0 in Tcl_Exit () from /usr/local/lib/libtcl8.4.so
#12 0x402c4265 in Tcl_ExitObjCmd () from /usr/local/lib/libtcl8.4.so
#13 0x402bef34 in TclEvalObjvInternal () from /usr/local/lib/libtcl8.4.so
#14 0x402e1ab8 in TclExecuteByteCode () from /usr/local/lib/libtcl8.4.so
#15 0x402e0fe4 in TclCompEvalObj () from /usr/local/lib/libtcl8.4.so
#16 0x402bfe62 in Tcl_EvalObjEx () from /usr/local/lib/libtcl8.4.so
#17 0x401d6f27 in ip_eval_real (self=1075569172, cmd_str=0x81551e8 "exit", 
    cmd_len=4) at tcltklib.c:3221
#18 0x401d756e in ip_eval (self=1075569172, str=1075569152) at tcltklib.c:3342
#19 0x0805bafe in rb_call0 (klass=1075572892, recv=1075569172, id=10609, 
    oid=10609, argc=1, argv=0xbfffee44, body=0x401be818, nosuper=0)
    at eval.c:5381
#20 0x0805c566 in rb_call (klass=1075572892, recv=1075569172, mid=10609, 
    argc=1, argv=0xbfffee44, scope=0) at eval.c:5730
#21 0x0805731f in rb_eval (self=1075636672, n=0x401be228) at eval.c:3229
#22 0x0805352c in eval_node (self=1075636672, node=0x401be228) at eval.c:1287
#23 0x08053a15 in ruby_exec () at eval.c:1456
#24 0x08053a75 in ruby_run () at eval.c:1477
#25 0x08051f12 in Letext () at main.c:50
#26 0x4009013f in __libc_start_main (main=0x8051ef0 <main>, argc=5, 
    ubp_av=0xbffff5a4, init=0x8051304 <_init>, fini=0x80c5600 <_fini>, 
    rtld_fini=0x4000c770 <_dl_fini>, stack_end=0xbffff59c)
    at ../sysdeps/generic/libc-start.c:129
----------------------------------------------------------
-- 
                                         永井 秀利 (九工大 知能情報)
                                             nagai@ai.kyutech.ac.jp

In This Thread

Prev Next