在退出Qt应用程序崩溃,OS适用“容错堆垫片”(Qt application crashes on

2019-10-20 23:55发布

我无法找出是什么原因造成应用程序崩溃退出。 什么进一步增加的困惑是,它并不总是死机,有时它,有时没有,它似乎完全随心所欲。

样品基本包装箱加载一个静态的谷歌地图API请求作为一个PNG图像QML显示自定义图像提供商。 图像提供者本身的工作,我首先怀疑问题可能与实例栈上的网络访问管理器,但是这不是它,我获得相同的行为动态实例化它。 有趣的是崩溃似乎不符合什么特别。 刚开始和关闭应用程序有时会产生碰撞,没有任何与它的互动,但大多不无任何互动崩溃。 有时候,在退出时没有崩溃地图中心和缩放效果多种相互作用,但大部分做的时间。

另一个疑是事件循环我为了实例化“块”的图像提供方法,而网络请求完成。 由于图像供应商的设计,图像必须通过请求吧,我不能用其他词同样的方法将返回的“推荐”的刚刚启动从方法的请求,并与它的连接捕获它的方式completed信号另一种方法。 但是,这似乎并没有被它要么,作为提供者总是设法提供我认为是没有问题与它的形象。 至少不是直接的,但也许的网络访问提供了一些副作用?

BTW Qt是喷涌而出的一些警告,仅在第一次网络访问管理器的使用。 有了Qt 5.2我只得到了这四个:

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

...并升级到5.3.1新鲜移除这些警告的希望后实际两个出现在除了前四:

QSslSocket: cannot resolve SSL_CTX_set_next_proto_select_cb
QSslSocket: cannot resolve SSL_get0_next_proto_negotiated

也许这些警告主题相关的崩溃?

这里也是APPCRASH信息:

  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

平台信息:Windows 7的64位,32位的股票Qt的建立与GCC

下面是相关的代码:

C ++

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;
    }    
};

QML

Rectangle {
    id: root
    width: 360
    height: 360

    property string url : 'image://map/http://maps.googleapis.com/maps/api/staticmap?center=' + n + ',' + e + '&zoom=' + zoom.value + '&size=' + width  + "x" + height + '&maptype=satellite'
    property real n : 48.858222
    property real e : 2.2945

    Timer {
        id: t
        repeat: false
        interval: 100
        running: false
        onTriggered: {
            placeholder.source = root.url
        }
    }

    function refresh() { if (t.running) t.restart(); else t.start() }

    Image {
        id: placeholder
        anchors.fill: parent
    }

    MouseArea {
        anchors.fill: parent

        onClicked: {
            var xOffset = (mouseX / width - 0.5) * (360 / Math.pow(2, zoom.value))
            var yOffset = (mouseY / height - 0.5) * (360 / Math.pow(2, zoom.value))

            console.log(xOffset + " " + yOffset)

            root.n = root.n - yOffset
            root.e = root.e + xOffset
            root.refresh()
        }
    }

    Slider {
        id: zoom
        value: 17
        maximumValue: 21
        minimumValue: 1
        stepSize: 1
        x: 80
        y: parent.height - 25
        width: parent.width - 90

        onValueChanged: root.refresh()
    }
}

Answer 1:

问题是,在图像的提供程序类。 我不知道究竟在何处,但它的存在,因为没有它,我不能重现崩溃。 我能够说,是因为你的情况的图像提供商完全没有必要-一QtQuick Image元素将接受并与谷歌API的URL源工作,因为它是。



文章来源: Qt application crashes on exit, OS applies “fault tolerant heap shim”