diff --git a/share/qtcreator/gdbmacros/gdbmacros.cpp b/share/qtcreator/gdbmacros/gdbmacros.cpp
index ba607ecb9877c06c252d41182df0afbfae796909..9e3ce85c2451299c92e25f54546606d0064b4f62 100644
--- a/share/qtcreator/gdbmacros/gdbmacros.cpp
+++ b/share/qtcreator/gdbmacros/gdbmacros.cpp
@@ -375,7 +375,6 @@ static bool isSimpleType(const char *type)
     return false;
 }
 
-#if 0
 static bool isStringType(const char *type)
 {
     return isEqual(type, NS"QString")
@@ -384,7 +383,6 @@ static bool isStringType(const char *type)
         || isEqual(type, "std::wstring")
         || isEqual(type, "wstring");
 }
-#endif
 
 static bool isMovableType(const char *type)
 {
@@ -502,7 +500,7 @@ struct QDumper
     void beginHash(); // start of data hash output
     void endHash(); // start of data hash output
 
-    void beginChildren(); // start of children list
+    void beginChildren(const char *mainInnerType = 0); // start of children list
     void endChildren(); // end of children list
 
     void beginItem(const char *name); // start of named item, ready to accept value
@@ -775,8 +773,16 @@ void QDumper::endItem()
     put('"');
 }
 
-void QDumper::beginChildren()
+void QDumper::beginChildren(const char *mainInnerType)
 {
+    if (mainInnerType) {
+        putItem("childtype", mainInnerType);
+        if (isSimpleType(mainInnerType) || isStringType(mainInnerType))
+            putItem("childnumchild", "0");
+        else if (isPointerType(mainInnerType))
+            putItem("childnumchild", "1");
+    }
+
     putCommaIfNeeded();
     put("children=[");
 }
@@ -867,7 +873,7 @@ static void qDumpUnknown(QDumper &d, const char *why = 0)
     d.disarm();
 }
 
-static inline void dumpStdStringValue(QDumper &d, const std::string &str)
+static void qDumpStdStringValue(QDumper &d, const std::string &str)
 {
     d.beginItem("value");
     d.putBase64Encoded(str.c_str(), str.size());
@@ -877,7 +883,7 @@ static inline void dumpStdStringValue(QDumper &d, const std::string &str)
     d.putItem("numchild", "0");
 }
 
-static inline void dumpStdWStringValue(QDumper &d, const std::wstring &str)
+static void qDumpStdWStringValue(QDumper &d, const std::wstring &str)
 {
     d.beginItem("value");
     d.putBase64Encoded((const char *)str.c_str(), str.size() * sizeof(wchar_t));
@@ -887,30 +893,6 @@ static inline void dumpStdWStringValue(QDumper &d, const std::wstring &str)
     d.putItem("numchild", "0");
 }
 
-// Tell the calling routine whether a global "childnumchild" attribute makes sense
-enum  InnerValueResult
-{
-    InnerValueNotHandled,
-    InnerValueChildrenSpecified,
-    InnerValueNoFurtherChildren,
-    InnerValueFurtherChildren
-};
-
-static inline void dumpChildNumChildren(QDumper &d, InnerValueResult innerValueResult)
-{
-    switch (innerValueResult) {
-    case InnerValueChildrenSpecified:
-    case InnerValueNotHandled:
-        break;
-    case InnerValueNoFurtherChildren:
-        d.putItem("childnumchild", "0");
-        break;
-    case InnerValueFurtherChildren:
-        d.putItem("childnumchild", "1");
-        break;
-    }
-}
-
 // Called by templates, so, not static.
 static void qDumpInnerQCharValue(QDumper &d, QChar c, const char *field)
 {
@@ -934,43 +916,31 @@ static void qDumpInnerCharValue(QDumper &d, char c, const char *field)
     d.putItem("numchild", 0);
 }
 
