文档首页 > > 移植指南> 其他> 移植KBEngine> 故障排除

故障排除

分享
更新时间:2020/06/18 GMT+08:00

问题一:编译过程出现m32问题

现象描述

编译过程出现m32问题,如图1所示。

图1 m32问题

可能原因

ARM架构中的gcc没有-m32这个编译选项,将-m32这个参数修改成-fPIC即可。

处理步骤

sed -i 's/-m32/-fPIC/' build/common.mak 
make -j4

问题二:编译过程出现expat无法识别错误

现象描述

在编译expat提示当前编译类型无法找到,如图2所示。

图2 无法识别

可能原因

自带“config.guess”版本不匹配。

解决方法一:指定平台,手动编译。

cd lib/dependencies/expat/
./configure --build=arm-linux
make
cd -
make -j4

解决方法二:替换expat自带“config.guess”

cd lib/dependencies/expat/
mv conftools/config.guess conftools/config.guess.bak
cp /usr/share/automake-1.13/config.guess conftools/
cd -
make -j4

如果没有automake请通过yum install automake,本次测试环境使用的是automake-1.13版本。

问题三:编译过程出现log4cxx无法识别错误

现象描述

在编译log4cxx提示当前编译类型无法找到,如图3所示。

图3 无法找到编译类型

可能原因

问题原因同上。

解决方法一:指定平台,手动编译。

cd lib/dependencies/log4cxx/
./configure --build=arm-linux --with-apr=../apr --with-apr-util=../apr-util 
make
cd - 
make -j4

解决方法二:替换log4cxx自带“config.guess”

cd lib/dependencies/log4cxx/
mv config.guess config.guess.bak
cp /usr/share/automake-1.13/config.guess .
cd -
make -j4

问题四:汇编代码跨平台支持问题

现象描述

汇编代码跨平台支持问题,如图4显示。

图4 跨平台支持问题

可能原因

由于ARM架构中,没有timestamp_rdtsc函数中使用的寄存器,需修改函数实现。

处理步骤

“lib/common/timestamp.h”中的timestamp_rdtsc()函数,替换为如下代码:

inline uint64 timestamp_rdtsc()
{
#if defined(__x86_64__) || defined(__amd64__)
                   uint32 rethi, retlo;
                   __asm__ __volatile__(
                  "rdtsc":
                   "=d"    (rethi),
                   "=a"    (retlo)
                                     );
                   return uint64(rethi) << 32 | retlo
#elif defined(__aarch64__)
        int64_t virtual_timer_value;
        asm volatile("mrs %0, cntvct_el0" : "=r"(virtual_timer_value));
        return virtual_timer_value;
#else
#error "not support"
#endif
}

问题五:jemalloc ARM平台兼容性问题

现象描述

kbengine 2.5.2版本已集成jemalloc 5.2.0版本,可跳过此问题。

kbengine内置的jemalloc版本如果低于v5.2.0版本,该版本在ARM运行会出现段错误,如图5所示。该问题在jemalloc v5.2.0版本已解决。

图5 兼容性问题

可能原因

本文档采用的是jemalloc 5.2.0版本。

处理步骤

查看kbengine当前集成的jemalloc版本号。

vi lib/dependencies/jemalloc/ChangeLog

如果版本号低于5.2.0版本,则下载jemalloc 5.2.0及以上版本,并进行重新编译。

下载jemalloc 5.2.0及以上版本,并进行重新编译。

cd lib/dependencies/
mv lib/dependencies/jemalloc  lib/dependencies/jemalloc_back
wget https://github.com/jemalloc/jemalloc/archive/5.2.0.tar.gz
tar xvf 5.2.0.tar.gz
mv jemalloc-5.2.0 jemalloc
cd jemalloc/
autoconf
./configure
make
#重新编译kbengine
cd ../../../
make -j4

问题六:编译过程出现不同平台gcc对char类型默认定义不同的问题

现象描述

编译过程出现不同平台gcc对char类型默认定义不同的问题,如图6所示。

图6 默认定义不同

可能原因

x86上的gcc把char定义为signed char;而ARM平台上使用的arm-linux-gcc却把char定义为unsigned char。

解决方法:

在编译时加-fsigned-char参数,指定char为signed char。

修改src路径下的“build/common.mak”文件,修改方法如下:

vim build/common.mak 
注释一行:
#CXXFLAGS += -Werror    
新增一行:
CXXFLAGS += -fsigned-char
make

问题七:编译成功后运行dbmgr进程出连接失败

现象描述

启动测试程序出现:"InterfacesHandler_Interfaces::reconnect(): couldn't connect to(interfaces server): 127.0.0.1:30099! ",如图7所示。

图7 连接失败

可能原因

编译成功后运行dbmgr进程出连接失败。

解决方法:

修改InterfacesHandler_Interfaces::reconnect()函数中select函数的超时设置(函数所在的文件路径为“kbengine-2.5.2/kbe/src/server/dbmgr/interfaces_handler.cpp”),修改方法如下:

//struct timeval tv = { 0, 2000000 };//原函数
struct timeval tv = { 2, 0 };//修改后的配置

修改完成后,请重新编译该工程即可,不需要执行make clean

分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!非常感谢您的反馈,我们会继续努力做到更好!
反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

智能客服提问云社区提问