QGIS
QGIS copied to clipboard
QPaintDevice: Cannot destroy paint device that is being painted
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
- [ ] I tried with a new QGIS 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);
}
}