/* -stack-list-frames ^done, stack=[ frame={level="0",addr="0x00010734",func="callee4", file="../../../devo/gdb/testsuite/gdb.mi/basics.c", fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="8"}, frame={level="1",addr="0x0001076c",func="callee3", file="../../../devo/gdb/testsuite/gdb.mi/basics.c", fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="17"}] */ void StackFramesTreeWidget::createStackFrames(GDBMIValue *pGDBMIValue) { /* Clear the StackFramesTreeWidget items */ clearStackFrames(); /* create the StackFramesTreeWidget items */ if(pGDBMIValue->type == GDBMIValue::ListValue) { GDBMIResultList::iterator resultListIterator; for (resultListIterator = pGDBMIValue->miList->miResultsList.begin(); resultListIterator != pGDBMIValue->miList->miResultsList.end(); ++resultListIterator) { GDBMIResult *pGDBMIResult = *resultListIterator; if (pGDBMIResult->variable.compare("frame") == 0) { QString level, address, function, line, file, fullName; if (pGDBMIResult->miValue->type == GDBMIValue::TupleValue) { GDBAdapter *pGDBAdapter = mpStackFramesWidget->getMainWindow()->getGDBAdapter(); GDBMIResultList resultsList = pGDBMIResult->miValue->miTuple->miResultsList; level = pGDBAdapter->getGDBMIConstantValue(pGDBAdapter->getGDBMIResult("level", resultsList)); address = pGDBAdapter->getGDBMIConstantValue(pGDBAdapter->getGDBMIResult("addr", resultsList)); function = pGDBAdapter->getGDBMIConstantValue(pGDBAdapter->getGDBMIResult("func", resultsList)); line = pGDBAdapter->getGDBMIConstantValue(pGDBAdapter->getGDBMIResult("line", resultsList)); file = pGDBAdapter->getGDBMIConstantValue(pGDBAdapter->getGDBMIResult("file", resultsList)); fullName = pGDBAdapter->getGDBMIConstantValue(pGDBAdapter->getGDBMIResult("fullname", resultsList)); } StackFrameItem *pStackFrameItem = new StackFrameItem(level, address, function, line, file, fullName, this); addTopLevelItem(pStackFrameItem); } } } /* if we get some frames then make the first enabled one selected and fetch the variables for it. */ for (int i = 0 ; i < topLevelItemCount() ; i++) { if (!topLevelItem(i)->isDisabled()) { mpStackFramesWidget->stackItemDoubleClicked(topLevelItem(i)); return; } } // if there are no stack frames or no enabled stack frames then we need to clear locals browser. QList<QVector<QVariant> > locals; mpStackFramesWidget->getMainWindow()->getLocalsWidget()->getLocalsTreeModel()->insertLocalsList(locals); /* if we reach here we should suspend the debugger. Otherwise the debugger is suspended in GDBAdapter::stackListVariablesCB */ mpStackFramesWidget->getMainWindow()->getGDBAdapter()->suspendDebugger(); mpStackFramesWidget->getMainWindow()->getLocalsWidget()->getLocalsTreeProxyModel()->invalidate(); }