coreseek 出现段错误和Unigram dictionary load Error 新情况(Gentoo)
时间:2011-03-13 来源:sunblackshine
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