Luk*_* Z. 5 c++ qt memory-leaks websocket
首先,我在我的安全websocket服务器应用程序上运行valgrind并发现了一个问题(在Qt Memcheck中我必须检查"外部错误"才能看到它) - 一些字节肯定会丢失 - 指向main我的QCoreApplication::exec()呼叫所在的位置.在堆栈跟踪中,在调用之后,只有一些Qt库,从开头到libQt5Core结尾libQt5WebSockets.丢失的字节数随着连接数的增加而增加.我仔细检查了我删除了QWebSocket返回的所有实例QWebSocketServer::nextPendingConnection().我也删除了QWebSocketServer实例.有趣的是,valgrind在运行sslechoserver演示时也没有报告任何错误,也没有在不安全模式下运行我的服务器(没有SSL).我不知道这是否是一个实际问题.
其次,更重要的是,我观察到消耗的内存随着每个新连接不断增加(即使旧连接已关闭且QWebSocket实例被删除,实际上大部分时间都有0或1个活动连接)在我的应用程序和sslechoserver演示.我在Ubuntu上使用systemmonitor,在Windows上使用Windows任务管理器进行观察.在建立了数万个连接之后,报告的内存使用量为几十兆字节,而在应用程序生命周期的开始时,它大约为1.5 MB.
我用Qt 5.5.1和5.6.0(Ubuntu上的GCC,Windows上的MSVC)测试了它.
我弄错了吗?Qt的websockets中有错误吗?是sslechoserver演示不正确的?
更新:我也尝试过echoserver演示(没有SSL),消耗的内存也在不断增加.
更新2:我们得出结论,Qt中肯定存在错误.错误报告在这里:https: //bugreports.qt.io/browse/QTBUG-53503
更新:我怀疑底层是否QTcpSocket必须由用户管理。然而,从 Qt 5+ 开始,情况似乎并非如此。请参考:当套接字错误发生时,QWebSocket 底层的 QTcpSocket(或 QSslSocket)是否会被自身破坏?。
答案中不正确的部分已在下面划掉。
当我们将 a 升级QTcpSocket为QWebSocketusingQWebSocketServer::handleConnection()方法时,两个套接字在不同的内存地址上都保持活动状态!
换句话说,QWebSocket充当包装器,所有套接字通信都通过底层进行QTcpSocket。因此,我们每管理 1 个 Web 套接字,就会多出 1 个隐藏的 TCP 套接字。
当两个套接字deleteLater()要被销毁时,应该使用机制来处理它们。
至少对于 TCP 到 Web 的升级来说,这种情况是正确的。
| 归档时间: |
|
| 查看次数: |
491 次 |
| 最近记录: |