| < Previous Date Next > | < Previous Thread Next > | Index by date | Index by thread |
むらけんです.
In message <20021124221728.7B28D72501@xxxxxxxxxxxxxxxxxxxx> at Mon, 25 Nov 2002 07:17:27 +0900,
KOMATSU Shinichiro <koma2@xxxxxxxxxxxxxxxxxxxx> wrote:
> ウチだと dbskkd-cdb-1.01-9m の修正で直りましたが、
> さくさんのところではどうですか?
>
> # 別なところを直したつもりだったのに直ってしまったので、
> # 本当にこれが原因だったのかは調べてないです。
> # 詳しくは patch を。
見てみました.rpm でビルドされる時と同じコンパイルオプションを用いて
gcc -g -O2 -march=i586 -funroll-loops -fomit-frame-pointer -ffast-math -DSERVER_DIR=\"/usr/sbin\" -S dbskkd-cdb.c
でアセンブル言語のソースを吐かせました (-g はデバッグ情報が入
るだけで,コンパイルの結果には影響しません).この出力結果であ
る dbskkd-cdb.s は添付します.
僕が注目したのは,問題の現象より search 関数の
} else if (length == 0) {
syslog(LOG_NOTICE, "end of file detected");
return -1;
}
の部分です.問題の現象はこの部分が無限に実行されることで起こり
ます.
この部分に対応するアセンブリ言語ソースは 189 行目なんですが,
その前の部分から追っていきます.まず 184 行目の
call read
ここで,戻り値が 0 になっていると仮定します.これを仮定しない
と問題の現象は起きません.関数の戻り値は %eax に格納された状態
で返されます.
movl %eax, %ebx
addl $16, %esp
戻り値が %ebx に保存(?)され,read を呼び出す際に使用したスタッ
クをクリアしている部分です.
testl %eax, %eax
js .L68
ここは,if (length > 0) の条件の判定ですが,この js ではジャン
プされません (∵ %eax == 0).ちなみに,testl は2つのオペランド
同士で AND をとってフラグを変化させる命令です.
testl %eax, %eax
je .L69
ここが問題の else if (length == 0) の条件判定で,%eax == 0 よ
り je でジャンプされます.僕も飛びたいと思います.
.L69:
pushl %edi
pushl %edi
pushl $.LC6
jmp .L66
ここでは,syslog を呼び出す時の文字列 "end of file ..." (.LC6)
をスタックに入れています..L66 に飛ぶと
.L66:
pushl $5
call syslog
jmp .L65
実際に syslog が呼び出されます..L65 に飛ぶと
.L65:
addl $16, %esp
ここで syslog を呼ぶ際に使用したスタックがクリアされ
.L9:
addl $3100, %esp
ここで search 関数のローカル変数がクリアされ
popl %ebx
popl %esi
popl %edi
popl %ebp
ret
呼び出し元にリターンします.
問題の現象が起こる場合の search 関数の動きはこれで終りです.し
かし,
return -1;
の -1 がどこにも出てきていません.main 関数の
/* command loop */
while (search() == 0) {}
このコードに対応するアセンブリ言語のソースは 592 行目からの
.L88:
call search
testl %eax, %eax
je .L88
これなんですが,search 関数で,read を呼び出して以後,ret する
までの間,%eax は 0 のままなので,上の .L88 の部分は一生ループ
している事になります.
結論としては,dbskkd-cdb の問題は gcc-3.2 のバグによる現象だと
考えて良いのではないでしょうか?
でわ.
--
1024D/2A3FDBE6 2001-08-26 Kenta MURATA (MURAKEN) <muraken2@xxxxxxxxx>
Key fingerprint = 622A 61D3 280F 4991 4833 5724 8E2D C5E1 2A3F DBE6
Attachment:
dbskkd-cdb.s
Description: Binary data