From: Hidetoshi NAGAI Date: 2005-01-26T11:58:07+09:00 Subject: [ruby-dev:25537] Re: some problems on ext/tk/sample/**/*.rb 永井@知能.九工大です. From: H.Yamamoto Subject: [ruby-dev:25530] Re: some problems on ext/tk/sample/**/*.rb Date: Wed, 26 Jan 2005 02:22:30 +0900 Message-ID: <20050126022227.7BE14A80.ocean@m2.ccsnet.ne.jp> > >念のための確認ですが,上記を > > > > if (!ip_null_namespace(ptr->ip) && Tcl_GetCommandInfo(ptr->ip, finalize_hook_name, &info)) { > > > >と変更しても同じでしょうか? > > 同じでした。デバッガの情報を見る限りは、Tcl_FindCommand > > (http://cvs.sourceforge.net/viewcvs.py/tcl/tcl/generic/tclNamesp.c?rev=1.71&view=auto) > > の中で > > cxtNsPtr = (Namespace*)Tcl_GetCurrentNamespace(interp) > > が呼ばれて、その後 cxtNsPtr を触る部分 > > if (cxtNsPtr->cmdResProc != NULL > > で落ちているように見えます。 (;_;)(;_;)(;_;)(;_;) だとしたら状況はかなり厳しいです. ip_null_namespace() は,問題の Tcl_GetCurrentNamespace() が NULL を返すかをチェックしています. Tcl_FindCommand() は Tcl_GetCommandInfo() の最初で呼ばれ, さらに Tcl_GetCurrentNamespace() も Tcl_FindCommand() の中で ほぼ最初に呼ばれる関数です. "!ip_null_namespace(ptr->ip) && Tcl_GetCommandInfo(...)" ですから, Tcl_GetCommandInfo() が呼ばれる時には Tcl_GetCurrentNamespace() の 戻り値は NULL ではないことを期待しています. というわけで,件の個所で SEGV で落ちるということは, Tcl_GetCurrentNamespace() の戻り値が元々不正アドレスを指しているか, ip_null_namespace() の呼び出し以降のわずかな間に NULL に変化しているか ということになりますよね? お手数ですが,関数呼び出しのステップをさらに減らすために, if (!ip_null_namespace(ptr->ip) && Tcl_GetCommandInfo(ptr->ip, finalize_hook_name, &info)) { を fprintf(stderr, "Tcl_GetCurrentNamespece() == %lx\n", Tcl_GetCurrentNamespace(ptr->ip));fflush(stderr); if (Tcl_GetCurrentNamespace(ptr->ip) != (Tcl_Namespace*)NULL && Tcl_GetCommandInfo(ptr->ip, finalize_hook_name, &info)) { にして試してみていただけないでしょうか. これでもだめとなると,お手上げに近いです. 「順序を入れ替えると落ちない」という点に期待して, 根拠不明のまま処理順を入れ替えるか, いっそのこと,Tcl_GetCommandInfo() でのコマンド存在確認を行わずに Tcl_Eval() の呼び出しを強行してしまうか... そのくらいしかできそうにありません. > # しかし、同じ tcl の dll を使っているのに、bcc32 だけ落ちるのが不思議です。 ですね.(;_;) -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp