From 7bfa174b87259f30f783d62a2b6475ac8dcd7f49 Mon Sep 17 00:00:00 2001
From: David Schulz <david.schulz@digia.com>
Date: Wed, 29 Oct 2014 10:56:44 +0100
Subject: [PATCH] CdbExt: Fix dumping of QByteArray inside QPrivate class.

Change-Id: I9e9b7af1cc2c910b6c5865a611963b371248f90e
Reviewed-by: Christian Stenger <christian.stenger@digia.com>
---
 src/libs/qtcreatorcdbext/symbolgroupvalue.cpp | 21 +++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)

diff --git a/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp b/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp
index c189849c91e..00c70b1bb2d 100644
--- a/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp
+++ b/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp
@@ -1789,12 +1789,25 @@ static bool dumpQByteArrayFromQPrivateClass(const SymbolGroupValue &v,
     const ULONG64 byteArrayAddress = addressOfQPrivateMember(v, mode, additionalOffset);
     if (!byteArrayAddress)
         return false;
-    const std::string dumpType = QtInfo::get(v.context()).prependQtCoreModule("QByteArray");
-    const std::string symbolName = SymbolGroupValue::pointedToSymbolName(byteArrayAddress , dumpType);
+    std::string dumpType = QtInfo::get(v.context()).prependQtCoreModule("QByteArray");
+    std::string symbolName = SymbolGroupValue::pointedToSymbolName(byteArrayAddress , dumpType);
+    if (SymbolGroupValue::verbose > 1)
+        DebugPrint() <<  "dumpQByteArrayFromQPrivateClass of " << v.name() << '/'
+                     << v.type() << " mode=" << mode
+                     << " offset=" << additionalOffset << " address=0x" << std::hex << byteArrayAddress
+                     << std::dec << " expr=" << symbolName;
     SymbolGroupNode *byteArrayNode =
             v.node()->symbolGroup()->addSymbol(v.module(), symbolName, std::string(), &errorMessage);
-    if (!byteArrayNode)
-        return false;
+    if (!byteArrayNode && errorMessage.find("DEBUG_ANY_ID") != std::string::npos) {
+        // HACK:
+        // In some rare cases the AddSymbol can't create a node with a given module name,
+        // but is able to add the symbol without any modulename.
+        dumpType = QtInfo::get(v.context()).prependModuleAndNameSpace("QByteArray", "", QtInfo::get(v.context()).nameSpace);
+        symbolName = SymbolGroupValue::pointedToSymbolName(byteArrayAddress , dumpType);
+        byteArrayNode = v.node()->symbolGroup()->addSymbol(v.module(), symbolName, std::string(), &errorMessage);
+        if (!byteArrayNode)
+            return false;
+    }
     return dumpQByteArray(SymbolGroupValue(byteArrayNode, v.context()), str);
 }
 
-- 
GitLab