故障排除
问题一:编译过程出现m32问题
现象描述:
编译过程出现m32问题,如图1所示。
可能原因:
ARM架构中的gcc没有-m32这个编译选项,将-m32这个参数修改成-fPIC即可。
处理步骤:
sed -i 's/-m32/-fPIC/' build/common.mak make -j4
问题二:编译过程出现expat无法识别错误
现象描述:
在编译expat提示当前编译类型无法找到,如图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所示。
可能原因:
问题原因同上。
解决方法一:指定平台,手动编译。
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显示。
可能原因:
由于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版本已解决。
可能原因:
本文档采用的是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所示。
可能原因:
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所示。
可能原因:
编译成功后运行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。
