Namazu-win32-users-ja(旧)


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

Re: Namazu 検索時にページ違反で終了する



しみずと申します

「Namazu 検索時にページ違反で終了する」件について、一応の解決を見ま
したので報告します。

行ったことは、etc/mknmzrc の $MAX_FIELD_LENGTH を 800からとりあえず
500と小さくすることで、問題のファイルがページ違反を起こすことなく結
果に出力されるようになりました。

【わかったこと】

問題はインデクスファイルにあるらしい、ということで、NMZ.* ファイル
を2.0.6と2.0.7で作成したものとで比較してみました。

そのうち、NMZ.files.summary に含まれているサマリのうち、ページ違反
が出てしまうファイルのサマリが長いと前述のエラーが起ることがわかり
ました(実は2.0.6の$MAX_FIELD_LENGTHはデフォルトの200だったのです)。

もう少し詳しく書きますと、該当個所のサマリは793バイトあり、後半から
1文字づつ短くしてみると、11バイト短くして782バイトとなった時点でペ
ージ違反は起きなくなりました。

該当ファイルはディレクトリの深い場所にあるためファイル名は109バイト
あり、その他のサマリも含めると正常に表示された場合の文字数の合計は
(どこから数えるかにも依りますが)1044バイトとなり、これ以上の長さに
なるとDOS窓で結果を表示する際に MSVCRT.DLL でページ違反が起きるよう
です。

すなわち、ファイル名+サマリ+α の合計の文字数が1024バイトあたりを
超えたところで、Windows/DOS の仕様、というか、バグにより、ページ違反
が起きるようです(Windows UpDate でライブラリのアップデートも行いま
したが、効果はありません)。

そのため、はじめにも述べたように $MAX_FIELD_LENGTH の値を小さめに取る
ことで、ページ違反を起こすことなく正常に表示できることになります。

この問題の原因は Namazu ではなく Windows 側にあると考えられますが、
$MAX_FIELD_LENGTH を設定する際、サンプルにある
# This MUST be smaller than libnamazu.h's BUFSIZE (usually 1024).
を読んで、 「1024以下ならいいのだろう」と思ったところにそもそもの
原因があります。

DOSではパスを含むファイル名の最大長はたしか128バイト程度が限界だった
と思いますが、それから考えるとここに指定する数値は1024よりもかなり
小さくする必要があるのではないでしょうか?

#
# と、これだけでは何ですので、少々補足。
#

Namazu の検索結果をDOS窓に出力する場合のみならず、-O オプションで
ファイルに出力する場合にも同様にページ違反が発生しますが、同時に
-h オプションをつけておくと発生しません。

この問題はそもそも Search-S を使って検索していた際に起ったものですが、
結果を -O オプション(ただし -h は無し)で得る同種のプログラムでも
起きる可能性があると思われます。

以上、ご報告いたします。


Tokuro ShiMiZu    blauseen@xxxxxxxxxxxxxxxx