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; }