代码改变世界

coreseek 出现段错误和Unigram dictionary load Error 新情况(Gentoo)

2011-03-13 20:35  sunblackshine  阅读(1601)  评论(0编辑  收藏  举报

coreseek-3.2.14 稳定版

1、在运行 indexer 和 search 时出现段错误

如下:

sunshine@gentoo ~/Thesis/coreseek-3.2.14/csft-3.2.14/src $ ./indexer  --config /usr/local/coreseek/etc/coreseek.conf main
Coreseek Fulltext 3.2 [ Sphinx 0.9.9-release (r2117)]
Copyright (c) 2007-2011,
Beijing Choice Software Technologies Inc (http://www.coreseek.com)

 using config file '/usr/local/coreseek/etc/coreseek.conf'...
indexing index 'main'...
段错误

--with-debug 编译后 用gdb 跟踪 可发现

相关参数:

./configure --prefix=/usr/local/coreseek --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg --with-mmseg-libs=/usr/local/mmseg3/lib --with-mysql --with-python --with-iconv --with-debug

(--with-debug 是为了去掉编译时的优化参数,以在gdb中print 变量)

不断的断点跟踪,最终锁定目标..

1213			ARRAY_FOREACH ( i, dIndexes )
(gdb) 
1215				if ( !hConf["index"](dIndexes[i]) )
(gdb) 
1218					bIndexedOk |= DoIndex ( hConf["index"][dIndexes[i]], dIndexes[i], hConf["source"] );
(gdb) 
indexing index 'main'...

Program received signal SIGSEGV, Segmentation fault.
0xb7d0dfc8 in EVP_PKEY_CTX_dup () from /usr/lib/libcrypto.so.1.0.0
(gdb) 
Single stepping until exit from function EVP_PKEY_CTX_dup,
which has no line number information.

Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
(gdb) 
The program is not being run.

可以看到,在DoIndex 时出现问题,我没有跟进 因为下面出现错误提示了,网上搜索,发现是Gentoo 的上游bug

http://bugs.gentoo.org/353759

检查python 是否有新版本... eix dev-lang/python

发现有新版本 dev-lang/python-2.6.6-r2

于是 emerge

更新后,解决问题。

2、将 Windows 下生成的索引文件 xxx.sp* 拷贝到Gentoo下来用,结果出现问题了...

运行 searchd

/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/coreseek.conf --console

没有任何问题

然后调用 api 去访问

api/test

Unigram dictionary load Error

检查配置文件

/usr/local/coreseek/etc/coreseek.conf

......
     charset_dictpath        = /usr/local/coreseek/dict
     charset_type            = zh_cn.utf-8
......

其中 /usr/local/coreseek/dict 下有 mmseg.ini  uni.lib 且配置正常。

所有配置都是正常的却出现 Unigram dictionary load Error, 神马奇怪的事情都让我碰上了。

ok,我们还是用strace来跟踪一下 发现问题(调试信息已经丢失了...就不贴了)

大体是这样的:

open("C:/usr/local/coreseek/etc/uni.lib") No such file or directory

晕了,这是linux下,居然出现windows路径,开始我认为是配置文件或者源代码的问题,就去查...最后发现源代码中读取 dict 目录( uni.lib)的方式不是读取coreseek.conf 配置文件,而是...header文件,这个可能是考虑到indexer 生成后中文分词的词典不能改变的原因,但是我感觉这个应该读取配置文件中的配置选项更加合理,应该是一个小bug。

具体配置代码在 sphinx.cpp:3135

    //read chinese dict setting
	tSettings.m_sDictPath		= tReader.GetString ();

这个 tReader 是读取的  /usr/local/coreseek/var/data/mysql-python-main.sph

ok, 我们可以直接看二进制文件

vim /usr/local/coreseek/var/data/mysql-python-main.sph

发现其中确实有一个字符串

...乱码  C:/usr/local/coreseek/etc/ ...乱码

我直接在这里修改了二进制文件,但是事实证明不管用,又出现了缓冲区溢出等等问题,应该是字符串长度不匹配的问题,这个 sph 文件是有一定格式的。

(我去掉C: 两个字符,又补充了两个字符,还是不成..)

最后还是重新生成 indexer