记得这个问题是发生在一个警急的项目上,从发现到解决时间在一个小时左右。
以下是事后追补的说明文档,贴在这:
----------------------------------------------------------------------------------------------------------------------
下午接到一项目现场工程师的电话,说有两台Debian的服务器不能发送短信,但另外有一台服务器CentOS5是正常的。
我们发送短信的方案是将短信猫通过串口接入Linux服务器,然后通过PDU协议发送出去。
在排除了短信猫没接好,或者使用的不是中国移动SIM卡这种非技术故障后,我开始翻查实现代码,
看是否代码中会有特殊的环境和类库上的要求(因为CentOS5在现场是正常的)。
考虑到项目紧急,会马上有演示的需求,所以用QQ协作,连上现场工程师的桌面,然后用SSH连至服务器,跟踪日志。
发现程序确实按需进入到了发短信的代码,但却没有正常执行。
于是,用最笨的办法开搞,通过增加打印日志的方式,重新编译程序传过去运行,
发现最后是
mbstowcs() 系统库函数返回失败,这是中文转换的问题。
我发现程序中是强制指定源为GB18030:
-
setlocale(LC_CTYPE,"zh_CN.GB18030");
通过命令行设置语言环境,发现报错。过程大致是:
执行:export LANG='zh_CN.GB18030'
然后运行:locale
如果输出中有类似这样的行,则表示系统不支持GB18030:
locale: Cannot set LC_CTYPE to default locale: No such file or directory
查看了系统中的中文字符库目录/usr/share/i18n/,发现有GB18030的文件:
奇怪了,于是继续度娘。找到了这样的说明:
修改
/etc/locale.gen
注: 这个文件在我的CentOS上没有发现。
将GB18030的那行取消注释,保存,再执行 locale-gen 命令。
会有这样的输出:
Generating locales (this might take a while)...
zh_CN.GB18030... done
en_US.UTF-8... done
Generation complete.
重新启动程序,问题触决了。
阅读(3162) | 评论(0) | 转发(0) |