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

  • 相关阅读:
    SQLServer分组加序号,只取某个对象指定条件的前几个
    SQLServer用with temptb AS临时表查询或者更新字段,将某个字段赋值成某个字段的值
    KMP算法
    java知识点
    程序接口设计的六大原则
    罗马数字转int
    使用github作为maven仓库存放发布自己的jar包依赖 实现多个项目公共部分代码的集中,避免团队中多个项目之间代码的复制粘贴
    java mybatis中大于号小于号的转义
    两个有序数组 A1 A2 的合并
    Mysql_设置root指定的ip访问或连接数据库
  • 原文地址:https://www.cnblogs.com/sunblackshine/p/1982940.html
Copyright © 2011-2022 走看看