diff --git a/bin/gdbmacros/gdbmacros.cpp b/bin/gdbmacros/gdbmacros.cpp
index e074ddd2a5daf79fb5d732391cfb3ebfeab4d93e..abca7066ee47dca53503fe4799810a4c3537b397 100644
--- a/bin/gdbmacros/gdbmacros.cpp
+++ b/bin/gdbmacros/gdbmacros.cpp
@@ -407,12 +407,13 @@ struct QDumper
     QDumper &operator<<(unsigned int i);
     QDumper &operator<<(const void *p);
     QDumper &operator<<(qulonglong c);
-    void put(char c);
-    void addCommaIfNeeded();
-    void putBase64Encoded(const char *buf, int n);
     QDumper &operator<<(const char *str);
     QDumper &operator<<(const QByteArray &ba);
     QDumper &operator<<(const QString &str);
+    void put(char c);
+    void addCommaIfNeeded();
+    void putBase64Encoded(const char *buf, int n);
+    void putEllipsis();
     void disarm();
 
     void beginHash(); // start of data hash output
@@ -658,6 +659,14 @@ void QDumper::endHash()
     put('}');
 }
 
+void QDumper::putEllipsis()
+{
+    d.beginHash();
+    P(d, "name", "Warning:");
+    P(d, "value", "<incomplete>");
+    P(d, "type", d.innertype);
+    d.endHash();
+}
 
 //
 // Some helpers to keep the dumper code short
@@ -816,6 +825,27 @@ static void qDumpInnerValue(QDumper &d, const char *type, const void *addr)
 }
 
 
+static void qDumpInnerValueOrPointer(QDumper &d,
+    const char *type, const char *strippedtype, const void *addr)
+{
+    if (strippedtype) {
+        if (deref(addr)) {
+            P(d, "addr", deref(addr));
+            P(d, "type", strippedtype);
+            qDumpInnerValueHelper(d, strippedtype, deref(addr));
+        } else {
+            P(d, "addr", addr);
+            P(d, "type", strippedtype);
+            P(d, "value", "<null>");
+            P(d, "numchild", "0");
+        }
+    } else {
+        P(d, "addr", addr);
+        P(d, "type", type);
+        qDumpInnerValueHelper(d, type, addr);
+    }
+}
+
 //////////////////////////////////////////////////////////////////////////////
 
 static void qDumpQByteArray(QDumper &d)
@@ -1213,9 +1243,8 @@ static void qDumpQList(QDumper &d)
         bool isInternal = innerSize <= int(sizeof(void*))
             && isMovableType(d.innertype);
 
-    P(d, "internal", (int)isInternal);
-
-    P(d, "childtype", d.innertype);
+        P(d, "internal", (int)isInternal);
+        P(d, "childtype", d.innertype);
         if (n > 1000)
             n = 1000;
         d << ",children=[";
@@ -1245,11 +1274,8 @@ static void qDumpQList(QDumper &d)
             }
             d.endHash();
         }
-        if (n < nn) {
-            d.beginHash();
-            P(d, "value", "<incomplete>");
-            d.endHash();
-        }
+        if (n < nn)
+            d.putEllipsis();
         d << "]";
     }
     d.disarm();
@@ -1491,7 +1517,6 @@ static void qDumpQObject(QDumper &d)
         d.beginHash();
             P(d, "name", "methods");
             P(d, "exp", "*(class '"NS"QObject'*)" << d.data);
-            P(d, "type", NS"QObjectMethodList");
             P(d, "value", "<" << mo->methodCount() << " items>");
             P(d, "numchild", mo->methodCount());
         d.endHash();
@@ -1877,11 +1902,7 @@ static void qDumpQSet(QDumper &d)
                 d.endHash();
                 ++i;
                 if (i > 10000) {
-                    d.beginHash();
-                    P(d, "name", "Warning:");
-                    P(d, "value", "<incomplete>");
-                    P(d, "type", "");
-                    d.endHash();
+                    d.putEllipsis();
                     break;
                 }
             }
@@ -1936,13 +1957,8 @@ static void qDumpQStringList(QDumper &d)
             P(d, "valueencoded", "1");
             d.endHash();
         }
-        if (n < list.size()) {
-            d.beginHash();
-            P(d, "name", "Warning:");
-            P(d, "value", "<incomplete>");
-            P(d, "type", "");
-            d.endHash();
-        }
+        if (n < list.size())
+            d.putEllipsis();
         d << "]";
     }
     d.disarm();
