修复了两个bug

来源:互联网 发布:淘宝助理自定义打印 编辑:程序博客网 时间:2024/04/25 16:58

基于gsoap写了一个长时间运行的服务器,然而在实际使用中,经常出现程序突然中断异常退出的情况。经过长时间的调试,终于基本解决了这个问题


1是之前说的内存出错的问题,后来发现每次出错的地方都在QDateTime::currentDateTime()函数上,而且是在这里面出现new/malloc失败,然后程序就中断了

看了qt的源码,发现qt在QDateTime的构造函数中默认new了一个对象存放时间信息,并用智能指针的方式去管理。难道是这个释放的有问题?因此后续改成直接使用linux的gettimeofday的函数获取系统时间,虽然不一定准确,但是满足使用的需求还是可以的,更换了之后,原来的服务器运行了好几天也没出现中断的情况了


2是发现用soap接口,在短时多次调用时服务器也会崩溃,给出的信号是SIGPIPE;通过在网上查找原因,发现这个SIGPIPE出现的时候,一般是在进行send数据时,管道socket已经被删除或释放的,系统通知了这个信号,然而默认处理这个信号则采用中断的这种方式,导致服务器也卡住了。猜想原因可能是短时间大量进行了soap通信,而soap通信之前没有设置成长连接的方式(也不确定设置keepalive是否有效),可能导致说管道提前释放?原因没有继续查明,但是这里首先将soap设置了keepalive、此外对系统抛出的SIGPIPE进行处理,不让其进行中断,保持服务正常运行。目前来看这样处理后也可以长时间运行了

原创粉丝点击