diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index b8fa6fa6747962f268b995771f30a5d64583bd76..7a2c00b12def6ce5b6117e5572d797d02af16f03 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -155,9 +155,8 @@ static bool parseConsoleStream(const GdbResponse &response, GdbMi *contents)
     out = out.left(out.lastIndexOf('"'));
     // optimization: dumper output never needs real C unquoting
     out.replace('\\', "");
-    out = "dummy={" + out + "}";
 
-    contents->fromString(out);
+    contents->fromStringMultiple(out);
     //qDebug() << "CONTENTS" << contents->toString(true);
     return contents->isValid();
 }
@@ -3584,8 +3583,8 @@ void GdbEngine::handleStackFrame(const GdbResponse &response)
                 << out.left(pos);
             out = out.mid(pos);
         }
-        GdbMi all("[" + out + "]");
-        //GdbMi all(out);
+        GdbMi all;
+        all.fromStringMultiple(out);
         
         //qDebug() << "\n\n\nALL: " << all.toString() << "\n";
         GdbMi locals = all.findChild("locals");
diff --git a/src/plugins/debugger/gdb/gdbmi.cpp b/src/plugins/debugger/gdb/gdbmi.cpp
index ffac5d76d1588b2ef84b94aa22936780d39bca41..639e698d36f39cf0f50cabc7a21156d15309cb0d 100644
--- a/src/plugins/debugger/gdb/gdbmi.cpp
+++ b/src/plugins/debugger/gdb/gdbmi.cpp
@@ -348,6 +348,13 @@ void GdbMi::fromString(const QByteArray &ba)
     parseResultOrValue(from, to);
 }
 
+void GdbMi::fromStringMultiple(const QByteArray &ba)
+{
+    const char *from = ba.constBegin();
+    const char *to = ba.constEnd();
+    parseTuple_helper(from, to);
+}
+
 GdbMi GdbMi::findChild(const char *name) const
 {
     for (int i = 0; i < m_children.size(); ++i)
diff --git a/src/plugins/debugger/gdb/gdbmi.h b/src/plugins/debugger/gdb/gdbmi.h
index 24295afea662b32d148f929257f61ac342dedf8a..a4ce8375030dea05b26d1e0d72dc37956f8d0f8c 100644
--- a/src/plugins/debugger/gdb/gdbmi.h
+++ b/src/plugins/debugger/gdb/gdbmi.h
@@ -91,7 +91,6 @@ class GdbMi
 {
 public:
     GdbMi() : m_type(Invalid) {}
-    explicit GdbMi(const QByteArray &str) { fromString(str); }
 
     QByteArray m_name;
     QByteArray m_data;
@@ -126,6 +125,7 @@ public:
 
     QByteArray toString(bool multiline = false, int indent = 0) const;
     void fromString(const QByteArray &str);
+    void fromStringMultiple(const QByteArray &str);
     void setStreamOutput(const QByteArray &name, const QByteArray &content);
 
 private:
diff --git a/src/plugins/debugger/watchutils.cpp b/src/plugins/debugger/watchutils.cpp
index f5ef9250e7e52a7fc5a96d6ae91f85c6cc4f7c18..1c07ef499e386e9a3b416f2348288ff0338ba035 100644
--- a/src/plugins/debugger/watchutils.cpp
+++ b/src/plugins/debugger/watchutils.cpp
@@ -975,11 +975,8 @@ bool QtDumperHelper::parseQuery(const GdbMi &contents, Debugger debugger)
 // parse a query
 bool QtDumperHelper::parseQuery(const char *data, Debugger debugger)
 {
-    QByteArray fullData = data;
-    fullData.insert(0, '{');
-    fullData.append(data);
-    fullData.append('}');
-    GdbMi root(fullData);
+    GdbMi root;
+    root.fromStringMultiple(QByteArray(data));
     if (!root.isValid())
         return false;
     return parseQuery(root, debugger);
@@ -1475,11 +1472,8 @@ bool QtDumperHelper::parseValue(const char *data,
                                 QList<WatchData> *l)
 {
     l->clear();
-    QByteArray fullData = data;
-    fullData.insert(0, '{');
-    fullData.append(data);
-    fullData.append('}');
-    GdbMi root(fullData);
+    GdbMi root;
+    root.fromStringMultiple(QByteArray(data));
     if (!root.isValid())
         return false;
     gbdMiToWatchData(root, GdbMiRecursionContext(), l);