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

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



潮田です。

>  gdb 使えるんなら printf debug や表層的な調査でなく、落ちて
> いる箇所のコードを特定出来ると思うんですが...。
すいません、その通りです。
私の腕がもっとあれば、ですが。
(「この patch を次期リリースに入れてください」の一言で
終わっていたと思います)


>  でも SIGILL ですか?SIGSEGV で落ちるという話だったかと思う
> んですが。SIGILL は一体どういうケースで発生しているんでしょ
> う?
単純に、 shell から FDclone を実行するか、 gdb 上で実行するか
にかかっているように見えます。

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

$ sleep 3
Segmentation fault
shiota@ <~/src/OTHER/FD/FD-2.02a> $

の様に、 SIGSEGV で shell へもっどてきます。
これを gdb ./fd で実行すると、

(gdb) run  -SHELL=fdsh

$
`exit' で FD に戻ります.
$ sleep 3

Program received signal SIGILL, Illegal instruction.
0x00000000 in ?? ()
(gdb) bt

と SIGILL になります。


また、上記の bt の結果ですが、下の様になります。
(gdb) bt
#0  0x00000000 in ?? ()
#1  0x1004795c in trap_common (sig=0) at system.c:1994
#2  0x1004730c in trap_chld () at system.c:2163
#3  <signal handler called>
#4  0xd01856fc in sigaction () from /usr/lib/libc.a(shr.o)
#5  0xd01e00b8 in signal () from /usr/lib/libc.a(shr.o)
#6  0x1004795c in trap_common (sig=541381720) at system.c:1994
#7  0x1004730c in trap_chld () at system.c:2163
#8  <signal handler called>
#9  0xd01856fc in sigaction () from /usr/lib/libc.a(shr.o)
#10 0xd01e00b8 in signal () from /usr/lib/libc.a(shr.o)
#11 0x1004795c in trap_common (sig=0) at system.c:1994
#12 0x1004730c in trap_chld () at system.c:2163

これ以下は、 #8 - #12 を一ブロックにして無数に繰り返しています。
(無数ではないのでしょうが数十ではきかないので打ち切りました)
これは、落ちるまでじっと待っている時になるようで、 enter に
限らず何らかのキーを押したりしていると、落ちるまでの時間が
短くなり、先のメールのような bt が出ます。


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

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


潮田