@@ -2066,37 +2082,21 @@ static void qDumpQVector(QDumper &d)
     P(d, "valuedisabled", "true");
     P(d, "numchild", n);
     if (d.dumpChildren) {
-        bool innerTypeIsPointer = isPointerType(d.innertype);
         QByteArray strippedInnerType = stripPointerType(d.innertype);
-
+        const char *stripped =
+            isPointerType(d.innertype) ? strippedInnerType.data() : 0;
         if (n > 1000)
             n = 1000;
         d << ",children=[";
         for (int i = 0; i != n; ++i) {
             d.beginHash();
             P(d, "name", "[" << i << "]");
-            const void *p = addOffset(v, i * innersize + typeddatasize);
-            if (innerTypeIsPointer) {
-                if (deref(p)) {
-                    //P(d, "value","@" << p);
-                    qDumpInnerValue(d, strippedInnerType.data(), deref(p));
-                } else {
-                    P(d, "type", d.innertype);
-                    P(d, "value", "<null>");
-                    P(d, "numchild", "0");
-                }
-            } else {
-                qDumpInnerValue(d, d.innertype, p);
-            }
-            d.endHash();
-        }
-        if (n < nn) {
-            d.beginHash();
-            P(d, "name", "[...]");
-            P(d, "value", "<incomplete>");
-            P(d, "type", d.innertype);
+            qDumpInnerValueOrPointer(d, d.innertype, stripped,
+                addOffset(v, i * innersize + typeddatasize));
             d.endHash();
         }
+        if (n < nn)
+            d.putEllipsis();
         d << "]";
     }
     d.disarm();
@@ -2111,23 +2111,17 @@ static void qDumpStdList(QDumper &d)
     qCheckAccess(p);
     p = deref(p);
     qCheckAccess(p);
-    p = deref(p);
-    qCheckAccess(p);
     p = deref(addOffset(d.data, sizeof(void*)));
     qCheckAccess(p);
     p = deref(addOffset(p, sizeof(void*)));
     qCheckAccess(p);
     p = deref(addOffset(p, sizeof(void*)));
     qCheckAccess(p);
-    p = deref(addOffset(p, sizeof(void*)));
-    qCheckAccess(p);
 
     int nn = 0;
     std::list<int>::const_iterator it = list.begin();
-    for (int i = 0; i < 101 && it != list.end(); ++i, ++it) {
+    for (nn < 101 && it != list.end(); ++nn, ++it)
         qCheckAccess(it.operator->());
-        ++nn;
-    }
 
     if (nn > 100)
         P(d, "value", "<more than 100 items>");
@@ -2137,36 +2131,19 @@ static void qDumpStdList(QDumper &d)
 
     P(d, "valuedisabled", "true");
     if (d.dumpChildren) {
-        unsigned innersize = d.extraInt[0];
-        bool innerTypeIsPointer = isPointerType(d.innertype);
         QByteArray strippedInnerType = stripPointerType(d.innertype);
+        const char *stripped =
+            isPointerType(d.innertype) ? strippedInnerType.data() : 0;
         d << ",children=[";
         std::list<int>::const_iterator it = list.begin();
         for (int i = 0; i < 1000 && it != list.end(); ++i, ++it) {
             d.beginHash();
             P(d, "name", "[" << i << "]");
-            P(d, "type", d.innertype);
-            const void *p = it.operator->();
-            if (innerTypeIsPointer) {
-                if (deref(p)) {
-                    qDumpInnerValue(d, strippedInnerType.data(), deref(p));
-                } else {
-                    P(d, "type", d.innertype);
-                    P(d, "value", "<null>");
-                    P(d, "numchild", "0");
-                }
-            } else {
-                qDumpInnerValue(d, d.innertype, p);
-            }
-            d.endHash();
-        }
-        if (it != list.end()) {
-            d.beginHash();
-            P(d, "name", "[...]");
-            P(d, "value", "<incomplete>");
-            P(d, "type", d.innertype);
+            qDumpInnerValueOrPointer(d, d.innertype, stripped, it.operator->());
             d.endHash();
         }
+        if (it != list.end())
+            d.putEllipsis();
         d << "]";
     }
     d.disarm();
@@ -2238,37 +2215,21 @@ static void qDumpStdVector(QDumper &d)
     P(d, "numchild", n);
     if (d.dumpChildren) {
         unsigned innersize = d.extraInt[0];
-        bool innerTypeIsPointer = isPointerType(d.innertype);
         QByteArray strippedInnerType = stripPointerType(d.innertype);
-
+        const char *stripped =
+            isPointerType(d.innertype) ? strippedInnerType.data() : 0;
         if (n > 1000)
             n = 1000;
         d << ",children=[";
         for (int i = 0; i != n; ++i) {
             d.beginHash();
             P(d, "name", "[" << i << "]");
-            const void *p = addOffset(v->start, i * innersize);
-            if (innerTypeIsPointer) {
-                if (deref(p)) {
-                    //P(d, "value","@" << p);
-                    qDumpInnerValue(d, strippedInnerType.data(), deref(p));
-                } else {
-                    P(d, "type", d.innertype);
-                    P(d, "value", "<null>");
-                    P(d, "numchild", "0");
-                }
-            } else {
-                qDumpInnerValue(d, d.innertype, p);
-            }
-            d.endHash();
-        }
-        if (n < nn) {
-            d.beginHash();
-            P(d, "name", "[...]");
-            P(d, "value", "<incomplete>");
-            P(d, "type", d.innertype);
+            qDumpInnerValueOrPointer(d, d.innertype, stripped,
+                addOffset(v->start, i * innersize));
             d.endHash();
         }
+        if (n < nn)
+            d.putEllipsis();
         d << "]";
     }
     d.disarm();
