diff --git a/share/qtcreator/gdbmacros/gdbmacros.cpp b/share/qtcreator/gdbmacros/gdbmacros.cpp index e0a59d43c211a9385e6c616f139b8471142ac98b..ab84fed5f80c336c62becd877956f3b01c56d1be 100644 --- a/share/qtcreator/gdbmacros/gdbmacros.cpp +++ b/share/qtcreator/gdbmacros/gdbmacros.cpp @@ -2834,7 +2834,7 @@ static void qDumpQSharedPointer(QDumper &d) static void qDumpQString(QDumper &d) { - qCheckAccess(deref(d.data)); + //qCheckAccess(deref(d.data)); const QString &str = *reinterpret_cast<const QString *>(d.data); const int size = str.size(); diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp index 6f1391015b16ceca9ca29f5840c56ffb1e6b8975..ad77ef80e3cc73a76997cf5aadb823eb903dfff9 100644 --- a/src/plugins/debugger/debuggermanager.cpp +++ b/src/plugins/debugger/debuggermanager.cpp @@ -316,9 +316,10 @@ void DebuggerManager::init() // Tooltip //QTreeView *tooltipView = qobject_cast<QTreeView *>(m_tooltipWindow); //tooltipView->setModel(m_watchHandler->model(TooltipsWatch)); - + //qRegisterMetaType<WatchData>("Debugger::Internal::WatchData"); + qRegisterMetaType<WatchData>("WatchData"); connect(m_watchHandler, SIGNAL(watchDataUpdateNeeded(WatchData)), - this, SLOT(updateWatchData(WatchData))); + this, SLOT(updateWatchData(WatchData)), Qt::QueuedConnection); m_continueAction = new QAction(this); m_continueAction->setText(tr("Continue")); diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 6fbba11e083a5d7cac790cbdeff928bad768e038..99718326c247551356672cab0e6b2857b87a4059 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -83,7 +83,7 @@ namespace Internal { using namespace Debugger::Constants; //#define DEBUG_PENDING 1 -//#define DEBUG_SUBITEM 1 +#define DEBUG_SUBITEM 1 #if DEBUG_PENDING # define PENDING_DEBUG(s) qDebug() << s @@ -2958,6 +2958,10 @@ void GdbEngine::runDebuggingHelper(const WatchData &data0, bool dumpChildren) void GdbEngine::createGdbVariable(const WatchData &data) { + if (data.iname == _("local.flist.0")) { + int i = 1; + Q_UNUSED(i); + } postCommand(_("-var-delete \"%1\"").arg(data.iname), WatchUpdate); QString exp = data.exp; if (exp.isEmpty() && data.addr.startsWith(__("0x"))) @@ -3401,11 +3405,17 @@ void GdbEngine::handleDebuggingHelperValue2(const GdbResultRecord &record, setWatchDataType(data, record.data.findChild("type")); setWatchDataDisplayedType(data, record.data.findChild("displaytype")); - handleChildren(data, contents); + QList<WatchData> list; + handleChildren(data, contents, &list); + //for (int i = 0; i != list.size(); ++i) + // qDebug() << "READ: " << list.at(i).toString(); + qq->watchHandler()->insertBulkData(list); } -void GdbEngine::handleChildren(const WatchData &data0, const GdbMi &item) +void GdbEngine::handleChildren(const WatchData &data0, const GdbMi &item, + QList<WatchData> *list) { + //qDebug() << "HANDLE CHILDREN: " << data0.toString() << item.toString(); WatchData data = data0; if (!qq->watchHandler()->isExpandedIName(data.iname)) data.setChildrenUnneeded(); @@ -3432,16 +3442,16 @@ void GdbEngine::handleChildren(const WatchData &data0, const GdbMi &item) setWatchDataValueToolTip(data, item.findChild("valuetooltip"), item.findChild("valuetooltipencoded").data().toInt()); setWatchDataValueDisabled(data, item.findChild("valuedisabled")); + //qDebug() << "HANDLE CHILDREN: " << data.toString(); + list->append(data); // try not to repeat data too often WatchData childtemplate; setWatchDataType(childtemplate, item.findChild("childtype")); setWatchDataChildCount(childtemplate, item.findChild("childnumchild")); - //qDebug() << "CHILD TEMPLATE:" << childtemplate.toString(); + qDebug() << "CHILD TEMPLATE:" << childtemplate.toString(); - qq->watchHandler()->insertData(data); int i = 0; - QList<WatchData> list; foreach (GdbMi child, children.children()) { WatchData data1 = childtemplate; GdbMi name = child.findChild("name"); @@ -3463,11 +3473,9 @@ void GdbEngine::handleChildren(const WatchData &data0, const GdbMi &item) //data1.name += " (" + skey + ")"; data1.name = skey; } - handleChildren(data1, child); - list.append(data1); + handleChildren(data1, child, list); ++i; } - qq->watchHandler()->insertBulkData(list); } void GdbEngine::handleDebuggingHelperValue3(const GdbResultRecord &record, diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index b041c63eb2b0c6e78dd34ca68d0cd95f22b76b3b..07ef3bb8b8a76e9f631ec802990d3a5e7598089f 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -241,7 +241,8 @@ private: void debugMessage(const QString &msg); bool showToolTip(); - void handleChildren(const WatchData &parent, const GdbMi &child); + void handleChildren(const WatchData &parent, const GdbMi &child, + QList<WatchData> *insertions); const bool m_dumperInjectionLoad; OutputCollector m_outputCollector; diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 3ab57db6fd6f64ed31727056b4488ff70e99c2ab..fd6745014b9f87c78bd445c5edaf55b707bd5f57 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -1003,7 +1003,7 @@ void WatchHandler::insertBulkData(const QList<WatchData> &list) { if (list.isEmpty()) return; - QHash<QString, QList<WatchData> > hash; + QMap<QString, QList<WatchData> > hash; foreach (const WatchData &data, list) { if (data.isSomethingNeeded())