< 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