QmlProfiler: Don't crash on inconsistent profiling data

The trace may contain RangeData and RangeLocation entries that aren't
aligned with any RangeStart. As the trace is generated by an external
process we need to handle that.

Change-Id: I39a524127c9c9059e5c5521797e5effd385ce12b
Reviewed-by: Milian Wolff <milian.wolff@kdab.com>
This commit is contained in:
Ulf Hermann
2017-09-08 10:00:12 +02:00
parent 565ebaeb9a
commit e3ae628584

View File

@@ -138,7 +138,8 @@ void QmlProfilerTraceClientPrivate::processCurrentEvent()
break; break;
case RangeEnd: { case RangeEnd: {
int typeIndex = resolveStackTop(); int typeIndex = resolveStackTop();
QTC_ASSERT(typeIndex != -1, break); if (typeIndex == -1)
break;
currentEvent.event.setTypeIndex(typeIndex); currentEvent.event.setTypeIndex(typeIndex);
while (!pendingMessages.isEmpty()) while (!pendingMessages.isEmpty())
modelManager->addEvent(pendingMessages.dequeue()); modelManager->addEvent(pendingMessages.dequeue());
@@ -147,9 +148,11 @@ void QmlProfilerTraceClientPrivate::processCurrentEvent()
break; break;
} }
case RangeData: case RangeData:
if (!rangesInProgress.isEmpty())
rangesInProgress.top().type.setData(currentEvent.type.data()); rangesInProgress.top().type.setData(currentEvent.type.data());
break; break;
case RangeLocation: case RangeLocation:
if (!rangesInProgress.isEmpty())
rangesInProgress.top().type.setLocation(currentEvent.type.location()); rangesInProgress.top().type.setLocation(currentEvent.type.location());
break; break;
default: { default: {