问题环境描述:
uos系统,amd64的cpu,V20版本,在其他系统上,同样的代码,没有报该错误,到了该平台上则出现了段错误。报错信息如下,猜测:应该是多次释放造成的

#0  0x00007f58ce4f42e9 in OPENSSL_sk_free () from /lib/x86_64-linux-gnu/libcrypto.so.1.1
[Current thread is 1 (Thread 0x7f58abfff700 (LWP 19843))]
(gdb) bt
#0  0x00007f58ce4f42e9 in OPENSSL_sk_free () at /lib/x86_64-linux-gnu/libcrypto.so.1.1
#1  0x00007f58ce48d024 in CRYPTO_free_ex_data () at /lib/x86_64-linux-gnu/libcrypto.so.1.1
#2  0x00007f58ce3c2093 in BIO_free () at /lib/x86_64-linux-gnu/libcrypto.so.1.1
#3  0x00007f58ce3c2b94 in BIO_free_all () at /lib/x86_64-linux-gnu/libcrypto.so.1.1
#4  0x00007f58b07e5545 in SSL_free () at /lib/libssl.so.1.0.0
#5  0x00007f58cf9d645a in  () at /home/tlx/Qt5.9.9/5.9.9/gcc_64/lib/libQt5Network.so.5
#6  0x00007f58cf9bfbe8 in  () at /home/tlx/Qt5.9.9/5.9.9/gcc_64/lib/libQt5Network.so.5
#7  0x00007f58cf9c5aa1 in  () at /home/tlx/Qt5.9.9/5.9.9/gcc_64/lib/libQt5Network.so.5

分析:看到这个报错,通过gdb跟踪,定位到OPENSSL_sk_free就截止了,看前后的调用关系,也看不出来什么,于是看了一下qt支持的openssl版本:

#include <QDebug>
#include <QSslSocket>qDebug() << "当前支持的openssl版本: " << QSslSocket::sslLibraryBuildVersionString();qDebug() << "当前是否支持openssl: " << QSslSocket::supportsSsl();

发现qt5.9.9的版本支持的是1.0.2k:

当前支持的openssl版本:  "OpenSSL 1.0.2k-fips  26 Jan 2017"
当前是否支持openssl:  true

又看了下uos上apt安装的openssl,是1.1.1d,

$ openssl version
OpenSSL 1.1.1d  10 Sep 2019

版本不一样,那么,是不是openssl版本不一样造成的这个问题呢?决定安装一个openssl的1.0.2k的版本,参考我的openssl安装相关文章,安装之后,发现报错变了,报错如下:

munmap_chunk(): invalid pointer

现在openssl的版本一样了,还报错,就只能从代码出发了,查看,https post相关的代码如下:


void filterCertList(QNetworkRequest &networkRequest)
{//================[Begin]:filterCertList================//QSslConfiguration sslcfg = networkRequest.sslConfiguration();sslcfg.setPeerVerifyMode(QSslSocket::VerifyNone);QList<QSslCertificate> cacertlist = sslcfg.caCertificates();QDateTime curdatetime = QDateTime::currentDateTime();for (QList<QSslCertificate>::iterator it_cacert = cacertlist.begin();it_cacert != cacertlist.end();){if ((it_cacert->effectiveDate() > curdatetime) || (it_cacert->expiryDate() < curdatetime)){it_cacert = cacertlist.erase(it_cacert);}else{++it_cacert;}}sslcfg.setCaCertificates(cacertlist);//   if (!m_cert.isNull())
//      sslcfg.setLocalCertificate(m_cert);
//  if (!m_key.isNull())
//      sslcfg.setPrivateKey(m_key);networkRequest.setSslConfiguration(sslcfg);//================[End]:filterCertList================//
}QByteArray post(const QString &url, const QVariantMap &form, const QVariantMap &headers, const QString &textCodecName)
{QNetworkAccessManager nam;QNetworkRequest request;QStringList keys;QString data;request.setUrl(url);request.setRawHeader("Content-type", ("application/x-www-form-urlencoded;charset=" + textCodecName).toLatin1());request.setRawHeader("Accept", "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");keys = headers.keys();foreach(QString key, keys){request.setRawHeader(key.toLatin1(), headers.value(key).toString().toLatin1());}filterCertList(request);keys = form.keys();foreach(QString key, keys){if (!data.isEmpty())data.append('&');data.append(key);data.append('=');data.append(form.value(key).toString());}QNetworkReply *reply = nam.post(request, QTextCodec::codecForName(textCodecName.toLatin1())->fromUnicode(data).toPercentEncoding("&="));if (reply == NULL){return QByteArray();}QTime t;t.start();while (!reply->isFinished()){if (t.elapsed() > 9000){reply->deleteLater();return QByteArray();}if (reply->error() != QNetworkReply::NoError){reply->deleteLater();return QByteArray();}QCoreApplication::processEvents();}QByteArray bytes = reply->readAll();reply->deleteLater();return bytes;
}

使用这一段代码,单独做个例程,是可以正常通讯的,发送接收https消息,但是同样的一段代码,放到项目中就会出现上述问题,怀疑是代码问题,于是又找了一段qt实现https发送的代码,见参考,可以正确发送接收https,但是由于使用了信号槽,变成了异步通讯,我的项目需要同步通讯的模式,导致不能融合,无奈之下,又换了一种方式,使用libcurl,满足我的需求,成功实现https的数据同步发送接收。

虽然问题暂时得以解决,但是问题的本质原因并未找到,还需要继续研究。

