Bug 473634 - ASSERT failure in QVector<T>::at: "index out of range"
Summary: ASSERT failure in QVector<T>::at: "index out of range"
Status: RESOLVED FIXED
Alias: None
Product: Heaptrack
Classification: Applications
Component: general (show other bugs)
Version: unspecified
Platform: RedHat Enterprise Linux Linux
: NOR normal
Target Milestone: ---
Assignee: Milian Wolff
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2023-08-22 12:15 UTC by Teodor Petrov
Modified: 2023-09-04 14:50 UTC (History)
0 users

See Also:
Latest Commit:
Version Fixed In:
Sentry Crash Report:


Attachments
File for nautilus (3.24 MB, application/zstd)
2023-08-25 13:58 UTC, Teodor Petrov
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Teodor Petrov 2023-08-22 12:15:15 UTC
STEPS TO REPRODUCE
1. Load a profile
2. Select the consumed tab
3. Select a range in the graph
4. Right click -> filter in range

OBSERVED RESULT
ASSERT failure in QVector<T>::at: "index out of range", file /usr/include/qt5/QtCore/qvector.h, line 449

(gdb) bt
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1  0x00007ffff06d9ea5 in __GI_abort () at abort.c:79
#2  0x00007ffff145d137 in qt_message_output(QtMsgType, QMessageLogContext const&, QString const&) [clone .cold.117] ()
    at /lib64/libQt5Core.so.5
#3  0x00007ffff145c569 in qgetenv(char const*) [clone .cold.76] () at /lib64/libQt5Core.so.5
#4  0x000000000045b857 in QVector<QBrush>::at(int) const (this=0xd6db40, i=-1) at /usr/include/qt5/QtCore/qvector.h:449
#5  0x000000000046d74d in ChartModel::headerData(int, Qt::Orientation, int) const
    (this=0xd6db00, section=-1, orientation=Qt::Horizontal, role=175763350)
    at /home/tpetrov/projects/temp/heaptrack/src/analyze/gui/chartmodel.cpp:69
#6  0x00007ffff161bca6 in QAbstractProxyModel::headerData(int, Qt::Orientation, int) const () at /lib64/libQt5Core.so.5
#7  0x00007ffff162e6a3 in QSortFilterProxyModel::headerData(int, Qt::Orientation, int) const () at /lib64/libQt5Core.so.5
#8  0x00007ffff765e9c0 in KChart::AttributesModel::headerData(int, Qt::Orientation, int) const () at /lib64/libKChart.so.2
#9  0x00007ffff7654b61 in KChart::AbstractDiagram::Private::datasetAttrs(int, int) const () at /lib64/libKChart.so.2
#10 0x00007ffff7648f38 in KChart::AbstractDiagram::brush(int) const () at /lib64/libKChart.so.2
#11 0x00007ffff764d50a in KChart::AbstractDiagram::datasetBrushes() const () at /lib64/libKChart.so.2
#12 0x00007ffff7676504 in KChart::Legend::Private::fetchPaintOptions(KChart::Legend*) () at /lib64/libKChart.so.2
#13 0x00007ffff767722d in KChart::Legend::buildLegend() () at /lib64/libKChart.so.2
#14 0x00007ffff7677c2d in KChart::Legend::setNeedRebuild() () at /lib64/libKChart.so.2
#15 0x00007ffff762d005 in KChart::Legend::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) () at /lib64/libKChart.so.2
#16 0x00007ffff1683b00 in void doActivate<false>(QObject*, int, void**) () at /lib64/libQt5Core.so.5
#17 0x00007ffff762ad36 in KChart::DiagramObserver::diagramDataChanged(KChart::AbstractDiagram*) () at /lib64/libKChart.so.2
#18 0x00007ffff1683b00 in void doActivate<false>(QObject*, int, void**) () at /lib64/libQt5Core.so.5
#19 0x00007ffff16018f1 in QAbstractItemModel::modelReset(QAbstractItemModel::QPrivateSignal) () at /lib64/libQt5Core.so.5
#20 0x00007ffff1629ae6 in QSortFilterProxyModelPrivate::_q_sourceReset() () at /lib64/libQt5Core.so.5
#21 0x00007ffff162dcc1 in QSortFilterProxyModel::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) ()
    at /lib64/libQt5Core.so.5
#22 0x00007ffff1683b00 in void doActivate<false>(QObject*, int, void**) () at /lib64/libQt5Core.so.5
#23 0x00007ffff16018f1 in QAbstractItemModel::modelReset(QAbstractItemModel::QPrivateSignal) () at /lib64/libQt5Core.so.5
#24 0x000000000046e6dc in ChartModel::resetData(ChartData const&) (this=0xd6db00, data=...)
    at /home/tpetrov/projects/temp/heaptrack/src/analyze/gui/chartmodel.cpp:261
