zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    17. Letter Combinations of a Phone Number
    16. 3Sum Closest
    15. 3Sum
    14. Longest Common Prefix
    13. Roman to Integer
    12. Integer to Roman
    11. Container With Most Water
    10. Regular Expression Matching
    9. Palindrome Number
    8. String to Integer (atoi)
  • 原文地址:https://www.cnblogs.com/sunblackshine/p/1982940.html
Copyright © 2011-2022 走看看