Qt应用程序在退出时崩溃,操作系统应用"容错堆垫片"

时间:2014-09-19 11:24:19

标签: c++ qt crash qml qtquick2

我无法隔离导致应用程序在退出时崩溃的原因。更进一步的混淆是它并不总是崩溃,有时它会崩溃,有时它不会崩溃,而且似乎完全是任意的。

该示例基本上包含一个自定义图像提供程序,该提供程序将静态Google地图API请求作为PNG图像加载以在QML中显示。图像提供程序本身工作,我首先怀疑问题可能是在堆栈上实例化网络访问管理器,但不是这样,我得到了动态实例化它的相同行为。有趣的是,崩溃似乎并不对应任何特别的东西。只是启动和关闭应用程序有时会生成崩溃,而不会与它进行任何交互,但它几乎不会在没有任何交互的情况下崩溃。有时,与地图中心和缩放的多次交互不会导致退出时出现崩溃,但大部分时间都是如此。

另一个嫌疑人是我实例化的事件循环,以便在网络请求完成时“阻止”图像提供者方法。由于图像提供程序的设计,图像必须通过请求它的相同方法返回,换句话说,我不能使用“推荐”方法只是从方法启动请求并通过连接它{{1信号到另一个方法。但这似乎也不是,因为提供商总是设法提供图像,我认为它没有任何问题。至少不是直接的,但可能是网络访问的一些副作用?

BTW Qt正在喷出一些警告,仅在第一个网络访问管理器使用时。在Qt 5.2中,我只得到了这四个:

completed

......升级到新的5.3.1之后,为了消除这些警告,实际上除了前四个之外还出现了两个警告:

QSslSocket: cannot resolve TLSv1_1_client_method
QSslSocket: cannot resolve TLSv1_2_client_method
QSslSocket: cannot resolve TLSv1_1_server_method
QSslSocket: cannot resolve TLSv1_2_server_method
QSslSocket: cannot resolve SSL_select_next_proto

也许那些警告与崩溃有某种关系?

这里也是appcrash信息:

QSslSocket: cannot resolve SSL_CTX_set_next_proto_select_cb
QSslSocket: cannot resolve SSL_get0_next_proto_negotiated

平台信息:Windows 7 x64,使用GCC进行库存32位Qt构建

以下是相关代码:

C ++

  Fault Module Name:    ntdll.dll
  Fault Module Version: 6.1.7601.17725
  Fault Module Timestamp:   4ec49b8f
  Exception Code:   c0000005
  Exception Offset: 000332a0
  OS Version:   6.1.7601.2.1.0.256.1
  Locale ID:    1033
  Additional Information 1: 0a9e
  Additional Information 2: 0a9e372d3b4ad19135b953a78882e789
  Additional Information 3: 0a9e
  Additional Information 4: 0a9e372d3b4ad19135b953a78882e789

QML

class MapReader : public QQuickImageProvider {
public:
    explicit MapReader() : QQuickImageProvider(QQuickImageProvider::Pixmap, QQmlImageProviderBase::ForceAsynchronousImageLoading) { }

    QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) {
        QNetworkAccessManager m;
        Q_UNUSED(requestedSize)
        Q_UNUSED(size)
        QEventLoop loop;
        QObject::connect(&m, SIGNAL(finished(QNetworkReply*)), &loop, SLOT(quit()));
        QNetworkReply * r = m.get(QNetworkRequest(QUrl(id)));
        loop.exec();

        if (r->error()) {
            qDebug() << "Error: " << r->errorString();
            r->deleteLater();
            return QPixmap();
        }

        QPixmap p;
        p.loadFromData(r->readAll());
        r->deleteLater();
        return p;
    }    
};

1 个答案:

答案 0 :(得分:2)

问题出在您的图片提供程序类中。我不确定究竟在哪里,但它确实存在,因为没有它我无法再现崩溃。我可以告诉您,因为您的案例中的图片提供程序完全没有必要 - QtQuick Image元素将接受并使用Google API网址源。