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


    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

  • 相关阅读:
    Java-idea-FindBugs、PMD和CheckStyle对比
    Java-idea-PMD源文件级别潜在bug查看
    Java-idea-FindBugs字节码级别潜在bug查看
    Java-idea-Checkstyle自动化代码规范检查
    js-jquery-从SweetAlert到SweetAlert2
    js-jquery-SweetAlert2【二】配置与方法
    js-jquery-SweetAlert2【三】INPUT TYPES
    js-jquery-对象与JSON字符串互相转换
    js-jquery-数组遍历
    java-小技巧-001-Long序列化到前端js不支持
  • 原文地址:https://www.cnblogs.com/sunblackshine/p/1982940.html
Copyright © 2020-2023  润新知