永井@知能.九工大です.
表題の状況で困っています.どなたかお助けいただけると助かります.
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