diff --git a/bin/gdbmacros/gdbmacros.cpp b/bin/gdbmacros/gdbmacros.cpp
index ca19e5870270f147d6b3ea9fc9cb083435fd16b8..a3b3de6a4de92e51bbc0d50788010beefd2460f8 100644
--- a/bin/gdbmacros/gdbmacros.cpp
+++ b/bin/gdbmacros/gdbmacros.cpp
@@ -2155,6 +2155,14 @@ static void qDumpStdMap(QDumper &d)
     P(d, "valuedisabled", "true");
     P(d, "valueoffset", d.extraInt[2]);
 
+    // HACK: we need a properly const qualified version of the
+    // std::pair used. We extract it from the allocator parameter
+    // as it is there, and, equally importantly, in an order that
+    // gdb accepts when fed with it.
+    char *pairType = (char *)(d.templateParameters[3]) + 16;
+    pairType[strlen(pairType) - 2] = 0;
+    P(d, "pairtype", pairType);
+    
     if (d.dumpChildren) {
         bool simpleKey = isSimpleType(keyType);
         bool simpleValue = isShortKey(valueType);
@@ -2177,7 +2185,7 @@ static void qDumpStdMap(QDumper &d)
                 d.beginHash();
                 P(d, "name", "[" << i << "]");
                 P(d, "addr", it.operator->());
-                P(d, "type", "std::pair<const " << keyType << "," << valueType << " >");
+                P(d, "type", pairType);
                 d.endHash();
             }
         }
diff --git a/doc/coding-style.qdoc b/doc/coding-style.qdoc
index 3e20915745533f7622eb815d3baf27c54ed23d15..c2e886c85b3fb355e5b568cc741672f63725598d 100644
--- a/doc/coding-style.qdoc
+++ b/doc/coding-style.qdoc
@@ -108,6 +108,34 @@ in C++.
 \endcode
 
 
+\o Using Qt's foreach is ok in non-time critical code when using a QTL 
+   container. It is a nice way to keep line noise down and to give the
+   loop variable a proper name:
+
+\code
+        foreach (QWidget *widget, container)
+            doSomething(widget);
+
+        -VS-
+
+	Container::iterator end = container.end();
+	for (Container::iterator it = container.begin(); it != end; ++it)
+            doSomething(*it);
+\endcode
+   
+    If the loop variable can be made const, do so. This can prevent 
+    unnecessary detaching of shared data in some cases. So:
+
+\code
+        foreach (const QString &name, someListOfNames)
+            doSomething(name);
+        
+        - NOT -
+
+        foreach (QString name, someListOfNames)
+            doSomething(name);
+\endcode
+
 
 \section1 Formatting
 
diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp
index 710bee9aee5e666a81eb2eee7c150688ef514775..e2bbfb3766e879929f842ad336b79cd8f1f0d19f 100644
--- a/src/plugins/debugger/gdbengine.cpp
+++ b/src/plugins/debugger/gdbengine.cpp
@@ -1362,7 +1362,7 @@ void GdbEngine::handleShowVersion(const GdbResultRecord &response)
     if (response.resultClass == GdbResultDone) {
         m_gdbVersion = 100;
         QString msg = response.data.findChild("consolestreamoutput").data();
-        QRegExp supported("GNU gdb(.*) (\\d+)\\.(\\d+)\\.(\\d+)");
+        QRegExp supported("GNU gdb(.*) (\\d+)\\.(\\d+)(\\.(\\d+))?");
         if (supported.indexIn(msg) == -1) {
             qDebug() << "UNSUPPORTED GDB VERSION " << msg;
             QStringList list = msg.split("\n");
@@ -1384,7 +1384,7 @@ void GdbEngine::handleShowVersion(const GdbResultRecord &response)
         } else {
             m_gdbVersion = 10000 * supported.cap(2).toInt()
                          +   100 * supported.cap(3).toInt()
-                         +     1 * supported.cap(4).toInt();
+                         +     1 * supported.cap(5).toInt();
             //qDebug() << "GDB VERSION " << m_gdbVersion;
         }
     }
@@ -3022,8 +3022,13 @@ void GdbEngine::runCustomDumper(const WatchData & data0, bool dumpChildren)
     } else if (outertype == "std::map") {
         // We don't want the comparator and the allocator confuse gdb.
         // But we need the offset of the second item in the value pair.
-        extraArgs[2] = "(size_t)&(('std::pair<const " + inners.at(0)
-            + "," + inners.at(1) + ">'*)0)->second";
+        // We read the type of the pair from the allocator argument because
+        // that gets the constness "right" (in the sense that gdb can
+        // read it back;
+        QString pairType = inners.at(3);
+        // remove 'std::allocator<...>':
+        pairType = pairType.mid(15, pairType.size() - 15 - 2);
+        extraArgs[2] = "(size_t)&(('" + pairType + "'*)0)->second";
         extraArgs[3] = "0";
     } else if (outertype == "std::basic_string") {
         //qDebug() << "EXTRACT TEMPLATE: " << outertype << inners;
diff --git a/tests/manual/gdbdebugger/simple/app.cpp b/tests/manual/gdbdebugger/simple/app.cpp
index 149be98c271905564acb2a8f2274442a5305e578..24626064e4f1fb4d66484cdedd5da404df3e5774 100644
--- a/tests/manual/gdbdebugger/simple/app.cpp
+++ b/tests/manual/gdbdebugger/simple/app.cpp
@@ -74,8 +74,6 @@ uint qHash(const double & f)
     return int(f);
 }
 
-#define X myns
-X::QString str;
 
 class  Foo
 {
@@ -418,6 +416,11 @@ void testStdMap()
     gg3["33.0"] = Foo(33);
     gg3["44.0"] = Foo(44);
 
+
+    std::map<const char *, Foo> m1;
+    m1["22.0"] = Foo(22);
+    m1["33.0"] = Foo(33);
+    m1["44.0"] = Foo(44);
 #if 1
     std::map<uint, uint> gg;
     gg[11] = 1;