diff --git a/tests/manual/gdbdebugger/simple/app.cpp b/tests/manual/gdbdebugger/simple/app.cpp
index 4dc01961958061e8b214b171db682a04ad46eb0c..35933ec5a209bba2e51e818c918c17f5dab404b4 100644
--- a/tests/manual/gdbdebugger/simple/app.cpp
+++ b/tests/manual/gdbdebugger/simple/app.cpp
@@ -129,7 +129,7 @@ void testArray()
 }
 
 
-void testByteArray()
+void testQByteArray()
 {
     QByteArray ba = "Hello";
     ba += '"';
@@ -140,7 +140,7 @@ void testByteArray()
 }
 
 
-void testHash()
+void testQHash()
 {
     QHash<int, float> hgg0;
     hgg0[11] = 11.0;
@@ -164,7 +164,7 @@ void testHash()
     hash.insert(".", QPointer<QObject>(&ob));
 }
 
-void testImage()
+void testQImage()
 {
     QImage im(QSize(200, 200), QImage::Format_RGB32);
     im.fill(QColor(200, 100, 130).rgba());
@@ -192,7 +192,7 @@ void testIO()
 }
 
 
-void testList()
+void testQList()
 {
 #if 1
     QList<int> li;
@@ -254,7 +254,7 @@ void testList()
     v.push_back("dd");
  }
 
-void testMap()
+void testQMap()
 {
     QMap<uint, QStringList> ggl;
     ggl[11] = QStringList() << "11";
@@ -289,7 +289,7 @@ void testMap()
 #endif
 }
 
-void testObject(int &argc, char *argv[])
+void testQObject(int &argc, char *argv[])
 {
     QApplication app(argc, argv);
     QAction act("xxx", &app);
@@ -317,7 +317,7 @@ void testObject(int &argc, char *argv[])
     app.exec();
 }
 
-void testPixmap()
+void testQPixmap()
 {
     QImage im(QSize(200, 200), QImage::Format_RGB32);
     im.fill(QColor(200, 100, 130).rgba());
@@ -353,7 +353,7 @@ void testPlugin()
     }
 }
 
-void testSet()
+void testQSet()
 {
     QSet<int> hgg0;
     hgg0.insert(11);
@@ -506,7 +506,7 @@ void testStdVector()
     vec.push_back(false);
 }
 
-void testString()
+void testQString()
 {
     QString str = "Hello ";
     str += " big, ";
@@ -516,19 +516,9 @@ void testString()
     str += " World ";
     str += " World ";
     str += " World ";
-    str += " World ";
-    str += " World ";
-    str += " World ";
-    str += " World ";
-    str += " World ";
-    str += " World ";
-    str += " World ";
-    str += " World ";
-    str += " World ";
-    str += " World ";
 }
 
-void testString3()
+void testQString3()
 {
     QString str = "Hello ";
     str += " big, ";
@@ -544,7 +534,7 @@ void testString3()
     delete pstring;
 }
 
-void testStringList()
+void testQStringList()
 {
     QStringList l;
     l << "Hello ";
@@ -578,7 +568,7 @@ private:
     int m_id;
 };
 
-void testThreads()
+void testQThread()
 {
     Thread thread1(1);
     Thread thread2(2);
@@ -588,7 +578,7 @@ void testThreads()
     thread2.wait();
 }
 
-void testVariant1()
+void testQVariant1()
 {
     QVariant v;
     v = 1;
@@ -597,7 +587,7 @@ void testVariant1()
     v = 1;
 }
 
-void testVariant2()
+void testQVariant2()
 {
     QVariant var;
 #if 0
@@ -622,7 +612,7 @@ void testVariant2()
     var.setValue(my);
 }
 
-void testVariant3()
+void testQVariant3()
 {
     QList<int> list;
     list << 1 << 2 << 3;
@@ -631,7 +621,7 @@ void testVariant3()
     list = qVariantValue<QList<int> >(variant);
 }
 
-void testVector()
+void testQVector()
 {
     QVector<Foo *> plist;
     plist.append(new Foo(1));
@@ -652,7 +642,7 @@ void testVector()
     vec.append(false);
 }
 
-void testVectorOfList()
+void testQVectorOfQList()
 {
     QVector<QList<int> > v;
     QVector<QList<int> > *pv = &v;
@@ -805,28 +795,28 @@ int main(int argc, char *argv[])
     testStdVector();
 
     testPlugin();
-    testList();
+    testQList();
     testNamespace();
     //return 0;
-    testByteArray();
-    testHash();
-    testImage();
-    testMap();
-    testString();
-    testSet();
-    testStringList();
+    testQByteArray();
+    testQHash();
+    testQImage();
+    testQMap();
+    testQString();
+    testQSet();
+    testQStringList();
     testStruct();
     //testThreads();
-    testVariant1();
-    testVariant2();
-    testVariant3();
-    testVector();
-    testVectorOfList();
+    testQVariant1();
+    testQVariant2();
+    testQVariant3();
+    testQVector();
+    testQVectorOfQList();
 
 
     *(int *)0 = 0;
 
-    testObject(argc, argv);
+    testQObject(argc, argv);
 
 
     //QColor color(255,128,10);