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

[FDclone-users:00098] Re: AIX でのコンパイルエラーについて



 しらいです。

In Message-Id <03Feb10.143446jst.119047@inetgw.lightwell.co.jp>
        SHIOTA Shoichi <Shoichi.Shiota@lightwell.co.jp>さんwrites:
> 潮田です。

> shiota@ <~/src/OTHER/FD/FD-2.02a> $ ./fdsh
> $ sleep 2
> Illegal instruction
> shiota@ <~/src/OTHER/FD/FD-2.02a> $ ./fdsh
> $ set +m
> $ sleep 2
> Illegal instruction
> 
> と変わらないようです。

 +m と NOJOB とで結果が違うということは、job control 周りが
原因なのではなく、job control 用の memory 管理で leak か何か
起きているのかも知れませんね。
 NOJOB の場合は二度と job control が行なわれることがないの
で、その辺りの管理は全く無視出来るのですが、+m の場合は動的
に変化するので job control に必要な制御の準備だけは行なって
います。
 その制御に用いる配列を幾つか確認してみたのですが、そう簡単
には見つかりそうにないですね。


> Makefile.tmp の DEBUG に -g をつけた fdsh で試しました。
> この行にさらに -DJOBVERBOSE をつけると

 JOBVERBOSE は fdsh では使えなくて fd の方で確認するしかあ
りません。fdsh の方は機能を落としているので、JOBVERBOSE に堪
えられないんですね。
 fdsh でも使えるようにするには下記 patch をあててみて下さい。

---- Cut Here ----
diff -u old/posixsh.c ./posixsh.c
--- old/posixsh.c	Wed Nov 20 13:40:23 2002
+++ ./posixsh.c	Fri Feb  7 18:57:18 2003
@@ -60,6 +60,7 @@
 extern int kanjifputs __P_((char *, FILE *));
 #else	/* !FD */
 extern int ttyio;
+FILE *ttyout = NULL;
 #define	Xaccess(p, m)	(access(p, m) ? -1 : 0)
 #define	kanjifputs	fputs
 # ifdef	DEBUG
@@ -197,6 +198,7 @@
 	Xsigblock(omask, mask);
 
 #ifdef	JOBVERBOSE
+	if (!ttyout && !(ttyout = fdopen(ttyio, "w+"))) ttyout = stderr;
 	fputs("gettermio: ", ttyout);
 	fputlong(mypid, ttyout);
 	fputs(": ", ttyout);
@@ -379,6 +381,7 @@
 	}
 
 #ifdef	JOBVERBOSE
+	if (!ttyout && !(ttyout = fdopen(ttyio, "w+"))) ttyout = stderr;
 	fputs("stackjob: ", ttyout);
 	fputlong(mypid, ttyout);
 	fputs(": ", ttyout);
---- Cut Here ----

# 手動で作ったので行数を数え間違えているかも。


> あと、 FDclone で SIGILL を起こした時の gdb による bt も
> つけておきます。

 gdb 使えるんなら printf debug や表層的な調査でなく、落ちて
いる箇所のコードを特定出来ると思うんですが...。
 でも SIGILL ですか?SIGSEGV で落ちるという話だったかと思う
んですが。SIGILL は一体どういうケースで発生しているんでしょ
う?


> FDclone についてくる README を表示し、 q で PAGER を終了させ
> (反応がないので)enter を数回打った後の画面です。

 SIGILL は SIGILL で別途調査するとして、SIGSEGV の方は条件
を単純化させるために以下の手順で落とした場合を調べてみて貰え
るでしょうか?
	1. ./fd -SHELL=fdsh で起動。
	2. 「h」(EXECUTE_SH) で shell 起動。
	3. Enter のみを入力して内部 shell モードに移行。
	4. 「sleep 3」で落ちるまで待つ。
 確か外部コマンドが終わった時点で落ちるという話だったと思う
ので、ls や cat のように一瞬で終わるコマンド以外で試して下さ
い。sleep だと端末も使わないので丁度良いと思います。


> #1  0x1004ba4c in waitjob (pid=268724996, wp=0x204544e8, opt=0) at system.c:2577

 該当行には waitpid() がいますね。AIX は wait4() は持ってな
いんでしたっけ。どうも pid の値が妙な値になっていそうです。


> #2  0x1004b63c in waitchild (pid=-803755616, trp=0x20454478) at system.c:2699

 こっちの pid はそのまま waitjob に渡される筈なのですが、上
の値とはまるで関係ありませんね。んー、signed と unsigned の
違いでもなさそうですし、何かの pointer 値でも渡っているんで
しょうか。元々は fork() の返り値なんですが。


> # sizeof(long) と sizeof(pid_t) が違うのかと愚考しましたが、
> # どちらも 4 でした。

 pid_t を使ってしまうと古い OS で compile 出来なくなってし
まうんですよね。waitpid() を使う OS では pid_t にしてしまっ
てもいいかも知れません。
 でも、今回のケースでは特にそれが原因とも思えないんですが。

                                               しらい たかし