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
检查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