GCC4.8正则异常问题

之前在做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 is unimplemented

不多说了,上面解释的很详细了。怎么办呢,要不然升级4.9版本,要不然使用 pcre 或者 boost.regex,总之选择还是挺多的。

反思问题

想想这个问题,其实还是测试不够,之前开发了Windows版本,测试是没有问题的,转移到Linux编译成功了做了基本测试,这个功能应该是没测试的,虽然不是正式使用的功能,但还是对外提供了端口,只要有数据访问,基本就会导致服务挂掉。以后还是要更加仔细,避免类似问题再发生。

顺便吐槽下,没实现的功能为毛可以编译啊!

最近的文章

Tornado静态文件跨域设置

最近用 Python 做了 Tensorflow 的服务,搭建web服务框架,就使用了比较熟悉的 Tornado 框架,框架用起来非常简单快捷,一般最终使用的时候是个单独的服务,因此顺手给简单的加了跨域的头。 自以为的设置直接找个DEMO看一下,就开始实现代码,由于是图像识别,因此分了两步,第一步是 …

技术 继续阅读
更早的文章

Tensorflow加速

最近在研究学习Tensorflow的图像的物体识别功能,Python迁移学习用起来爽的不要不要的,但是机器才是2G的750Ti显卡,不说训练了,就是检测识别i7 6700也是十几二十秒,效果很差。当然一般深度学习是用GPU,1060显卡起且显存至少8G起,但是我木有显卡啊,自从挖矿导致的显卡涨价之后 …

技术 继续阅读