Cdb: Fix Qt4 QMap dumper

The expanding depth of variables is limited in cdb. Instead of expanding
the linked list inside qmap add a new symbol for each child node.

Task-number: QTCREATORBUG-16212
Change-Id: I89a288c92d9168a54afcf2cdb8c8b8a6dd98a3b4
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2016-08-26 08:37:03 +02:00
parent 6b112c1b04
commit 015e12a72a
3 changed files with 22 additions and 7 deletions

View File

@@ -960,9 +960,11 @@ static inline SymbolGroupValueVector qMap4Nodes(const SymbolGroupValue &v, Vecto
SymbolGroupValueVector rc; SymbolGroupValueVector rc;
rc.reserve(count); rc.reserve(count);
SymbolGroupValue n = e["forward"][unsigned(0)]; SymbolGroupValue n = e["forward"][unsigned(0)];
const std::string &type = SymbolGroupValue::stripClassPrefixes(n.type());
for (VectorIndexType i = 0; i < count && n && n.pointerValue() != ePtr; ++i) { for (VectorIndexType i = 0; i < count && n && n.pointerValue() != ePtr; ++i) {
rc.push_back(n); rc.push_back(n);
n = n["forward"][unsigned(0)]; ULONG64 address = n.addressOfAncestor("forward");
n = n.addSymbol(address, type);
} }
return rc; return rc;
} }

View File

@@ -139,12 +139,7 @@ SymbolGroupValue SymbolGroupValue::addSymbolForAncestor(const std::string &ances
const SymbolAncestorInfo info = infoOfAncestor(ancestorName); const SymbolAncestorInfo info = infoOfAncestor(ancestorName);
if (info.isValid()) { if (info.isValid()) {
const ULONG64 base = isPointerType(type()) ? pointerValue() : address(); const ULONG64 base = isPointerType(type()) ? pointerValue() : address();
const std::string &pointerToType = return addSymbol(base + info.offset, stripClassPrefixes(info.type));
pointedToSymbolName(base + info.offset, stripClassPrefixes(info.type));
if (SymbolGroupNode *ancestorNode =
node()->symbolGroup()->addSymbol(module(), pointerToType, "", "", &std::string())) {
return SymbolGroupValue(ancestorNode, m_context);
}
} }
if (isValid() && SymbolGroupValue::verbose) { // Do not report subsequent errors if (isValid() && SymbolGroupValue::verbose) { // Do not report subsequent errors
DebugPrint dp; DebugPrint dp;
@@ -221,6 +216,22 @@ SymbolAncestorInfo SymbolGroupValue::infoOfAncestor(const std::string &name) con
return info; return info;
} }
SymbolGroupValue SymbolGroupValue::addSymbol(const ULONG64 address, const std::string &type) const
{
const std::string &pointerToType = pointedToSymbolName(address, type);
if (SymbolGroupNode *ancestorNode =
node()->symbolGroup()->addSymbol(module(), pointerToType, "", "", &std::string())) {
return SymbolGroupValue(ancestorNode, m_context);
}
if (isValid() && SymbolGroupValue::verbose) { // Do not report subsequent errors
DebugPrint dp;
dp << this->name() << "::addSymbol(\"" << address << "\", \"" << address << "\") failed. ";
formatNodeError(m_node, dp);
}
return SymbolGroupValue(m_errorMessage);
}
unsigned SymbolGroupValue::childCount() const unsigned SymbolGroupValue::childCount() const
{ {
if (ensureExpanded()) if (ensureExpanded())

View File

@@ -96,6 +96,8 @@ public:
std::string typeOfAncestor(const std::string &childName) const; std::string typeOfAncestor(const std::string &childName) const;
SymbolAncestorInfo infoOfAncestor(const std::string &name) const; SymbolAncestorInfo infoOfAncestor(const std::string &name) const;
SymbolGroupValue addSymbol(const ULONG64 address, const std::string &type) const;
SymbolGroupNode *node() const { return m_node; } SymbolGroupNode *node() const { return m_node; }
SymbolGroupValueContext context() const { return m_context; } SymbolGroupValueContext context() const { return m_context; }