QGIS icon indicating copy to clipboard operation
QGIS copied to clipboard

QPaintDevice: Cannot destroy paint device that is being painted

Open mikedld opened this issue 1 year ago • 0 comments

What is the bug or the crash?

Thread 1 "python3" received signal SIGSEGV, Segmentation fault.
QPainter::end (this=this@entry=0x7f17087fdb90) at /var/tmp/portage/dev-qt/qtgui-5.15.13/work/qtbase-everywhere-src-5.15.13/src/gui/painting/qpaintengine.h:150
warning: 150	/var/tmp/portage/dev-qt/qtgui-5.15.13/work/qtbase-everywhere-src-5.15.13/src/gui/painting/qpaintengine.h: No existe el fichero o el directorio
(gdb) bt full
#0  QPainter::end (this=this@entry=0x7f17087fdb90) at /var/tmp/portage/dev-qt/qtgui-5.15.13/work/qtbase-everywhere-src-5.15.13/src/gui/painting/qpaintengine.h:150
        d = 0x7f1708149120
        ended = true
#1  0x00007f174b336928 in QPainter::~QPainter (this=0x7f17087fdb90, __in_chrg=<optimized out>) at /var/tmp/portage/dev-qt/qtgui-5.15.13/work/qtbase-everywhere-src-5.15.13/src/gui/painting/qpainter.cpp:1513
#2  0x00007f174c765701 in QgsPaintEffect::~QgsPaintEffect (this=0x55be9c5374b0, __in_chrg=<optimized out>) at /var/tmp/portage/sci-geosciences/qgis-3.36.1/work/qgis-3.36.1/src/core/effects/qgspainteffect.cpp:41
#3  0x00007f174c75a29d in QgsEffectStack::~QgsEffectStack (this=0x55be9c5374b0, __in_chrg=<optimized out>) at /var/tmp/portage/sci-geosciences/qgis-3.36.1/work/qgis-3.36.1/src/core/effects/qgseffectstack.cpp:48
#4  0x00007f174c6b5995 in QgsFeatureRenderer::~QgsFeatureRenderer (this=0x55be9c53d220, __in_chrg=<optimized out>) at /var/tmp/portage/sci-geosciences/qgis-3.36.1/work/qgis-3.36.1/src/core/symbology/qgsrenderer.cpp:70
#5  0x00007f174c6ca38d in QgsSingleSymbolRenderer::~QgsSingleSymbolRenderer (this=0x55be9c53d220, __in_chrg=<optimized out>) at /var/tmp/portage/sci-geosciences/qgis-3.36.1/work/qgis-3.36.1/src/core/symbology/qgssinglesymbolrenderer.cpp:47
#6  0x00007f174d3ec43e in std::default_delete<QgsFeatureRenderer>::operator() (__ptr=<optimized out>, this=<optimized out>) at /usr/lib/gcc/x86_64-pc-linux-gnu/13/include/g++-v13/bits/unique_ptr.h:93
#7  std::unique_ptr<QgsFeatureRenderer, std::default_delete<QgsFeatureRenderer> >::~unique_ptr (this=0x55be9c53b880, __in_chrg=<optimized out>) at /usr/lib/gcc/x86_64-pc-linux-gnu/13/include/g++-v13/bits/unique_ptr.h:404
        __ptr = @0x55be9c53b880: 0x55be9c53d220
