QmlProfiler: Add some sanity checks to the various models

If we pop an event from the stack, then it should be the same type we
pushed earlier.

Change-Id: If4389cb57fa8996b3772fefca92d27c33dc35c65
Task-number: QTCREATORBUG-17885
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Ulf Hermann
2017-03-20 16:19:48 +01:00
parent 572ea47e97
commit bdecee9feb
3 changed files with 11 additions and 4 deletions

View File

@@ -106,6 +106,7 @@ void FlameGraphModel::loadEvent(const QmlEvent &event, const QmlEventType &type)
const bool isCompiling = (type.rangeType() == Compiling); const bool isCompiling = (type.rangeType() == Compiling);
QStack<QmlEvent> &stack = isCompiling ? m_compileStack : m_callStack; QStack<QmlEvent> &stack = isCompiling ? m_compileStack : m_callStack;
FlameGraphData *&stackTop = isCompiling ? m_compileStackTop : m_callStackTop; FlameGraphData *&stackTop = isCompiling ? m_compileStackTop : m_callStackTop;
QTC_ASSERT(stackTop, return);
if (type.message() == MemoryAllocation) { if (type.message() == MemoryAllocation) {
if (type.detailType() == HeapPage) if (type.detailType() == HeapPage)
@@ -121,6 +122,8 @@ void FlameGraphModel::loadEvent(const QmlEvent &event, const QmlEventType &type)
} }
} else if (event.rangeStage() == RangeEnd) { } else if (event.rangeStage() == RangeEnd) {
QTC_ASSERT(stackTop != &m_stackBottom, return);
QTC_ASSERT(stackTop->typeIndex == event.typeIndex(), return);
stackTop->duration += event.timestamp() - stack.top().timestamp(); stackTop->duration += event.timestamp() - stack.top().timestamp();
stack.pop(); stack.pop();
stackTop = stackTop->parent; stackTop = stackTop->parent;
@@ -129,6 +132,7 @@ void FlameGraphModel::loadEvent(const QmlEvent &event, const QmlEventType &type)
stack.push(event); stack.push(event);
stackTop = pushChild(stackTop, event); stackTop = pushChild(stackTop, event);
} }
QTC_CHECK(stackTop);
} }
void FlameGraphModel::finalize() void FlameGraphModel::finalize()

View File

@@ -135,12 +135,14 @@ void MemoryUsageModel::loadEvent(const QmlEvent &event, const QmlEventType &type
{ {
if (type.message() != MemoryAllocation) { if (type.message() != MemoryAllocation) {
if (type.rangeType() != MaximumRangeType) { if (type.rangeType() != MaximumRangeType) {
m_continuation = ContinueNothing;
if (event.rangeStage() == RangeStart) if (event.rangeStage() == RangeStart)
m_rangeStack.push(RangeStackFrame(event.typeIndex(), event.timestamp())); m_rangeStack.push(RangeStackFrame(event.typeIndex(), event.timestamp()));
else if (event.rangeStage() == RangeEnd) else if (event.rangeStage() == RangeEnd) {
QTC_ASSERT(!m_rangeStack.isEmpty(), return);
QTC_ASSERT(m_rangeStack.top().originTypeIndex == event.typeIndex(), return);
m_rangeStack.pop(); m_rangeStack.pop();
}
m_continuation = ContinueNothing;
} }
return; return;
} }

View File

@@ -225,7 +225,8 @@ void QmlProfilerStatisticsModel::loadEvent(const QmlEvent &event, const QmlEvent
break; break;
case RangeEnd: { case RangeEnd: {
// update stats // update stats
QTC_ASSERT(!stack.isEmpty(), return);
QTC_ASSERT(stack.top().typeIndex() == event.typeIndex(), return);
QmlEventStats *stats = &d->data[event.typeIndex()]; QmlEventStats *stats = &d->data[event.typeIndex()];
qint64 duration = event.timestamp() - stack.top().timestamp(); qint64 duration = event.timestamp() - stack.top().timestamp();
stats->duration += duration; stats->duration += duration;