-InnerValueResult qDumpInnerValueHelper(QDumper &d, const char *type, const void *addr,
+void qDumpInnerValueHelper(QDumper &d, const char *type, const void *addr,
     const char *field = "value")
 {
     type = stripNamespace(type);
     switch (type[1]) {
         case 'h':
-            if (isEqual(type, "char")) {
+            if (isEqual(type, "char"))
                 qDumpInnerCharValue(d, *(char *)addr, field);
-                return InnerValueNoFurtherChildren;
-            }
-            return InnerValueNotHandled;
+            break;
         case 'l':
             if (isEqual(type, "float"))
-                { d.putItem(field, *(float*)addr); return InnerValueNoFurtherChildren; }
-            return InnerValueNotHandled;
+                d.putItem(field, *(float*)addr);
+            break;
         case 'n':
-            if (isEqual(type, "int")) {
+            if (isEqual(type, "int"))
                 d.putItem(field, *(int*)addr);
-                return InnerValueNoFurtherChildren;
-            }
-            if (isEqual(type, "unsigned") || isEqual(type, "unsigned int")) {
+            else if (isEqual(type, "unsigned") || isEqual(type, "unsigned int"))
                 d.putItem(field, *(unsigned int*)addr);
-                return InnerValueNoFurtherChildren;
-            }
-            if (isEqual(type, "unsigned char")) {
+            else if (isEqual(type, "unsigned char"))
                 qDumpInnerCharValue(d, *(char *)addr, field);
-                return InnerValueNoFurtherChildren;
-            }
-            if (isEqual(type, "unsigned long")) {
+            else if (isEqual(type, "unsigned long"))
                 d.putItem(field, *(unsigned long*)addr);
-                return InnerValueNoFurtherChildren;
-            }
-            if (isEqual(type, "unsigned long long")) {
+            else if (isEqual(type, "unsigned long long"))
                 d.putItem(field, *(qulonglong*)addr);
-                return InnerValueNoFurtherChildren;
-            }
-            return InnerValueNotHandled;
+            break;
         case 'o':
             if (isEqual(type, "bool")) {
                 switch (*(bool*)addr) {
@@ -978,44 +948,32 @@ InnerValueResult qDumpInnerValueHelper(QDumper &d, const char *type, const void
                 case 1: d.putItem(field, "true"); break;
                 default: d.putItem(field, *(bool*)addr); break;
                 }
-                return InnerValueNoFurtherChildren;
-            }
-            if (isEqual(type, "double")) {
+            } else if (isEqual(type, "double"))
                 d.putItem(field, *(double*)addr);
-                return InnerValueNoFurtherChildren;
-            }
-            if (isEqual(type, "long")) {
+            else if (isEqual(type, "long"))
                 d.putItem(field, *(long*)addr);
-                return InnerValueNoFurtherChildren;
-            }
-            else if (isEqual(type, "long long")) {
+            else if (isEqual(type, "long long"))
                 d.putItem(field, *(qulonglong*)addr);
-                return InnerValueNoFurtherChildren;
-            }
-            return InnerValueNotHandled;
+            break;
         case 'B':
             if (isEqual(type, "QByteArray")) {
                 d.putCommaIfNeeded();
                 d.put(field).put("encoded=\"1\",");
                 d.putItem(field, *(QByteArray*)addr);
-                return InnerValueFurtherChildren;
             }
-            return InnerValueNotHandled;
+            break;
         case 'C':
-            if (isEqual(type, "QChar")) {
+            if (isEqual(type, "QChar"))
                 qDumpInnerQCharValue(d, *(QChar*)addr, field);
-                return InnerValueNoFurtherChildren;
-            }
-            return InnerValueNotHandled;
+            break;
         case 'L':
             if (startsWith(type, "QList<")) {
                 const QListData *ldata = reinterpret_cast<const QListData*>(addr);
                 d.putItemCount("value", ldata->size());
                 d.putItem("valuedisabled", "true");
                 d.putItem("numchild", ldata->size());
-                return InnerValueChildrenSpecified;
             }
-            return InnerValueNotHandled;
+            break;
         case 'O':
             if (isEqual(type, "QObject *")) {
                 if (addr) {
@@ -1026,54 +984,47 @@ InnerValueResult qDumpInnerValueHelper(QDumper &d, const char *type, const void
                     d.putItem("type", NS"QObject");
                     d.putItem("displayedtype", ob->metaObject()->className());
                     d.putItem("numchild", 1);
-                    return InnerValueChildrenSpecified;
                 } else {
                     d.putItem("value", "0x0");
                     d.putItem("type", NS"QObject *");
                     d.putItem("numchild", 0);
-                    return InnerValueNoFurtherChildren;
                 }
             }
-            return InnerValueNotHandled;
+            break;
         case 'S':
             if (isEqual(type, "QString")) {
                 d.putCommaIfNeeded();
                 d.putItem(field, *(QString*)addr);
                 d.put(',').put(field).put("encoded=\"2\"");
-                return InnerValueNoFurtherChildren;
             }
-            return InnerValueNotHandled;
+            break;
         case 't':
             if (isEqual(type, "std::string")
                 || isEqual(type, stdStringTypeC)) {
                 d.putCommaIfNeeded();
-                dumpStdStringValue(d, *reinterpret_cast<const std::string*>(addr));
-                return InnerValueNoFurtherChildren;
-            }
-            if (isEqual(type, "std::wstring")
+                qDumpStdStringValue(d, *reinterpret_cast<const std::string*>(addr));
+            } else if (isEqual(type, "std::wstring")
                 || isEqual(type, stdWideStringTypeUShortC)) {
-                dumpStdWStringValue(d, *reinterpret_cast<const std::wstring*>(addr));
-                return InnerValueNoFurtherChildren;
+                qDumpStdWStringValue(d, *reinterpret_cast<const std::wstring*>(addr));
             }
-            return InnerValueNotHandled;
+            break;
         default:
             break;
     }
-    return InnerValueNotHandled;
 }
 
-static InnerValueResult qDumpInnerValue(QDumper &d, const char *type, const void *addr)
+static void qDumpInnerValue(QDumper &d, const char *type, const void *addr)
 {
     d.putItem("addr", addr);
     d.putItem("type", type);
 
     if (!type[0])
-        return InnerValueNotHandled;
+        return;
 
     return qDumpInnerValueHelper(d, type, addr);
 }
 
-static InnerValueResult qDumpInnerValueOrPointer(QDumper &d,
+static void qDumpInnerValueOrPointer(QDumper &d,
     const char *type, const char *strippedtype, const void *addr)
 {
     if (strippedtype) {
@@ -1081,17 +1032,18 @@ static InnerValueResult qDumpInnerValueOrPointer(QDumper &d,
             d.putItem("addr", deref(addr));
             d.putItem("saddr", deref(addr));
             d.putItem("type", strippedtype);
-            return qDumpInnerValueHelper(d, strippedtype, deref(addr));
+            qDumpInnerValueHelper(d, strippedtype, deref(addr));
+        } else {
+            d.putItem("addr", addr);
+            d.putItem("type", strippedtype);
+            d.putItem("value", "<null>");
+            d.putItem("numchild", "0");
         }
+    } else {
         d.putItem("addr", addr);
-        d.putItem("type", strippedtype);
-        d.putItem("value", "<null>");
-        d.putItem("numchild", "0");
-        return InnerValueChildrenSpecified;
+        d.putItem("type", type);
+        qDumpInnerValueHelper(d, type, addr);
     }
-    d.putItem("addr", addr);
-    d.putItem("type", type);
-    return qDumpInnerValueHelper(d, type, addr);
 }
 
 //////////////////////////////////////////////////////////////////////////////
@@ -1647,7 +1599,6 @@ static void qDumpQList(QDumper &d)
     d.putItem("valuedisabled", "true");
     d.putItem("numchild", n);
     if (d.dumpChildren) {
-        InnerValueResult innerValueResult = InnerValueChildrenSpecified;
         unsigned innerSize = d.extraInt[0];
         bool innerTypeIsPointer = isPointerType(d.innertype);
         QByteArray strippedInnerType = stripPointerType(d.innertype);
@@ -1659,12 +1610,10 @@ static void qDumpQList(QDumper &d)
         // So as first approximation only do the 'isLarge' check:
         bool isInternal = innerSize <= int(sizeof(void*))
             && isMovableType(d.innertype);
-
         d.putItem("internal", (int)isInternal);
-        d.putItem("childtype", d.innertype);
         if (n > 1000)
             n = 1000;
-        d.beginChildren();
+        d.beginChildren(n ? d.innertype : 0);
         for (int i = 0; i != n; ++i) {
             d.beginHash();
             d.putItem("name", i);
@@ -1673,7 +1622,7 @@ static void qDumpQList(QDumper &d)
                 d.putItem("saddr", p);
                 if (*(void**)p) {
                     //d.putItem("value","@").put(p);
-                    innerValueResult = qDumpInnerValue(d, strippedInnerType.data(), deref(p));
+                    qDumpInnerValue(d, strippedInnerType.data(), deref(p));
                 } else {
                     d.putItem("value", "<null>");
                     d.putItem("numchild", "0");
@@ -1683,11 +1632,11 @@ static void qDumpQList(QDumper &d)
                 if (isInternal) {
                     //qDumpInnerValue(d, d.innertype, p);
                     d.putItem("addr", p);
-                    innerValueResult = qDumpInnerValueHelper(d, d.innertype, p);
+                    qDumpInnerValueHelper(d, d.innertype, p);
                 } else {
                     //qDumpInnerValue(d, d.innertype, deref(p));
                     d.putItem("addr", deref(p));
-                    innerValueResult = qDumpInnerValueHelper(d, d.innertype, deref(p));
+                    qDumpInnerValueHelper(d, d.innertype, deref(p));
                 }
             }
             d.endHash();
@@ -1695,7 +1644,6 @@ static void qDumpQList(QDumper &d)
         if (n < nn)
             d.putEllipsis();
         d.endChildren();
-        dumpChildNumChildren(d, innerValueResult);
     }
     d.disarm();
 }
@@ -1714,7 +1662,6 @@ static void qDumpQLinkedList(QDumper &d)
     d.putItemCount("value", n);
     d.putItem("valuedisabled", "true");
     d.putItem("numchild", n);
-    InnerValueResult innerValueResult = InnerValueChildrenSpecified;
     if (d.dumpChildren) {
         //unsigned innerSize = d.extraInt[0];
         //bool innerTypeIsPointer = isPointerType(d.innertype);
@@ -1722,16 +1669,15 @@ static void qDumpQLinkedList(QDumper &d)
         const char *stripped =
             isPointerType(d.innertype) ? strippedInnerType.data() : 0;
 
-        d.putItem("childtype", d.innertype);
         if (n > 1000)
             n = 1000;
-        d.beginChildren();
+        d.beginChildren(d.innertype);
         const void *p = deref(ldata);
         for (int i = 0; i != n; ++i) {
             d.beginHash();
             d.putItem("name", i);
             const void *addr = addOffset(p, 2 * sizeof(void*));
-            innerValueResult = qDumpInnerValueOrPointer(d, d.innertype, stripped, addr);
+            qDumpInnerValueOrPointer(d, d.innertype, stripped, addr);
             p = deref(p);
             d.endHash();
         }
@@ -1739,7 +1685,6 @@ static void qDumpQLinkedList(QDumper &d)
             d.putEllipsis();
         d.endChildren();
     }
-    dumpChildNumChildren(d, innerValueResult);
     d.disarm();
 }
 
@@ -1807,7 +1752,6 @@ static void qDumpQMapNode(QDumper &d)
 
     d.putItem("value", "");
     d.putItem("numchild", 2);
-    InnerValueResult innerValueResult = InnerValueChildrenSpecified;
     if (d.dumpChildren) {
         unsigned mapnodesize = d.extraInt[2];
         unsigned valueOff = d.extraInt[3];
@@ -1815,7 +1759,7 @@ static void qDumpQMapNode(QDumper &d)
         unsigned keyOffset = 2 * sizeof(void*) - mapnodesize;
         unsigned valueOffset = 2 * sizeof(void*) - mapnodesize + valueOff;
 
-        d.beginChildren();
+        d.beginChildren(d.innertype);
         d.beginHash();
         d.putItem("name", "key");
         qDumpInnerValue(d, keyType, addOffset(h, keyOffset));
@@ -1823,11 +1767,10 @@ static void qDumpQMapNode(QDumper &d)
         d.endHash();
         d.beginHash();
         d.putItem("name", "value");
-        innerValueResult = qDumpInnerValue(d, valueType, addOffset(h, valueOffset));
+        qDumpInnerValue(d, valueType, addOffset(h, valueOffset));
         d.endHash();
         d.endChildren();
     }
-    dumpChildNumChildren(d, innerValueResult);
     d.disarm();
 }
 
@@ -2757,11 +2700,9 @@ static void qDumpQStringList(QDumper &d)
     d.putItem("valuedisabled", "true");
     d.putItem("numchild", n);
     if (d.dumpChildren) {
-        d.putItem("childtype", NS"QString");
-        d.putItem("childnumchild", "0");
         if (n > 1000)
             n = 1000;
-        d.beginChildren();
+        d.beginChildren(n ? NS"QString" : 0);
         for (int i = 0; i != n; ++i) {
             d.beginHash();
             d.putItem("name", i);
@@ -2814,18 +2755,17 @@ static void qDumpQVector(QDumper &d)
     d.putItemCount("value", n);
     d.putItem("valuedisabled", "true");
     d.putItem("numchild", n);
-    InnerValueResult innerValueResult = InnerValueChildrenSpecified;
     if (d.dumpChildren) {
         QByteArray strippedInnerType = stripPointerType(d.innertype);
         const char *stripped =
             isPointerType(d.innertype) ? strippedInnerType.data() : 0;
         if (n > 1000)
             n = 1000;
-        d.beginChildren();
+        d.beginChildren(d.innertype);
         for (int i = 0; i != n; ++i) {
             d.beginHash();
             d.putItem("name", i);
-            innerValueResult = qDumpInnerValueOrPointer(d, d.innertype, stripped,
+            qDumpInnerValueOrPointer(d, d.innertype, stripped,
                 addOffset(v, i * innersize + typeddatasize));
             d.endHash();
         }
@@ -2833,7 +2773,6 @@ static void qDumpQVector(QDumper &d)
             d.putEllipsis();
         d.endChildren();
     }
-    dumpChildNumChildren(d, innerValueResult);
     d.disarm();
 }
 
@@ -2913,24 +2852,22 @@ static void qDumpStdList(QDumper &d)
     d.putItem("numchild", nn);
 
     d.putItem("valuedisabled", "true");
-    InnerValueResult innerValueResult = InnerValueChildrenSpecified;
     if (d.dumpChildren) {
         QByteArray strippedInnerType = stripPointerType(d.innertype);
         const char *stripped =
             isPointerType(d.innertype) ? strippedInnerType.data() : 0;
-        d.beginChildren();
+        d.beginChildren(d.innertype);
         it = list.begin();
         for (int i = 0; i < 1000 && it != cend; ++i, ++it) {
             d.beginHash();
             d.putItem("name", i);
-            innerValueResult = qDumpInnerValueOrPointer(d, d.innertype, stripped, it.operator->());
+            qDumpInnerValueOrPointer(d, d.innertype, stripped, it.operator->());
             d.endHash();
         }
         if (it != list.end())
             d.putEllipsis();
         d.endChildren();
     }
-    dumpChildNumChildren(d, innerValueResult);
     d.disarm();
 }
 
@@ -2974,7 +2911,6 @@ static void qDumpStdMapHelper(QDumper &d)
     pairType[strlen(pairType) - 2] = 0;
     d.putItem("pairtype", pairType);
 
-    InnerValueResult innerValueResult = InnerValueChildrenSpecified;
     if (d.dumpChildren) {
         bool isSimpleKey = isSimpleType(keyType);
         bool isSimpleValue = isSimpleType(valueType);
@@ -2987,14 +2923,14 @@ static void qDumpStdMapHelper(QDumper &d)
             d.put(" valueOffset: ").put(valueOffset);
         d.endItem();
 
-        d.beginChildren();
+        d.beginChildren(d.innertype);
         it = map.begin();
         for (int i = 0; i < 1000 && it != cend; ++i, ++it) {
             d.beginHash();
                 const void *node = it.operator->();
                 d.putItem("name", i);
                 qDumpInnerValueHelper(d, keyType, node, "key");
-                innerValueResult = qDumpInnerValueHelper(d, valueType, addOffset(node, valueOffset));
+                qDumpInnerValueHelper(d, valueType, addOffset(node, valueOffset));
                 if (isSimpleKey && isSimpleValue) {
                     d.putItem("type", valueType);
                     d.putItem("addr", addOffset(node, valueOffset));
@@ -3010,7 +2946,6 @@ static void qDumpStdMapHelper(QDumper &d)
             d.putEllipsis();
         d.endChildren();
     }
-    dumpChildNumChildren(d, innerValueResult);
     d.disarm();
 }
 
@@ -3074,7 +3009,6 @@ static void qDumpStdSetHelper(QDumper &d)
     d.putItem("valueoffset", d.extraInt[0]);
 
     if (d.dumpChildren) {
-        InnerValueResult innerValueResult = InnerValueChildrenSpecified;
         int valueOffset = 0; // d.extraInt[0];
         QByteArray strippedInnerType = stripPointerType(d.innertype);
         const char *stripped =
@@ -3084,19 +3018,18 @@ static void qDumpStdSetHelper(QDumper &d)
             d.put("valueOffset: ").put(valueOffset);
         d.endItem();
 
-        d.beginChildren();
+        d.beginChildren(d.innertype);
         it = set.begin();
         for (int i = 0; i < 1000 && it != cend; ++i, ++it) {
             const void *node = it.operator->();
             d.beginHash();
             d.putItem("name", i);
-            innerValueResult = qDumpInnerValueOrPointer(d, d.innertype, stripped, node);
+            qDumpInnerValueOrPointer(d, d.innertype, stripped, node);
             d.endHash();
         }
         if (it != set.end())
             d.putEllipsis();
         d.endChildren();
-        dumpChildNumChildren(d, innerValueResult);
     }
     d.disarm();
 }
@@ -3135,7 +3068,7 @@ static void qDumpStdString(QDumper &d)
         qCheckAccess(str.c_str());
         qCheckAccess(str.c_str() + size - 1);
     }
-    dumpStdStringValue(d, str);
+    qDumpStdStringValue(d, str);
     d.disarm();
 }
 