#8  std::_Destroy<std::unique_ptr<QgsFeatureRenderer, std::default_delete<QgsFeatureRenderer> > > (__pointer=0x55be9c53b880) at /usr/lib/gcc/x86_64-pc-linux-gnu/13/include/g++-v13/bits/stl_construct.h:151
#9  std::_Destroy_aux<false>::__destroy<std::unique_ptr<QgsFeatureRenderer, std::default_delete<QgsFeatureRenderer> >*> (__last=0x55be9c53b888, __first=0x55be9c53b880) at /usr/lib/gcc/x86_64-pc-linux-gnu/13/include/g++-v13/bits/stl_construct.h:163
#10 std::_Destroy<std::unique_ptr<QgsFeatureRenderer, std::default_delete<QgsFeatureRenderer> >*> (__last=0x55be9c53b888, __first=<optimized out>) at /usr/lib/gcc/x86_64-pc-linux-gnu/13/include/g++-v13/bits/stl_construct.h:196
#11 std::_Destroy<std::unique_ptr<QgsFeatureRenderer, std::default_delete<QgsFeatureRenderer> >*, std::unique_ptr<QgsFeatureRenderer, std::default_delete<QgsFeatureRenderer> > > (__last=0x55be9c53b888, __first=<optimized out>) at /usr/lib/gcc/x86_64-pc-linux-gnu/13/include/g++-v13/bits/alloc_traits.h:948
#12 std::vector<std::unique_ptr<QgsFeatureRenderer, std::default_delete<QgsFeatureRenderer> >, std::allocator<std::unique_ptr<QgsFeatureRenderer, std::default_delete<QgsFeatureRenderer> > > >::~vector (this=0x55bea5a78f78, __in_chrg=<optimized out>) at /usr/lib/gcc/x86_64-pc-linux-gnu/13/include/g++-v13/bits/stl_vector.h:732
#13 QgsVectorLayerRenderer::~QgsVectorLayerRenderer (this=0x55bea5a78f00, __in_chrg=<optimized out>) at /var/tmp/portage/sci-geosciences/qgis-3.36.1/work/qgis-3.36.1/src/core/vector/qgsvectorlayerrenderer.cpp:213
#14 0x00007f174d3ec57d in QgsVectorLayerRenderer::~QgsVectorLayerRenderer (this=0x55bea5a78f00, __in_chrg=<optimized out>) at /var/tmp/portage/sci-geosciences/qgis-3.36.1/work/qgis-3.36.1/src/core/vector/qgsvectorlayerrenderer.cpp:213
#15 0x00007f174cff2edf in QgsMapRendererJob::cleanupJobs (this=this@entry=0x55be8d79d690, jobs=std::vector of length 92, capacity 128 = {...}) at /var/tmp/portage/sci-geosciences/qgis-3.36.1/work/qgis-3.36.1/src/core/maprenderer/qgsmaprendererjob.cpp:1114
        errors = {<QList<QString>> = {<QListSpecialMethods<QString>> = {<No data fields>}, {p = {static shared_null = {ref = {atomic = {_q_value = std::atomic<int> = { -1 }}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 0x7f175555c360 <QListData::shared_null>}, d = 0x7f175555c360 <QListData::shared_null>}}, <No data fields>}
        job = @0x55beb4a38ed8: {img = 0x0, elevationMap = 0x0, previewRenderImage = 0x0, imageInitialized = true, previewRenderImageInitialized = false, renderer = 0x55bea5a78f00, blendMode = QPainter::CompositionMode_SourceOver, opacity = 0.17499999999999999, cached = false, renderAboveLabels = false, layer = {wp = {d = 0x55beb3e16ec0, value = 0x55beb3d4e350}}, completed = false, renderingTime = 0, estimatedRenderingTime = 0, errors = {<QList<QString>> = {<QListSpecialMethods<QString>> = {<No data fields>}, {p = {static shared_null = {ref = {atomic = {_q_value = std::atomic<int> = { -1 }}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 0x7f175555c360 <QListData::shared_null>}, d = 0x7f175555c360 <QListData::shared_null>}}, <No data fields>}, layerId = {d = 0x55beb3d69970}, maskPainter = std::unique_ptr<QPainter> = {get() = 0x0}, maskPaintDevice = std::unique_ptr<QPaintDevice> = {get() = 0x0}, maskRequiresLayerRasterization = false, firstPassJob = 0x0, picture = std::unique_ptr<QPicture> = {get() = 0x0}, maskJobs = {<QListSpecialMethods<QPair<LayerRenderJob*, int> >> = {<No data fields>}, {p = {static shared_null = {ref = {atomic = {_q_value = std::atomic<int> = { -1 }}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 0x7f175555c360 <QListData::shared_null>}, d = 0x7f175555c360 <QListData::shared_null>}}, mContext = std::unique_ptr<QgsRenderContext> = {get() = 0x55be9c549c90}}
#16 0x00007f174cfe944a in QgsMapRendererCustomPainterJob::futureFinished (this=0x55be8d79d690) at /var/tmp/portage/sci-geosciences/qgis-3.36.1/work/qgis-3.36.1/src/core/maprenderer/qgsmaprenderercustompainterjob.cpp:267
#17 0x00007f17554b0a7e in QtPrivate::QSlotObjectBase::call (a=0x7ffd33adcbc0, r=0x55be8d79d690, this=0x55be9bd832a0) at /var/tmp/portage/dev-qt/qtcore-5.15.13/work/qtbase-everywhere-src-5.15.13/include/QtCore/../../src/corelib/kernel/qobjectdefs_impl.h:398
#18 doActivate<false> (sender=0x55be8d79da50, signal_index=4, argv=0x7ffd33adcbc0) at /var/tmp/portage/dev-qt/qtcore-5.15.13/work/qtbase-everywhere-src-5.15.13/src/corelib/kernel/qobject.cpp:3925
        obj = std::unique_ptr<QtPrivate::QSlotObjectBase> = {get() = <optimized out>}
        receiver = 0x55be8d79d690
        td = <optimized out>
        receiverInSameThread = <optimized out>
        senderData = {previous = 0x0, receiver = 0x55be8d79d690, sender = 0x55be8d79da50, signal = 4}
        c = 0x55be9bd88090
        connections = {d = 0x55be9bd81890}
        list = <optimized out>
        inSenderThread = true
        highestConnectionId = 1
        signalVector = 0x55be9bd83bf0
        currentThreadId = 0x7f1757179740
        sp = <optimized out>
        signal_spy_set = 0x0
        empty_argv = {0x0}
        senderDeleted = false
#19 0x00007f17554aa797 in QMetaObject::activate (sender=<optimized out>, m=<optimized out>, local_signal_index=<optimized out>, argv=<optimized out>) at /var/tmp/portage/dev-qt/qtcore-5.15.13/work/qtbase-everywhere-src-5.15.13/src/corelib/kernel/qobject.cpp:3985
        signal_index = <optimized out>
#20 0x00007f17552cc1d5 in QFutureWatcherBase::event (this=<optimized out>, event=0x7f1700d14e00) at /var/tmp/portage/dev-qt/qtcore-5.15.13/work/qtbase-everywhere-src-5.15.13/src/corelib/thread/qfuturewatcher.cpp:334
        callOutEvent = 0x7f1700d14e00
        d = 0x55beb3e332f0
#21 0x00007f174b702e42 in QApplicationPrivate::notify_helper (this=this@entry=0x0, receiver=0x55be8d79da50, e=0x7f1700d14e00, e@entry=0x0) at /var/tmp/portage/dev-qt/qtwidgets-5.15.13/work/qtbase-everywhere-src-5.15.13/src/widgets/kernel/qapplication.cpp:3640
        consumed = false
        filtered = false
#22 0x00007f174b70a30a in QApplication::notify (this=this@entry=0x55be8bfdafb0, receiver=receiver@entry=0x55be8d79da50, e=0x0, e@entry=0x7f1700d14e00) at /var/tmp/portage/dev-qt/qtwidgets-5.15.13/work/qtbase-everywhere-src-5.15.13/src/widgets/kernel/qapplication.cpp:3386
        w = <optimized out>
        extra = <optimized out>
        isProxyWidget = <optimized out>
        d = 0x0
        res = false
#23 0x00007f174cbebac3 in QgsApplication::notify (this=this@entry=0x55be8bfdafb0, receiver=receiver@entry=0x55be8d79da50, event=event@entry=0x7f1700d14e00) at /var/tmp/portage/sci-geosciences/qgis-3.36.1/work/qgis-3.36.1/src/core/qgsapplication.cpp:602
        done = true
#24 0x00007f1742a5042e in sipQgsApplication::notify (this=0x55be8bfdafb0, a0=0x55be8d79da50, a1=0x7f1700d14e00) at /var/tmp/portage/sci-geosciences/qgis-3.36.1/work/qgis-3.36.1_build/python/core/build/_core/sip_corepart24.cpp:35686
        sipGILState = (PyGILState_UNLOCKED | unknown: 0x7f16)
        sipMeth = <optimized out>
#25 0x00007f175547d848 in QCoreApplication::notifyInternal2 (receiver=0x55be8d79da50, event=0x7f1700d14e00) at /var/tmp/portage/dev-qt/qtcore-5.15.13/work/qtbase-everywhere-src-5.15.13/src/corelib/kernel/qcoreapplication.cpp:1064
        selfRequired = true
        result = false
        cbdata = {0x55be8d79da50, 0x7f1700d14e00, 0x7ffd33adcd5f}
        d = <optimized out>
        threadData = 0x55be8c12f3b0
        scopeLevelCounter = {threadData = 0x55be8c12f3b0}
#26 0x00007f175547da32 in QCoreApplication::sendEvent (receiver=<optimized out>, event=<optimized out>) at /var/tmp/portage/dev-qt/qtcore-5.15.13/work/qtbase-everywhere-src-5.15.13/src/corelib/kernel/qcoreapplication.cpp:1462
#27 0x00007f1755480ce4 in QCoreApplicationPrivate::sendPostedEvents (receiver=0x0, event_type=0, data=0x55be8c12f3b0) at /var/tmp/portage/dev-qt/qtcore-5.15.13/work/qtbase-everywhere-src-5.15.13/src/corelib/kernel/qcoreapplication.cpp:1821
        e = 0x7f1700d14e00
        pe = <optimized out>
        r = 0x55be8d79da50
        relocker = {m_func = {__locker = <optimized out>}, m_invoke = <optimized out>}
        event_deleter = {d = 0x7f1700d14e00}
        locker = {_M_device = 0x55be8c12f3e0, _M_owns = false}
        startOffset = 0
        i = @0x55be8c12f3d4: 1
        cleanup = {receiver = 0x0, event_type = 0, data = 0x55be8c12f3b0, exceptionCaught = true}
#28 0x00007f1755480f9c in QCoreApplication::sendPostedEvents (receiver=<optimized out>, event_type=<optimized out>) at /var/tmp/portage/dev-qt/qtcore-5.15.13/work/qtbase-everywhere-src-5.15.13/src/corelib/kernel/qcoreapplication.cpp:1680
        data = <optimized out>
#29 0x00007f17554cfb67 in postEventSourceDispatch (s=0x55be8cc313a0) at /var/tmp/portage/dev-qt/qtcore-5.15.13/work/qtbase-everywhere-src-5.15.13/src/corelib/kernel/qeventdispatcher_glib.cpp:277
        source = 0x55be8cc313a0
#30 0x00007f1755111824 in g_main_dispatch (context=context@entry=0x7f1738000f20) at ../glib-2.78.4/glib/gmain.c:3476
        dispatch = 0x7f17554cfb50 <postEventSourceDispatch(GSource*, GSourceFunc, gpointer)>
        prev_source = 0x0
        begin_time_nsec = 0
        was_in_call = 0
        user_data = 0x0
        callback = 0x0
        cb_funcs = <optimized out>
        cb_data = <optimized out>
        need_destroy = <optimized out>
        source = 0x55be8cc313a0
        current = 0x55be9bd847d0
        i = 0
        __func__ = "g_main_dispatch"
#31 0x00007f1755114977 in g_main_context_dispatch_unlocked (context=0x7f1738000f20) at ../glib-2.78.4/glib/gmain.c:4284
#32 g_main_context_iterate_unlocked (context=context@entry=0x7f1738000f20, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib-2.78.4/glib/gmain.c:4349
        max_priority = 2147483647
        timeout = -1
        some_ready = 1
        nfds = <optimized out>
        allocated_nfds = 3
        fds = 0x7f17300037a0
#33 0x00007f1755114fa0 in g_main_context_iteration (context=0x7f1738000f20, may_block=1) at ../glib-2.78.4/glib/gmain.c:4414
        retval = <optimized out>
#34 0x00007f17554cf65a in QEventDispatcherGlib::processEvents (this=0x55be8cbd6450, flags=...) at /var/tmp/portage/dev-qt/qtcore-5.15.13/work/qtbase-everywhere-src-5.15.13/src/corelib/kernel/qeventdispatcher_glib.cpp:423
        d = 0x55be8cbeeee0
        canWait = true
        savedFlags = {i = 0}
        result = <optimized out>
#35 0x00007f175547c23b in QEventLoop::exec (this=0x55bea0589ec0, flags=...) at /var/tmp/portage/dev-qt/qtcore-5.15.13/work/qtbase-everywhere-src-5.15.13/include/QtCore/../../src/corelib/global/qflags.h:69
        d = 0x55bea4196ec0
        threadData = <optimized out>
        locker = {val = 94276882114744}
        ref = {d = <optimized out>, locker = <optimized out>, exceptionCaught = <optimized out>}
        app = <optimized out>
#36 0x00007f1755948753 in meth_QEventLoop_exec (sipSelf=<optimized out>, sipArgs=<optimized out>, sipKwds=<optimized out>) at sipQtCoreQEventLoop.cpp:400
        _save = 0x7f17570bf6b8 <_PyRuntime+166328>
        sipRes = <optimized out>
        sipKwdList = {0x7f17559ec69c <sipStrings_QtCore+64156> "flags"}
        a0def = {i = 0}
        a0 = 0x7ffd33add048
        a0State = 0
        sipCpp = 0x55bea0589ec0
        sipParseErr = 0x0
...

Steps to reproduce the issue

Run the Python along the below lines:

app = QgsApplication([], True)
QgsApplication.initQgis()

QgsProject.instance().read("foobar.qgs")

settings = QgsMapSettings()
settings.setOutputDpi(95.0)
settings.setOutputImageFormat(QImage.Format_ARGB32_Premultiplied)
settings.setDestinationCrs(QgsCoordinateReferenceSystem('EPSG:3857'))
settings.setOutputSize(QSize(width, height))
settings.setLayers(QgsProject.instance().layerTreeRoot().checkedLayers())
settings.setFlag(QgsMapSettings.DrawLabeling, True)
settings.setBackgroundColor(QColor(127, 127, 127, 0))
settings.setExtent(QgsRectangle(lat_min, lon_min, lat_max, lon_max))

loop = QEventLoop()
job = QgsMapRendererSequentialJob(settings)
job.finished.connect(loop.quit)
job.start()
loop.exec() # <-- crash here
job.waitForFinished()
image = job.renderedImage()
image.save("foobar.png", "PNG")

Versions

Versión de QGIS 3.36.1-Maidenhead Rama del código de QGIS Release 3.36
Versión Qt 5.15.13
Versión de Python 3.11.8
Versión de GDAL/OGR 3.8.5
Versión de PROJ 9.3.0
Versión del registro de base de datos EPSG v10.094 (2023-08-08)
Versión de GEOS 3.12.1-CAPI-1.18.1
Versión de SQLite 3.45.2
Versión del cliente de PostgreSQL Sin soporte
Versión de SpatiaLite 5.1.0
Versión de QWT 6.2.0
Versión de QScintilla2 2.14.1
Versión del SO Gentoo Linux
       
Complementos activos de Python
MetaSearch 0.3.6
grassprovider 2.12.99
processing 2.12.99
db_manager 0.1.20

Supported QGIS version

  • [ ] I'm running a supported QGIS version according to the roadmap.

New profile

Additional context

QPainter::~QPainter()
{
    d_ptr->inDestructor = true; // <-- sometimes crashes here
    QT_TRY {
        if (isActive())
            end(); // <-- sometimes crashes here
        else if (d_ptr->refcount > 1)
            d_ptr->detachPainterPrivate(this);
    } QT_CATCH(...) {
        // don't throw anything in the destructor.
    }
    if (d_ptr) {
        // Make sure we haven't messed things up.
        Q_ASSERT(d_ptr->inDestructor);
        d_ptr->inDestructor = false;
        Q_ASSERT(d_ptr->refcount == 1);
        if (d_ptr->d_ptrs)
            free(d_ptr->d_ptrs);
    }
}

mikedld avatar May 11 '24 15:05 mikedld