From 436a0ffebffd5ecaa07596cd22baf6cc11265713 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Tue, 20 Apr 2010 12:09:50 +0200
Subject: [PATCH] Debugger[CDB]: Fix expanding arrays.

Strip '[', ']' off inames in coreengine so
that the name lookup for them works.
Handle 64bit-addresses in .dvalloc-output
parsing for dumpers. Some debug formatting.

Task-number: QTCREATORBUG-1216
---
 .../debugger/cdb/cdbsymbolgroupcontext.cpp    | 21 +++++--------
 src/plugins/debugger/cdb/coreengine.cpp       | 31 +++++++++----------
 .../debugger/cdb/symbolgroupcontext.cpp       |  6 ++++
 3 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/src/plugins/debugger/cdb/cdbsymbolgroupcontext.cpp b/src/plugins/debugger/cdb/cdbsymbolgroupcontext.cpp
index c14d5c2a006..3e3a6438b3f 100644
--- a/src/plugins/debugger/cdb/cdbsymbolgroupcontext.cpp
+++ b/src/plugins/debugger/cdb/cdbsymbolgroupcontext.cpp
@@ -218,7 +218,7 @@ static inline void fixDumperResult(const WatchData &source,
 // classes (see note in its header documentation).
 bool WatchHandleDumperInserter::expandPointerToDumpable(const WatchData &wd, QString *errorMessage)
 {
-    if (debugCDBWatchHandling)
+    if (debugCDBWatchHandling > 1)
         qDebug() << ">expandPointerToDumpable" << wd.toString();
 
     bool handled = false;
@@ -252,7 +252,7 @@ bool WatchHandleDumperInserter::expandPointerToDumpable(const WatchData &wd, QSt
         m_wh->insertBulkData(m_dumperResult);
         handled = true;
     } while (false);
-    if (debugCDBWatchHandling)
+    if (debugCDBWatchHandling > 1)
         qDebug() << "<expandPointerToDumpable returns " << handled << *errorMessage;
     return handled;
 }
@@ -368,14 +368,6 @@ unsigned CdbSymbolGroupContext::watchDataAt(unsigned long index, WatchData *wd)
     const unsigned rc = dumpValue(index, &iname, &(wd->name), &address,
                                   &typeId, &type, &value);
     wd->exp = wd->iname = iname.toLatin1();
-    // Trigger numeric sorting for arrays "local.[22]" -> "local.22"
-    if (wd->iname.endsWith(']')) {
-        const int openingBracketPos = wd->iname.lastIndexOf('[');
-        if (openingBracketPos != -1) {
-            wd->iname.truncate(wd->iname.size() - 1);
-            wd->iname.remove(openingBracketPos, 1);
-        }
-    }
     wd->setAddress(("0x") + QByteArray::number(address, 16));
     wd->setType(type, false);
     if (rc & OutOfScope) {
@@ -396,8 +388,7 @@ unsigned CdbSymbolGroupContext::watchDataAt(unsigned long index, WatchData *wd)
 bool CdbSymbolGroupContext::populateModelInitially(WatchHandler *wh, QString *errorMessage)
 {
     if (debugCDBWatchHandling)
-        qDebug() << "populateModelInitially dumpers=" << m_useDumpers
-                << toString();
+        qDebug() << ">populateModelInitially dumpers=" << m_useDumpers;
     // Recurse down items that are initially expanded in the view, stop processing for
     // dumper items.
     const CdbSymbolGroupRecursionContext rctx(this, OwnerSymbolGroupDumper);
@@ -412,6 +403,8 @@ bool CdbSymbolGroupContext::populateModelInitially(WatchHandler *wh, QString *er
                                      WatchHandlerExpandedPredicate(wh),
                                      falsePredicate,
                                      errorMessage);
+    if (debugCDBWatchHandling)
+        qDebug("<populateModelInitially\n%s\n", qPrintable(toString()));
     return rc;
 }
 
@@ -420,7 +413,9 @@ bool CdbSymbolGroupContext::completeData(const WatchData &incompleteLocal,
                                          QString *errorMessage)
 {
     if (debugCDBWatchHandling)
-        qDebug() << ">completeData src=" << incompleteLocal.source << incompleteLocal.toString();
+        qDebug(">completeData src=%d %s\n%s\n",
+               incompleteLocal.source, qPrintable(incompleteLocal.toString()),
+               qPrintable(toString()));
 
     const CdbSymbolGroupRecursionContext rctx(this, OwnerSymbolGroupDumper);
     // Expand symbol group items, recurse one level from desired item
diff --git a/src/plugins/debugger/cdb/coreengine.cpp b/src/plugins/debugger/cdb/coreengine.cpp
index 6705906759a..152e9de26d4 100644
--- a/src/plugins/debugger/cdb/coreengine.cpp
+++ b/src/plugins/debugger/cdb/coreengine.cpp
@@ -30,6 +30,7 @@
 #include "coreengine.h"
 #include "debugeventcallbackbase.h"
 #include "debugoutputbase.h"
+#include "symbolgroupcontext.h"
 
 #include <utils/winutils.h>
 #include <utils/abstractprocess.h>
@@ -725,9 +726,9 @@ bool CoreEngine::endSession(QString *appendableErrorMessage)
     return true;
 }
 
-bool CoreEngine::allocDebuggeeMemory(int size, ULONG64 *address, QString *errorMessage)
+bool CoreEngine::allocDebuggeeMemory(int size, ULONG64 *addressPtr, QString *errorMessage)
 {
-    *address = 0;
+    *addressPtr = 0;
     const QString allocCmd = QLatin1String(".dvalloc ") + QString::number(size);
 
     QSharedPointer<StringOutputHandler> outputHandler(new StringOutputHandler);
@@ -735,22 +736,20 @@ bool CoreEngine::allocDebuggeeMemory(int size, ULONG64 *address, QString *errorM
     Q_UNUSED(redir)
     if (!executeDebuggerCommand(allocCmd, errorMessage))
         return false;
-   // "Allocated 1000 bytes starting at 003a0000" .. hopefully never localized
-    bool ok = false;
-    const QString output = outputHandler->result();
+    // "Allocated 1000 bytes starting at 003a0000" or
+    // "Allocated 1000 bytes starting at 00000000'000023ab" (64bit) / hopefully never localized
+    const QString output = outputHandler->result().trimmed();
     const int lastBlank = output.lastIndexOf(QLatin1Char(' '));
     if (lastBlank != -1) {
-        const qint64 addri = output.mid(lastBlank + 1).toLongLong(&ok, 16);
-        if (ok)
-            *address = addri;
-    }
-     if (debug > 1)
-        qDebug() << Q_FUNC_INFO << '\n' << output << *address << ok;
-    if (!ok) {
-        *errorMessage = QString::fromLatin1("Failed to parse output '%1'").arg(output);
-        return false;
-    }
-    return true;
+        const QString hexNumberS = QLatin1String("0x") + output.mid(lastBlank + 1);
+        quint64 address;
+        if (SymbolGroupContext::getUnsignedHexValue(hexNumberS, &address)) {
+            *addressPtr = address;
+            return true;
+        }
+    } // blank
+    *errorMessage = QString::fromLatin1("Failed to parse output '%1'").arg(output);
+    return false;
 }
 
 // Alloc an AscII string in debuggee
diff --git a/src/plugins/debugger/cdb/symbolgroupcontext.cpp b/src/plugins/debugger/cdb/symbolgroupcontext.cpp
index 28cd87f6032..a921f50b4d4 100644
--- a/src/plugins/debugger/cdb/symbolgroupcontext.cpp
+++ b/src/plugins/debugger/cdb/symbolgroupcontext.cpp
@@ -229,6 +229,12 @@ void SymbolGroupContext::populateINameIndexMap(const QString &prefix, unsigned l
                 symbolName = QLatin1String("<unnamed");
                 symbolName += QString::number(m_unnamedSymbolNumber++);
                 symbolName += QLatin1Char('>');
+            } else {
+                // Trigger numeric sorting for arrays "local.[22]" -> "local.22"
+                if (symbolName.startsWith(QLatin1Char('[')) && symbolName.endsWith(QLatin1Char(']'))) {
+                    symbolName.truncate(symbolName.size() - 1);
+                    symbolName.remove(0, 1);
+                }
             }
             // Find a unique name in case the variable is shadowed by
             // an existing one
-- 
GitLab