diff --git a/src/libs/qtcreatorcdbext/qtcreatorcdbext.def b/src/libs/qtcreatorcdbext/qtcreatorcdbext.def
index 6bd14850ed6..e0e94f5f4e5 100644
--- a/src/libs/qtcreatorcdbext/qtcreatorcdbext.def
+++ b/src/libs/qtcreatorcdbext/qtcreatorcdbext.def
@@ -16,5 +16,6 @@ idle
help
memory
shutdownex
+test
stack
KnownStructOutput
diff --git a/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp b/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp
index ee1eb28a289..dab97cb1aa7 100644
--- a/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp
+++ b/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp
@@ -96,7 +96,8 @@ enum Command {
CmdHelp,
CmdMemory,
CmdStack,
- CmdShutdownex
+ CmdShutdownex,
+ CmdTest
};
static const CommandDescription commandDescriptions[] = {
@@ -136,7 +137,8 @@ static const CommandDescription commandDescriptions[] = {
{"help","Prints help.",""},
{"memory","Prints memory contents in Base64 encoding.","[-t token]
"},
{"stack","Prints stack in GDBMI format.","[-t token] [max-frames]"},
-{"shutdownex","Unhooks output callbacks.\nNeeds to be called explicitly only in case of remote debugging.",""}
+{"shutdownex","Unhooks output callbacks.\nNeeds to be called explicitly only in case of remote debugging.",""},
+{"test","Testing command","-T type"}
};
typedef std::vector StringVector;
@@ -725,6 +727,45 @@ extern "C" HRESULT CALLBACK shutdownex(CIDebugClient *, PCSTR)
return S_OK;
}
+extern "C" HRESULT CALLBACK test(CIDebugClient *client, PCSTR argsIn)
+{
+ enum Mode { Invalid, TestType };
+ ExtensionCommandContext exc(client);
+
+ std::string testType;
+ Mode mode = Invalid;
+ int token = 0;
+ StringList tokens = commandTokens(argsIn, &token);
+ // Parse away options
+ while (!tokens.empty() && tokens.front().size() == 2 && tokens.front().at(0) == '-') {
+ const char option = tokens.front().at(1);
+ tokens.pop_front();
+ switch (option) {
+ case 'T':
+ mode = TestType;
+ if (!tokens.empty()) {
+ testType = tokens.front();
+ tokens.pop_front();
+ }
+ break;
+ } // case option
+ } // for options
+
+ // Frame and iname
+ if (mode == Invalid || testType.empty()) {
+ ExtensionContext::instance().report('N', token, 0, "test", singleLineUsage(commandDescriptions[CmdTest]).c_str());
+ } else {
+ const KnownType kt = knownType(testType, 0);
+ std::ostringstream str;
+ str << testType << ' ' << kt << " [";
+ formatKnownTypeFlags(str, kt);
+ str << ']';
+ ExtensionContext::instance().reportLong('R', token, "test", str.str());
+ }
+ return S_OK;
+}
+
+
// Hook for dumping Known Structs. Not currently used.
// Shows up in 'dv' as well as IDebugSymbolGroup::GetValueText.
diff --git a/src/libs/qtcreatorcdbext/symbolgroup.cpp b/src/libs/qtcreatorcdbext/symbolgroup.cpp
index c8a3c988805..056b6668576 100644
--- a/src/libs/qtcreatorcdbext/symbolgroup.cpp
+++ b/src/libs/qtcreatorcdbext/symbolgroup.cpp
@@ -251,6 +251,8 @@ std::string SymbolGroup::dump(const std::string &iname,
// After expansion, run the complex dumpers
if (p.dumpFlags & DumpParameters::DumpComplexDumpers)
node->runComplexDumpers(ctx);
+ if (symbolGroupDebug)
+ DebugPrint() << "SymbolGroup::dump(" << iname << ") ran complex dumpers 0x" << std::hex << node->flags();
}
std::ostringstream str;
@@ -262,7 +264,7 @@ std::string SymbolGroup::dump(const std::string &iname,
str << ']';
QTC_TRACE_OUT
if (symbolGroupDebug)
- DebugPrint() << "SymbolGroupNode::runSimpleDumpers " << name() << '/'
<< absoluteFullIName() << ' ' << m_index << DebugNodeFlags(flags());
if (testFlags(Uninitialized))
return false;
@@ -797,7 +797,8 @@ bool SymbolGroupNode::runSimpleDumpers(const SymbolGroupValueContext &ctx)
addFlags(dumpSimpleType(this , ctx, &m_dumperValue,
&m_dumperType, &m_dumperContainerSize));
if (symbolGroupDebug)
- DebugPrint() << "-> '" << wStringToString(m_dumperValue) << "' Type="
+ DebugPrint() << "= 4 && !type.compare(0, 4, "long"))
+ if (endPos == 4 || type.at(4) == ' ')
+ return isPointer ? KT_POD_PointerType : KT_IntType;
break;
case 'i':
- if (!type.compare(0, 3, "int"))
- return isPointer ? KT_POD_PointerType : KT_IntType;
+ // 'int' 'int64'
+ if (endPos >= 3 && !type.compare(0, 3, "int"))
+ if (endPos == 3 || type.at(3) == ' ' || type.at(3) == '6')
+ return isPointer ? KT_POD_PointerType : KT_IntType;
break;
case 's':
- if (!type.compare(0, 5, "short"))
+ if (endPos == 5 && !type.compare(0, 5, "short"))
return isPointer ? KT_POD_PointerType : KT_IntType;
+ if (endPos >= 6 && !type.compare(0, 6, "signed"))
+ if (endPos == 6 || type.at(6) == ' ')
+ return isPointer ? KT_POD_PointerType : KT_IntType;
break;
case 'u':
- if (!type.compare(0, 8, "unsigned")) {
- if (isPointer)
- return KT_POD_PointerType;
- return type == "unsigned char" ? KT_UnsignedChar : KT_UnsignedIntType;
+ if (endPos >= 8 && !type.compare(0, 8, "unsigned")) {
+ if (endPos == 8 || type.at(8) == ' ') {
+ if (isPointer)
+ return KT_POD_PointerType;
+ return type.compare(0, 13, "unsigned char") ?
+ KT_UnsignedIntType :
+ KT_UnsignedChar;
+ }
}
break;
}