@@ -3149,7 +3082,7 @@ static void qDumpStdWString(QDumper &d)
         qCheckAccess(str.c_str());
         qCheckAccess(str.c_str() + size - 1);
     }
-    dumpStdWStringValue(d, str);
+    qDumpStdWStringValue(d, str);
     d.disarm();
 }
 
@@ -3185,14 +3118,13 @@ static void qDumpStdVector(QDumper &d)
     d.putItem("valuedisabled", "true");
     d.putItem("numchild", n);
     if (d.dumpChildren) {
-        InnerValueResult innerValueResult = InnerValueChildrenSpecified;
         unsigned innersize = d.extraInt[0];
         QByteArray strippedInnerType = stripPointerType(d.innertype);
         const char *stripped =
             isPointerType(d.innertype) ? strippedInnerType.data() : 0;
         if (n > 1000)
             n = 1000;
-        d.beginChildren();
+        d.beginChildren(n ? d.innertype : 0);
         for (int i = 0; i != n; ++i) {
             d.beginHash();
             d.putItem("name", i);
@@ -3203,7 +3135,6 @@ static void qDumpStdVector(QDumper &d)
         if (n < nn)
             d.putEllipsis();
         d.endChildren();
-        dumpChildNumChildren(d, innerValueResult);
     }
     d.disarm();
 }
