diff options
author | Friedemann Kleint <Friedemann.Kleint@digia.com> | 2012-12-28 18:54:39 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@digia.com> | 2012-12-29 20:05:32 +0100 |
commit | 99f542354a0933b544110d1dfd9bd380c8d30210 (patch) | |
tree | 42bcbd703ce9a3f0057452aea9a34b8262122eb4 /src | |
parent | 239996dbc75e2dbb95cabb201d1b54c70e86c6f3 (diff) | |
download | qt-creator-99f542354a0933b544110d1dfd9bd380c8d30210.tar.gz |
CDB: Enable "Separate Window" format for standard strings.
- Always retrieve memory for std::strings.
- Enable type format.
Change-Id: I7bd00adbbeff0c4cc380b3ec078df408440302b4
Reviewed-by: hjk <qthjk@ovi.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp | 2 | ||||
-rw-r--r-- | src/libs/qtcreatorcdbext/symbolgroupnode.cpp | 12 | ||||
-rw-r--r-- | src/libs/qtcreatorcdbext/symbolgroupvalue.cpp | 39 | ||||
-rw-r--r-- | src/plugins/debugger/cdb/cdbengine.cpp | 1 |
4 files changed, 36 insertions, 18 deletions
diff --git a/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp b/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp index 58d27ca3a6..8b6cfd1098 100644 --- a/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp +++ b/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp @@ -498,6 +498,8 @@ static std::string commmandLocals(ExtensionCommandContext &commandExtCtx,PCSTR a symGroup->markUninitialized(uninitializedInames); SymbolGroupValue::verbose = parameters.verbose; + if (SymbolGroupValue::verbose) + DebugPrint() << parameters.dumpParameters; // Synchronize watches if desired. WatchesSymbolGroup *watchesSymbolGroup = extCtx.watchesSymbolGroup(); diff --git a/src/libs/qtcreatorcdbext/symbolgroupnode.cpp b/src/libs/qtcreatorcdbext/symbolgroupnode.cpp index 4ce1a421ab..d926d19e29 100644 --- a/src/libs/qtcreatorcdbext/symbolgroupnode.cpp +++ b/src/libs/qtcreatorcdbext/symbolgroupnode.cpp @@ -294,6 +294,10 @@ DumpParameters::DumpParameters() : dumpFlags(0) DumpParameters::FormatMap DumpParameters::decodeFormatArgument(const std::string &f, bool isHex) { + extern const char *stdStringTypeC; + extern const char *stdWStringTypeC; + extern const char *stdWStringWCharTypeC; + FormatMap rc; const std::string::size_type size = f.size(); // Split 'hexname=4,' @@ -313,7 +317,13 @@ DumpParameters::FormatMap DumpParameters::decodeFormatArgument(const std::string int format; if (!integerFromString(f.substr(numberPos, nextPos - numberPos), &format)) return rc; - rc.insert(FormatMap::value_type(name, format)); + if (name == "std::basic_string") { // Python dumper naming convention for types + rc.insert(FormatMap::value_type(stdStringTypeC, format)); + rc.insert(FormatMap::value_type(stdWStringTypeC, format)); + rc.insert(FormatMap::value_type(stdWStringWCharTypeC, format)); + } else { + rc.insert(FormatMap::value_type(name, format)); + } pos = nextPos + 1; } return rc; diff --git a/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp b/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp index 95c3f8780f..2eaea005c4 100644 --- a/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp +++ b/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp @@ -993,10 +993,10 @@ static inline void formatMilliSeconds(std::wostream &str, int milliSecs) << '.' << std::setw(3) << milliSecs; } -static const char stdStringTypeC[] = "std::basic_string<char,std::char_traits<char>,std::allocator<char> >"; -static const char stdWStringTypeC[] = "std::basic_string<unsigned short,std::char_traits<unsigned short>,std::allocator<unsigned short> >"; +const char *stdStringTypeC = "std::basic_string<char,std::char_traits<char>,std::allocator<char> >"; +const char *stdWStringTypeC = "std::basic_string<unsigned short,std::char_traits<unsigned short>,std::allocator<unsigned short> >"; // Compiler option: -Zc:wchar_t-: -static const char stdWStringWCharTypeC[] = "std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >"; +const char *stdWStringWCharTypeC = "std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >"; static KnownType knownPODTypeHelper(const std::string &type, std::string::size_type endPos) { @@ -2206,29 +2206,32 @@ static inline bool dumpQWindow(const SymbolGroupValue &v, std::wostream &str, vo } // Dump a std::string. -static bool dumpStd_W_String(const SymbolGroupValue &v, int type, std::wostream &str) +static bool dumpStd_W_String(const SymbolGroupValue &v, int type, std::wostream &str, + MemoryHandle **memoryHandle = 0) { // Find 'bx'. MSVC 2012 has 2 base classes, MSVC 2010 1, // and MSVC2008 none const SymbolGroupValue bx = SymbolGroupValue::findMember(v, "_Bx"); const int reserved = bx.parent()["_Myres"].intValue(); - if (!bx || reserved < 0) + const int size = bx.parent()["_Mysize"].intValue(); + if (!bx || reserved < 0 || size < 0) return false; // 'Buf' array for small strings, else pointer 'Ptr'. const int bufSize = type == KT_StdString ? 16 : 8; // see basic_string. - const SymbolGroupValue string = bufSize <= reserved ? bx["_Ptr"] : bx["_Buf"]; - if (!string) + const unsigned long memSize = type == KT_StdString ? size : 2 * size; + const ULONG64 address = reserved >= bufSize ? bx["_Ptr"].pointerValue() : bx["_Buf"].address(); + if (!address) + return false; + unsigned char *memory = SymbolGroupValue::readMemory(v.context().dataspaces, address, memSize); + if (!memory) return false; - // Potentially re-code char arrays (preferably relying on - // CDB to initially format the string array). - const DumpParameterRecodeResult recode = checkCharArrayRecode(string); - if (recode.buffer) { - str << (type == KT_StdString ? - quotedWStringFromCharData(recode.buffer, recode.size) : - quotedWStringFromWCharData(recode.buffer, recode.size)); - delete [] recode.buffer; + str << (type == KT_StdString ? + quotedWStringFromCharData(memory, memSize) : + quotedWStringFromWCharData(memory, memSize)); + if (memoryHandle) { + *memoryHandle = new MemoryHandle(memory, memSize); } else { - str << string.value(); + delete [] memory; } return true; } @@ -2590,7 +2593,7 @@ unsigned dumpSimpleType(SymbolGroupNode *n, const SymbolGroupValueContext &ctx, break; case KT_StdString: case KT_StdWString: - rc = dumpStd_W_String(v, kt, str) ? SymbolGroupNode::SimpleDumperOk : SymbolGroupNode::SimpleDumperFailed; + rc = dumpStd_W_String(v, kt, str, memoryHandleIn) ? SymbolGroupNode::SimpleDumperOk : SymbolGroupNode::SimpleDumperFailed; break; default: break; @@ -2640,11 +2643,13 @@ bool dumpEditValue(const SymbolGroupNode *n, const SymbolGroupValueContext &, switch (n->dumperType()) { case KT_QString: + case KT_StdWString: if (desiredFormat == StringSeparateWindow) if (const MemoryHandle *mh = n->memory()) formatEditValue(DisplayUtf16String, mh, str); break; case KT_QByteArray: + case KT_StdString: if (desiredFormat == StringSeparateWindow) if (const MemoryHandle *mh = n->memory()) formatEditValue(DisplayLatin1String, mh, str); diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index 1277390162..383107e506 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -632,6 +632,7 @@ void CdbEngine::setupEngine() wh->addTypeFormats("QString *", stringFormats); wh->addTypeFormats("QByteArray", stringFormats); wh->addTypeFormats("QByteArray *", stringFormats); + wh->addTypeFormats("std__basic_string", stringFormats); // Python dumper naming convention for std::[w]string } bool CdbEngine::launchCDB(const DebuggerStartParameters &sp, QString *errorMessage) |