#25 0x00000000004304bd in (anonymous namespace)::<lambda(const ChartData&)>::operator()(const ChartData &) const
    (__closure=0xdc9330, data=...) at /home/tpetrov/projects/temp/heaptrack/src/analyze/gui/mainwindow.cpp:223
#26 0x000000000043ae66 in QtPrivate::FunctorCall<QtPrivate::IndexesList<0>, QtPrivate::List<const ChartData&>, void, (anonymous namespace)::addChartTab(QTabWidget*, const QString&, ChartModel::Type, const Parser*, void (Parser::*)(const ChartData&), MainWindow*)::<lambda(const ChartData&)> >::call((anonymous namespace)::<lambda(const ChartData&)> &, void **) (f=..., arg=0x7fff61790788)
    at /usr/include/qt5/QtCore/qobjectdefs_impl.h:146
#27 0x000000000043a73e in QtPrivate::Functor<(anonymous namespace)::addChartTab(QTabWidget*, const QString&, ChartModel::Type, const Parser*, void (Parser::*)(const ChartData&), MainWindow*)::<lambda(const ChartData&)>, 1>::call<QtPrivate::List<ChartData const&>, void>((anonymous namespace)::<lambda(const ChartData&)> &, void *, void **) (f=..., arg=0x7fff61790788)
    at /usr/include/qt5/QtCore/qobjectdefs_impl.h:256
#28 0x00000000004398ca in QtPrivate::QFunctorSlotObject<(anonymous namespace)::addChartTab(QTabWidget*, const QString&, ChartModel::Type, const Parser*, void (Parser::*)(const ChartData&), MainWindow*)::<lambda(const ChartData&)>, 1, QtPrivate::List<const ChartData&>, void>::impl(int, QtPrivate::QSlotObjectBase *, QObject *, void **, bool *)
    (which=1, this_=0xdc9320, r=0x8e5ac0, a=0x7fff61790788, ret=0x0) at /usr/include/qt5/QtCore/qobjectdefs_impl.h:443
#29 0x00007ffff167cee3 in QObject::event(QEvent*) () at /lib64/libQt5Core.so.5
#30 0x00007ffff252623b in QWidget::event(QEvent*) () at /lib64/libQt5Widgets.so.5
#31 0x00007ffff24e5252 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /lib64/libQt5Widgets.so.5
#32 0x00007ffff24ebfd0 in QApplication::notify(QObject*, QEvent*) () at /lib64/libQt5Widgets.so.5
#33 0x00007ffff16505b2 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /lib64/libQt5Core.so.5
#34 0x00007ffff16533a1 in QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) () at /lib64/libQt5Core.so.5
#35 0x00007ffff16a4ba7 in postEventSourceDispatch(_GSource*, int (*)(void*), void*) () at /lib64/libQt5Core.so.5
#36 0x00007fffe9bd8aed in g_main_context_dispatch () at /lib64/libglib-2.0.so.0
#37 0x00007fffe9bd8ea8 in g_main_context_iterate.isra () at /lib64/libglib-2.0.so.0
#38 0x00007fffe9bd8f40 in g_main_context_iteration () at /lib64/libglib-2.0.so.0
#39 0x00007ffff16a4954 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib64/libQt5Core.so.5
#40 0x00007ffff164f2bb in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib64/libQt5Core.so.5
#41 0x00007ffff1657704 in QCoreApplication::exec() () at /lib64/libQt5Core.so.5
#42 0x000000000042d90b in main(int, char**) (argc=2, argv=0x7fffffffd378)
    at /home/tpetrov/projects/temp/heaptrack/src/analyze/gui/gui.cpp:147

SOFTWARE/OS VERSIONS
Linux: Rocky Linux 8.8 
KDE Frameworks Version: 5.96.0
Qt Version: 5.15.3
kdiagram version: 2.8.0-4
Comment 1 Milian Wolff 2023-08-23 08:17:36 UTC
can you please share the heaptrack file that triggers this behavior with me?
Comment 2 Teodor Petrov 2023-08-23 08:35:45 UTC
Nope, I cannot unfortunately.
I'll see if I can reproduce with something that is shareable.
Comment 3 Milian Wolff 2023-08-23 09:51:38 UTC
You can also try to use tools/anonymize - though it seems to expect a gz input file and output file - but doing what that does for a zstd heaptrack file should be trivial, just replace the strings
Comment 4 Teodor Petrov 2023-08-25 13:58:35 UTC
Created attachment 161175 [details]
File for nautilus

