From 4ac2634de7aa585cc6191c8512e7ed5a9d00eaac Mon Sep 17 00:00:00 2001 From: Friedemann Kleint <Friedemann.Kleint@nokia.com> Date: Mon, 8 Nov 2010 17:15:33 +0100 Subject: [PATCH] Debugger: Make Gdbmi threads parsing code re-usable. Adapt watchutils code for new engine. Acked-by: hjk --- src/plugins/debugger/gdb/gdbengine.cpp | 25 ++----------------- src/plugins/debugger/threadshandler.cpp | 33 +++++++++++++++++++++++++ src/plugins/debugger/threadshandler.h | 4 ++- src/plugins/debugger/watchutils.cpp | 17 ++++++++++--- 4 files changed, 51 insertions(+), 28 deletions(-) diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index ea1456e40dc..02776557d30 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -2964,30 +2964,9 @@ void GdbEngine::handleThreadInfo(const GdbResponse &response) { int id = response.cookie.toInt(); if (response.resultClass == GdbResultDone) { - // ^done,threads=[{id="1",target-id="Thread 0xb7fdc710 (LWP 4264)", - // frame={level="0",addr="0x080530bf",func="testQString",args=[], - // file="/.../app.cpp",fullname="/../app.cpp",line="1175"}, - // state="stopped",core="0"}],current-thread-id="1" - const QList<GdbMi> items = response.data.findChild("threads").children(); - Threads threads; - for (int index = 0, n = items.size(); index != n; ++index) { - bool ok = false; - const GdbMi item = items.at(index); - const GdbMi frame = item.findChild("frame"); - ThreadData thread; - thread.id = item.findChild("id").data().toInt(); - thread.targetId = QString::fromAscii(item.findChild("target-id").data()); - thread.core = QString::fromLatin1(item.findChild("core").data()); - thread.state = QString::fromLatin1(item.findChild("state").data()); - thread.address = frame.findChild("addr").data().toULongLong(&ok, 0); - thread.function = QString::fromLatin1(frame.findChild("func").data()); - thread.fileName = QString::fromLatin1(frame.findChild("fullname").data()); - thread.lineNumber = frame.findChild("line").data().toInt(); - threads.append(thread); - } + int currentThreadId; + const Threads threads= ThreadsHandler::parseGdbmiThreads(response.data, ¤tThreadId); threadsHandler()->setThreads(threads); - const int currentThreadId = - response.data.findChild("current-thread-id").data().toInt(); threadsHandler()->setCurrentThreadId(currentThreadId); updateViews(); // Adjust Threads combobox. if (m_hasInferiorThreadList) { diff --git a/src/plugins/debugger/threadshandler.cpp b/src/plugins/debugger/threadshandler.cpp index a6e1ce328b0..bc076c7b05b 100644 --- a/src/plugins/debugger/threadshandler.cpp +++ b/src/plugins/debugger/threadshandler.cpp @@ -28,6 +28,7 @@ **************************************************************************/ #include "threadshandler.h" +#include "gdb/gdbmi.h" #include "debuggerconstants.h" @@ -254,5 +255,37 @@ void ThreadsHandler::notifyRunning() index(m_threads.size() - 1, ThreadData::ColumnCount - 1)); } +Threads ThreadsHandler::parseGdbmiThreads(const GdbMi &data, int *currentThread) +{ + // ^done,threads=[{id="1",target-id="Thread 0xb7fdc710 (LWP 4264)", + // frame={level="0",addr="0x080530bf",func="testQString",args=[], + // file="/.../app.cpp",fullname="/../app.cpp",line="1175"}, + // state="stopped",core="0"}],current-thread-id="1" + const QList<GdbMi> items = data.findChild("threads").children(); + const int n = items.size(); + Threads threads; + threads.reserve(n); + for (int index = 0; index != n; ++index) { + bool ok = false; + const GdbMi item = items.at(index); + const GdbMi frame = item.findChild("frame"); + ThreadData thread; + thread.id = item.findChild("id").data().toInt(); + thread.targetId = QString::fromAscii(item.findChild("target-id").data()); + thread.core = QString::fromLatin1(item.findChild("core").data()); + thread.state = QString::fromLatin1(item.findChild("state").data()); + thread.address = frame.findChild("addr").data().toULongLong(&ok, 0); + thread.function = QString::fromLatin1(frame.findChild("func").data()); + thread.fileName = QString::fromLatin1(frame.findChild("fullname").data()); + thread.lineNumber = frame.findChild("line").data().toInt(); + // Non-GDB (Cdb2) output name here. + thread.name = frame.findChild("name").data().toInt(); + threads.append(thread); + } + if (currentThread) + *currentThread = data.findChild("current-thread-id").data().toInt(); + return threads; +} + } // namespace Internal } // namespace Debugger diff --git a/src/plugins/debugger/threadshandler.h b/src/plugins/debugger/threadshandler.h index cb28d1ac7a1..f128dc0f179 100644 --- a/src/plugins/debugger/threadshandler.h +++ b/src/plugins/debugger/threadshandler.h @@ -39,7 +39,7 @@ namespace Debugger { namespace Internal { - +class GdbMi; //////////////////////////////////////////////////////////////////////// // // ThreadsHandler @@ -68,6 +68,8 @@ public: // Clear out all frame information void notifyRunning(); + static Threads parseGdbmiThreads(const GdbMi &data, int *currentThread = 0); + private: int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; diff --git a/src/plugins/debugger/watchutils.cpp b/src/plugins/debugger/watchutils.cpp index baf140bcca2..90251b2a790 100644 --- a/src/plugins/debugger/watchutils.cpp +++ b/src/plugins/debugger/watchutils.cpp @@ -1522,10 +1522,19 @@ bool QtDumperHelper::parseValue(const char *data, QList<WatchData> *l) { l->clear(); GdbMi root; - root.fromStringMultiple(QByteArray(data)); - if (!root.isValid()) - return false; - gbdMiToWatchData(root, GdbMiRecursionContext(), l); + // Array (CDB2) + if (*data == '[') { + root.fromString(data); + if (!root.isValid()) + return false; + foreach(const GdbMi &child, root.children()) + gbdMiToWatchData(child, GdbMiRecursionContext(), l); + } else { + root.fromStringMultiple(QByteArray(data)); + if (!root.isValid()) + return false; + gbdMiToWatchData(root, GdbMiRecursionContext(), l); + } return true; } -- GitLab