先做一个大致猜测:
QNetworkReply *reply = nam.post(request, QTextCodec::codecForName(textCodecName.toLatin1())->fromUnicode(data).toPercentEncoding("&="));这一句代码执行之后,等待服务器端回复数据,接下来就走到了while循环里面,在等待过程中,为了防止卡顿,QCoreApplication::processEvents();起了作用,同时我也怀疑问题就出在这里。QCoreApplication::processEvents()与从中调用它的线程相同,它不使用单独的线程。它将处理事件队列中当前排队的所有事件。这个所有事件。。。里面会不会将数据接收的事件关闭,然后释放内存呢,因为下面我执行QByteArray bytes = reply->readAll();这一句的时候,就会报段错误,或者无效指针的错误。

至于问题原因为什么没有找到。。。嗯。。。不得不承认,我太菜了吧

参考:

  • Qt发起Http/Https请求
  • Qt 之 使用 https发送 HTTP请求(使用OPENSSL库)
  • QT支持https网络请求

qt使用https发送数据遇到的段错误--未解决相关推荐

  1. Git Bash中出现:error: failed to push some refs to ‘https://gitee.com/xxx/xxx.git‘错误的解决方法

    Git Bash中出现:error: failed to push some refs to 'https://gitee.com/xxx/xxx.git'错误的解决方法 今天上传本地文件,在输入:$ ...

  2. 在写QT程序时遇到的几种段错误(内存不能为read)

    学了几天QT,关闭窗口的时候总是出现段错误:我个人遇到的情况有一下几种: 1.析构释放内存的时候出现段错误,最后发现如果先释放主布局,再释放其它布局,就会出现段错误:改为现释放子布局再释放住布局就没事 ...

  3. 7-3 最小生成树-kruskal (10 分)(思路+详解+并查集详解+段错误超时解决)宝 Come

    一:前言 本题需要用到并查集的知识,建议先学完并查集后再看看本题 二:题目 题目给出一个无向连通图,要求求出其最小生成树的权值. 温馨提示:本题请使用kruskal最小生成树算法. 输入格式: 第一行 ...

  4. c语言socket段错误,(Qtcpsocket)退出程序时提示段错误的解决

    这几天使用QT附带的一个example程序fortuneclient,开发了一个tcp通信的小程序,偶然间发现原来的程序存在一个小bug,当填入的ip地址或者端口号错误,关闭程序时,会报段错误,并弹出 ...

  5. Qt中接收串口数据不完整、分段的解决方法

    场景: 最近在串口通信时碰到了一个问题,向485串口发送指定报文,会收到一条关于压力数值的数据.但将其qDebug打印出来却发现数据被分成了两部分依次打印,之后通过验证确定了问题出在readyRead ...

  6. gdb set写text/code段错误的解决办法

    set 命令写代码段时可能会出现 cannot access memory at addres 0xXxxxxxxx 需要使用set write on命令 ftp://ftp.gnu.org/old- ...

  7. php流导出excel内存溢出,phpExcel导出大量数据出现内存溢出错误的解决方法

    phpExcel将读取的单元格信息保存在内存中,我们可以通过 复制代码代码如下: PHPExcel_Settings::setCacheStorageMethod() 来设置不同的缓存方式,已达到降低 ...

  8. OFFICES当出现“向程序发送命令时出现问题”错误怎么解决

    首先,当我们打开Excel出现向程序发送命令时出现问题,点击"确定" 之后,点击上方"文件",点击"选项",点击"高级" ...

  9. c#类属性和实例属性_实例|EPS输出的CASS数据,房屋属性错误怎么解决? 111

    大家好,欢迎来到我的专栏,这是我原创的第111篇CASS应用技术干货文. 清华山维的EPS软件,可以直接导出南方CASS格式的dwg数据.这个导出接口做的很完善,只是最近发现有些瑕疵:所有的房屋符号, ...

最新文章

  1. Python3 Scrapy爬取猫眼TOP100代码示例
  2. apache spark_Apache Spark软件包,从XML到JSON
  3. 【转】DICOM医学图像处理:基于DCMTK工具包学习和分析worklist
  4. 大数据学习——免密登录配置
  5. c/c++排坑(4) -- c/c++中返回局部变量
  6. 延迟任务调度系统—技术选型与设计(上篇)
  7. 《天天数学》连载10:一月十日
  8. Java 中的接口有什么作用?为什么不直接用类?
  9. pandas--带有重复值的轴索引
  10. 英特尔图形安装程序的linux,如何在我的系统中安装英特尔图形驱动程序?
  11. windows系统更换鼠标指针
  12. 真实项目,用微信小程序开门编码实现(完结)
  13. free、detele与野指针
  14. pvcreate出错: Can't open /dev/sdb7 exclusively. Mounted filesystem?
  15. Mybatis新增获取Id
  16. 墨者学院Tomcat 远程代码执行漏洞利用
  17. 小世界效应:从凯文·贝肯到六度分隔理论(1)
  18. Adobe Illustrator(AI)中输入希腊字母等特殊字符
  19. 解决win10状态栏的搜索框无法搜索本地应用或无反应
  20. 【100条企业网站推广方法】

热门文章

  1. 计算机组成原理微命令序列图,计算机组成原理和结构图式(第三章 CPU子系统)...
  2. Cisco MDS交换机配置ssh 免密登录
  3. 16个VS Code快捷方式,可加快编码速度
  4. 0910-12学习记录-OFDM细节描述
  5. ZOJ 2849【瞎暴力的搜索】
  6. python随笔(类和对象)
  7. AI化学 | 逆合成分析软件Synbook
  8. 命令与征服4泰伯利亚黄昏java_《命令与征服4泰伯利亚的黄昏》默认快捷键
  9. 论文阅读SE_NET Squeeze-and-Excitation networks
  10. R语言实现九连环等递归问题