forked from qt-creator/qt-creator
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:
@@ -960,9 +960,11 @@ static inline SymbolGroupValueVector qMap4Nodes(const SymbolGroupValue &v, Vecto
|
||||
SymbolGroupValueVector rc;
|
||||
rc.reserve(count);
|
||||
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) {
|
||||
rc.push_back(n);
|
||||
n = n["forward"][unsigned(0)];
|
||||
ULONG64 address = n.addressOfAncestor("forward");
|
||||
n = n.addSymbol(address, type);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -139,12 +139,7 @@ SymbolGroupValue SymbolGroupValue::addSymbolForAncestor(const std::string &ances
|
||||
const SymbolAncestorInfo info = infoOfAncestor(ancestorName);
|
||||
if (info.isValid()) {
|
||||
const ULONG64 base = isPointerType(type()) ? pointerValue() : address();
|
||||
const std::string &pointerToType =
|
||||
pointedToSymbolName(base + info.offset, stripClassPrefixes(info.type));
|
||||
if (SymbolGroupNode *ancestorNode =
|
||||
node()->symbolGroup()->addSymbol(module(), pointerToType, "", "", &std::string())) {
|
||||
return SymbolGroupValue(ancestorNode, m_context);
|
||||
}
|
||||
return addSymbol(base + info.offset, stripClassPrefixes(info.type));
|
||||
}
|
||||
if (isValid() && SymbolGroupValue::verbose) { // Do not report subsequent errors
|
||||
DebugPrint dp;
|
||||
@@ -221,6 +216,22 @@ SymbolAncestorInfo SymbolGroupValue::infoOfAncestor(const std::string &name) con
|
||||
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
|
||||
{
|
||||
if (ensureExpanded())
|
||||
|
||||
@@ -96,6 +96,8 @@ public:
|
||||
std::string typeOfAncestor(const std::string &childName) const;
|
||||
SymbolAncestorInfo infoOfAncestor(const std::string &name) const;
|
||||
|
||||
SymbolGroupValue addSymbol(const ULONG64 address, const std::string &type) const;
|
||||
|
||||
SymbolGroupNode *node() const { return m_node; }
|
||||
SymbolGroupValueContext context() const { return m_context; }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user