之前在做28181服务开发的时候有意使用了boost库,以及VS 2010以及CentOS 7 自带 GCC都能支持的C++11的特性,月初发现程序好像不正常工作了。日志拉取还真是一个漫长的过程,好的一点是之前日志还算打的足够详细,特别是异常错误部分,所以很容易就找到了出错日志。
关于正则的使用
直接定位到最初出问题的时间点,发现程序已经不打日志了,而且工作线程捕获了 regex_error 异常,然后退出了,怪不得工作不正常了,在日志附近发现了一些HTTP请求,然后无其他异样。
基本情况就是这样,既然是正则的异常,直接搜一下代码看看,发现在HTTP模块中使用了,其他地方没使用。
关于HTTP功能,原来服务程序提供的是RTMP推流功能,为了便于调试,我自己又增加了一个 HTTP-FLV 服务,对外提供FLV直播流播放功能,使用起来确实是非常方便,也比RTMP实时性好多了。
为了方便,对HTTP中关键信息使用的是C++11的正则表达式进行提取,综上,基本确定是正则抛的异常了。但是正则会抛异常吗?我找到了下面的网址看了看,地址 terminate called after throwing an instance of ‘std::regex_error’。话不多说,直接上Linux测试一下,确实会抛异常,基本确定了问题,捕获即可。
转念一想,不对啊,我的正则表达式很简单,在很多工具都测试过的,没理由是错误的啊,直接测试一下 std::regex_match 的DEMO代码(代码在网页底部),同样异常了,看来不是我的锅。
正则问题剖析
本来想调试一番,又感觉不是太懂里面原理,就放弃了,直接百度,基本都是说 GCC 4.9可用,细查系统的GCC为4.8版本,再查发现GCC的4.8版本的正则基本就没实现。详见:
What part of regex is supported by GCC 4.9?
Is gcc 4.8 or earlier buggy about regular expressions?
Bug 53631 C++11
不多说了,上面解释的很详细了。怎么办呢,要不然升级4.9版本,要不然使用 pcre
或者 boost.regex
,总之选择还是挺多的。
反思问题
想想这个问题,其实还是测试不够,之前开发了Windows版本,测试是没有问题的,转移到Linux编译成功了做了基本测试,这个功能应该是没测试的,虽然不是正式使用的功能,但还是对外提供了端口,只要有数据访问,基本就会导致服务挂掉。以后还是要更加仔细,避免类似问题再发生。
顺便吐槽下,没实现的功能为毛可以编译啊!