summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@digia.com>2012-12-28 18:54:39 +0100
committerFriedemann Kleint <Friedemann.Kleint@digia.com>2012-12-29 20:05:32 +0100
commit99f542354a0933b544110d1dfd9bd380c8d30210 (patch)
tree42bcbd703ce9a3f0057452aea9a34b8262122eb4 /src
parent239996dbc75e2dbb95cabb201d1b54c70e86c6f3 (diff)
downloadqt-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.cpp2
-rw-r--r--src/libs/qtcreatorcdbext/symbolgroupnode.cpp12
-rw-r--r--src/libs/qtcreatorcdbext/symbolgroupvalue.cpp39
-rw-r--r--src/plugins/debugger/cdb/cdbengine.cpp1
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)