diff --git a/tests/auto/debugger/main.cpp b/tests/auto/debugger/main.cpp
index ae0c6e65cb04a640385572b0451d9263bc44121c..522583a7047516c0d683e671e0b1964f1f9b6d3d 100644
--- a/tests/auto/debugger/main.cpp
+++ b/tests/auto/debugger/main.cpp
@@ -409,15 +409,14 @@ void tst_Debugger::dumpQList_int()
 {
     QList<int> ilist;
     testDumper("value='<0 items>',valuedisabled='true',numchild='0',"
-        "internal='1',childtype='int',children=[]",
+        "internal='1',children=[]",
         &ilist, NS"QList", true, "int");
     ilist.append(1);
     ilist.append(2);
     testDumper("value='<2 items>',valuedisabled='true',numchild='2',"
-        "internal='1',childtype='int',children=["
+        "internal='1',childtype='int',childnumchild='0',children=["
         "{name='0',addr='" + str(&ilist.at(0)) + "',value='1'},"
-        "{name='1',addr='" + str(&ilist.at(1)) + "',value='2'}],"
-        "childnumchild='0'",
+        "{name='1',addr='" + str(&ilist.at(1)) + "',value='2'}]",
         &ilist, NS"QList", true, "int");
 }
 
@@ -425,17 +424,16 @@ void tst_Debugger::dumpQList_char()
 {
     QList<char> clist;
     testDumper("value='<0 items>',valuedisabled='true',numchild='0',"
-        "internal='1',childtype='char',children=[]",
+        "internal='1',children=[]",
         &clist, NS"QList", true, "char");
     clist.append('a');
     clist.append('b');
     testDumper("value='<2 items>',valuedisabled='true',numchild='2',"
-        "internal='1',childtype='char',children=["
+        "internal='1',childtype='char',childnumchild='0',children=["
         "{name='0',addr='" + str(&clist.at(0)) + "',"
             "value=''a', ascii=97',numchild='0'},"
         "{name='1',addr='" + str(&clist.at(1)) + "',"
-            "value=''b', ascii=98',numchild='0'}],"
-        "childnumchild='0'",
+            "value=''b', ascii=98',numchild='0'}]",
         &clist, NS"QList", true, "char");
 }
 
