diff --git a/share/qtcreator/gdbmacros/dumper.py b/share/qtcreator/gdbmacros/dumper.py
index 9082a752f05b9c1616be675347b9ebe9e2d60700..a70d5a002f8f220ac4e39285aa49283b95ad7672 100644
--- a/share/qtcreator/gdbmacros/dumper.py
+++ b/share/qtcreator/gdbmacros/dumper.py
@@ -178,6 +178,17 @@ def listOfBreakpoints(d):
         bp = Breakpoint()
 
 
+# Creates a list of field names of an anon union or struct
+def listOfFields(type):
+    fields = []
+    for field in type.fields():
+        if len(field.name) > 0:
+            fields += field.name
+        else:
+            fields += listOfFields(field.type)
+    return fields
+
+
 def listOfLocals(varList):
     try:
         frame = gdb.selected_frame()
@@ -1148,22 +1159,36 @@ class Dumper:
                         self.putField("iname", child.iname)
                         self.safePutItemHelper(child)
                         self.endHash()
-                    elif field.name == "":
+                    elif len(field.name) == 0:
                         # Anonymous union. We need a dummy name to distinguish
                         # multiple anonymous unions in the struct.
-                        iname = "%s.#%d" % (item.iname, anonNumber)
                         anonNumber += 1
+                        iname = "%s.#%d" % (item.iname, anonNumber)
+
+                        #innerType = item.value.type.target()
+                        #self.putType(innerType)
+                        #self.childTypes.append(
+                        #    stripClassTag(str(innerType)))
+                        #self.putItemHelper(
+                        #    Item(item.value.dereference(), item.iname, None, None))
+                        #self.childTypes.pop()
+                        #isHandled = True
+
                         self.beginHash()
                         self.putField("iname", iname)
-                        self.putField("name", "<n/a>")
+                        self.putField("name", "#%d" % anonNumber)
                         self.putField("value", " ")
                         self.putField("type", "<anonymous union>")
                         if self.isExpandedIName(iname):
                             self.beginChildren()
-                            for f in field.type.fields():
-                                child = Item(item.value[f.name],
-                                    item.iname, f.name, f.name)
-                                self.safePutItem(child)
+                            fields = listOfFields(field.type)
+                            for field in fields:
+                                value = item.value[field]
+                                child = Item(value, item.iname, field, field)
+                                self.beginHash()
+                                self.put('addr="%s",' % cleanAddress(value.address))
+                                self.safePutItemHelper(child)
+                                self.endHash();
                             self.endChildren()
                         self.endHash()
                     else:
diff --git a/tests/manual/gdbdebugger/simple/app.cpp b/tests/manual/gdbdebugger/simple/app.cpp
index 204990ca3a534c25a27d9ea68c950a87be95437a..ad38df679043f18cd864c5d258deb4147504369c 100644
--- a/tests/manual/gdbdebugger/simple/app.cpp
+++ b/tests/manual/gdbdebugger/simple/app.cpp
@@ -212,6 +212,25 @@ void testArray()
     }
 }
 
+struct TestAnonymous
+{
+    union {
+        struct { int i; int b; };
+        struct { float f; };
+        double d;
+    };
+};
+
+// union { struct { int a; }; struct { int b; }; };
+
+void testAnonymous()
+{
+    TestAnonymous a;
+    a.i = 1;
+    a.i = 2;
+    a.i = 3;
+}
+
 void testQByteArray()
 {
     QByteArray ba = "Hello";
@@ -1415,6 +1434,7 @@ int testReference()
 
 int main(int argc, char *argv[])
 {
+    testAnonymous();
     testReference();
     //testEndlessRecursion();
     testQStack();