From 72421c18c1f597755f9bd7a4d62751858a935c8b Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 31 Jan 2013 14:24:39 +0100 Subject: [PATCH] CDB: Pass settings maxStringLength and maxStackDepth to extension. Change-Id: I602aa3758817026c8b4cbda1cc9fa9eff95fc691 Reviewed-by: hjk --- src/libs/qtcreatorcdbext/extensioncontext.cpp | 10 ++++++ src/libs/qtcreatorcdbext/extensioncontext.h | 14 ++++++++ src/libs/qtcreatorcdbext/qtcreatorcdbext.def | 1 + .../qtcreatorcdbext/qtcreatorcdbextension.cpp | 34 +++++++++++++++++-- src/plugins/debugger/cdb/cdbengine.cpp | 5 +++ 5 files changed, 62 insertions(+), 2 deletions(-) diff --git a/src/libs/qtcreatorcdbext/extensioncontext.cpp b/src/libs/qtcreatorcdbext/extensioncontext.cpp index 4e5bb333d86..f8362bc0819 100644 --- a/src/libs/qtcreatorcdbext/extensioncontext.cpp +++ b/src/libs/qtcreatorcdbext/extensioncontext.cpp @@ -43,6 +43,16 @@ WINDBG_EXTENSION_APIS ExtensionApis = {sizeof(WINDBG_EXTENSION_APIS), 0, 0, 0, const char *ExtensionContext::stopReasonKeyC = "reason"; const char *ExtensionContext::breakPointStopReasonC = "breakpoint"; +/*! \class Parameters + + Externally configureable parameters. + \ingroup qtcreatorcdbext +*/ + +Parameters::Parameters() : maxStringLength(10000), maxStackDepth(1000) +{ +} + /*! \class ExtensionContext Global singleton with context. diff --git a/src/libs/qtcreatorcdbext/extensioncontext.h b/src/libs/qtcreatorcdbext/extensioncontext.h index 6cd8027d7f4..83e7e4ef0c6 100644 --- a/src/libs/qtcreatorcdbext/extensioncontext.h +++ b/src/libs/qtcreatorcdbext/extensioncontext.h @@ -40,6 +40,16 @@ class LocalsSymbolGroup; class WatchesSymbolGroup; class OutputCallback; +// Global parameters +class Parameters +{ +public: + Parameters(); + + unsigned maxStringLength; + unsigned maxStackDepth; +}; + // Global singleton with context. // Caches a symbolgroup per frame and thread as long as the session is accessible. class ExtensionContext { @@ -105,6 +115,9 @@ public: CIDebugClient *hookedClient() const { return m_hookedClient; } + const Parameters ¶meters() const { return m_parameters; } + Parameters ¶meters() { return m_parameters; } + private: bool isInitialized() const; @@ -120,6 +133,7 @@ private: StopReasonMap m_stopReason; bool m_stateNotification; + Parameters m_parameters; }; // Context for extension commands to be instantiated on stack in a command handler. diff --git a/src/libs/qtcreatorcdbext/qtcreatorcdbext.def b/src/libs/qtcreatorcdbext/qtcreatorcdbext.def index 798be24b9d7..db92e4750f4 100644 --- a/src/libs/qtcreatorcdbext/qtcreatorcdbext.def +++ b/src/libs/qtcreatorcdbext/qtcreatorcdbext.def @@ -14,6 +14,7 @@ threads registers modules idle +setparameter help memory expression diff --git a/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp b/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp index 87a98980dde..42293be33bb 100644 --- a/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp +++ b/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp @@ -110,7 +110,8 @@ enum Command { CmdAddWatch, CmdWidgetAt, CmdBreakPoints, - CmdTest + CmdTest, + CmdSetParameter }; static const CommandDescription commandDescriptions[] = { @@ -172,7 +173,8 @@ static const CommandDescription commandDescriptions[] = { {"addwatch","Add watch expression"," "}, {"widgetat","Return address of widget at position"," "}, {"breakpoints","List breakpoints with modules","[-h] [-v]"}, -{"test","Testing command","-T type | -w watch-expression"} +{"test","Testing command","-T type | -w watch-expression"}, +{"setparameter","Set parameter","maxStringLength=value maxStackDepth=value"} }; typedef std::vector StringVector; @@ -893,6 +895,34 @@ extern "C" HRESULT CALLBACK idle(CIDebugClient *client, PCSTR) return S_OK; } +// Extension command 'setparameter': +// Parse a list of parameters: 'key=value' + +extern "C" HRESULT CALLBACK setparameter(CIDebugClient *, PCSTR args) +{ + int token; + StringVector tokens = commandTokens(args, &token); + const size_t count = tokens.size(); + size_t success = 0; + for (size_t i = 0; i < count; ++i) { + const std::string &token = tokens.at(i); + const std::string::size_type equalsPos = token.find('='); + if (equalsPos != std::string::npos) { + const std::string value = token.substr(equalsPos + 1, token.size() - 1 - equalsPos); + if (!token.compare(0, equalsPos, "maxStringLength")) { + if (integerFromString(value, &ExtensionContext::instance().parameters().maxStringLength)) + ++success; + } else if (!token.compare(0, equalsPos, "maxStackDepth")) { + if (integerFromString(value, &ExtensionContext::instance().parameters().maxStackDepth)) + ++success; + } + } + } + if (success != count) + DebugPrint() << "Errors parsing setparameters command '" << args << '\''; + return S_OK; +} + // Extension command 'help': // Display version diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index c6f677c5edb..fd0769d1097 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -783,6 +783,11 @@ void CdbEngine::setupInferior() } postCommand("sxn 0x4000001f", 0); // Do not break on WowX86 exceptions. postCommand(".asm source_line", 0); // Source line in assembly + postCommand(m_extensionCommandPrefixBA + "setparameter maxStringLength=" + + debuggerCore()->action(MaximalStringLength)->value().toByteArray() + + " maxStackDepth=" + + debuggerCore()->action(MaximalStackDepth)->value().toByteArray() + , 0); postExtensionCommand("pid", QByteArray(), 0, &CdbEngine::handlePid); }