@@ -443,25 +441,24 @@ void tst_Debugger::dumpQList_QString()
 {
     QList<QString> slist;
     testDumper("value='<0 items>',valuedisabled='true',numchild='0',"
-        "internal='1',childtype='QString',children=[]",
-        &slist, NS"QList", true, "QString");
+        "internal='1',children=[]",
+        &slist, NS"QList", true, NS"QString");
     slist.append("a");
     slist.append("b");
     testDumper("value='<2 items>',valuedisabled='true',numchild='2',"
-        "internal='1',childtype='QString',children=["
+        "internal='1',childtype='"NS"QString',childnumchild='0',children=["
         "{name='0',addr='" + str(&slist.at(0)) + "',"
             "value='YQA=',valueencoded='2'},"
         "{name='1',addr='" + str(&slist.at(1)) + "',"
-            "value='YgA=',valueencoded='2'}],"
-        "childnumchild='0'",
-        &slist, NS"QList", true, "QString");
+            "value='YgA=',valueencoded='2'}]",
+        &slist, NS"QList", true, NS"QString");
 }
 
 void tst_Debugger::dumpQList_Int3()
 {
     QList<Int3> i3list;
     testDumper("value='<0 items>',valuedisabled='true',numchild='0',"
-        "internal='0',childtype='Int3',children=[]",
+        "internal='0',children=[]",
         &i3list, NS"QList", true, "Int3");
     i3list.append(Int3());
     i3list.append(Int3());
@@ -476,7 +473,7 @@ void tst_Debugger::dumpQList_QString3()
 {
     QList<QString3> s3list;
     testDumper("value='<0 items>',valuedisabled='true',numchild='0',"
-        "internal='0',childtype='QString3',children=[]",
+        "internal='0',children=[]",
         &s3list, NS"QList", true, "QString3");
     s3list.append(QString3());
     s3list.append(QString3());
@@ -599,12 +596,14 @@ void tst_Debugger::dumpStdVector()
     std::list<int> list;
     vector.push_back(new std::list<int>(list));
     testDumper("value='<1 items>',valuedisabled='true',numchild='1',"
+        "childtype='" + inner + "',childnumchild='1',"
         "children=[{name='0',addr='" + str(deref(&vector[0])) + "',"
             "saddr='" + str(deref(&vector[0])) + "',type='" + innerp + "'}]",
         &vector, "std::vector", true, inner, "", sizeof(std::list<int> *));
     vector.push_back(0);
     list.push_back(45);
     testDumper("value='<2 items>',valuedisabled='true',numchild='2',"
+        "childtype='" + inner + "',childnumchild='1',"
         "children=[{name='0',addr='" + str(deref(&vector[0])) + "',"
             "saddr='" + str(deref(&vector[0])) + "',type='" + innerp + "'},"
           "{name='1',addr='" + str(&vector[1]) + "',"