It doesn't happen immediately with this file.

Steps:
1. open it
2. select a tab which contain a graph
3. select a region
4. right click -> filter in on selection
5. repeat 3 while it crashes

I sometimes need to do 3 iterations of the steps 3-5 to get a crash.
Probably something related with the size of the region and its content.
Comment 5 Teodor Petrov 2023-09-01 16:54:27 UTC
Are you able to reproduce using the file I've uploaded?
This issue is making it hard to inspect the logs and with another file I can hit the problem 100% of the time. :(
Comment 6 Milian Wolff 2023-09-04 14:50:17 UTC
Git commit 6e558868fa9555fd8f75e6520cbbde628c7d424a by Milian Wolff.
Committed on 04/09/2023 at 16:44.
Pushed by mwolff into branch 'master'.

Make ChartModel::headerData more resilient to prevent crashes

Return when we get asked for invalid data which seems to happen
through the KDChart attributes model. Fixes assertions/crashes like:

```
#0  0x00007fdcfc88e83c in  () at /usr/lib/libc.so.6
#1  0x00007fdcfc83e668 in raise () at /usr/lib/libc.so.6
#2  0x00007fdcfc8264b8 in abort () at /usr/lib/libc.so.6
#3  0x00007fdcfd8a0098 in qt_assert(char const*, char const*, int) () at /usr/lib/libQt5Core.so.5
#4  0x00007fdcfd8a0157 in  () at /usr/lib/libQt5Core.so.5
#5  0x00005649da68cf3f in QVector<QBrush>::at(int) const (this=0x6070001170a0, i=-1) at /usr/include/qt/QtCore/qvector.h:449
#6  0x00005649da70272e in ChartModel::headerData(int, Qt::Orientation, int) const (this=0x607000117060, section=-1, orientation=Qt::Horizontal, role=175763350) at /home/milian/projects/src/heaptrack/src/analyze/gui/chartmodel.cpp:69
#7  0x00007fdcfda67f5e in QAbstractProxyModel::headerData(int, Qt::Orientation, int) const () at /usr/lib/libQt5Core.so.5
#8  0x00007fdcfda7ba54 in QSortFilterProxyModel::headerData(int, Qt::Orientation, int) const () at /usr/lib/libQt5Core.so.5
#9  0x00007fdcff9b6dbf in KChart::AttributesModel::headerData(int, Qt::Orientation, int) const () at /usr/lib/libKChart.so.2
#10 0x00007fdcff9af76a in  () at /usr/lib/libKChart.so.2
#11 0x00007fdcff9a7605 in KChart::AbstractDiagram::brush(int) const () at /usr/lib/libKChart.so.2
#12 0x00007fdcff9ac495 in KChart::AbstractDiagram::datasetBrushes() const () at /usr/lib/libKChart.so.2
#13 0x00007fdcff9ccd77 in  () at /usr/lib/libKChart.so.2
#14 0x00007fdcff9cda4b in KChart::Legend::buildLegend() () at /usr/lib/libKChart.so.2
#15 0x00007fdcff9ce4ba in KChart::Legend::setNeedRebuild() () at /usr/lib/libKChart.so.2
#16 0x00007fdcfdad17f3 in  () at /usr/lib/libQt5Core.so.5
#17 0x00007fdcff98c4f3 in KChart::DiagramObserver::diagramDataChanged(KChart::AbstractDiagram*) () at /usr/lib/libKChart.so.2
#18 0x00007fdcfdad17f3 in  () at /usr/lib/libQt5Core.so.5
#19 0x00007fdcfda59182 in QAbstractItemModel::modelReset(QAbstractItemModel::QPrivateSignal) () at /usr/lib/libQt5Core.so.5
#20 0x00007fdcfda8506d in  () at /usr/lib/libQt5Core.so.5
#21 0x00007fdcfdad17f3 in  () at /usr/lib/libQt5Core.so.5
#22 0x00007fdcfda59182 in QAbstractItemModel::modelReset(QAbstractItemModel::QPrivateSignal) () at /usr/lib/libQt5Core.so.5
#23 0x00005649da708068 in ChartModel::resetData(ChartData const&) (this=0x607000117060, data=...) at /home/milian/projects/src/heaptrack/src/analyze/gui/chartmodel.cpp:261
#24 0x00005649da569a5d in operator()(ChartData const&) const (__closure=0x604000258e20, data=...) at /home/milian/projects/src/heaptrack/src/analyze/gui/mainwindow.cpp:223
```

M  +47   -46   src/analyze/gui/chartmodel.cpp

https://invent.kde.org/sdk/heaptrack/-/commit/6e558868fa9555fd8f75e6520cbbde628c7d424a