diff --git a/src/plugins/debugger/debuggerconstants.h b/src/plugins/debugger/debuggerconstants.h index a068d36c4d350cb8823397e48d3ce67c4e850cef..06bada5c83508645e950b7ce05a72f3e37eb03d5 100644 --- a/src/plugins/debugger/debuggerconstants.h +++ b/src/plugins/debugger/debuggerconstants.h @@ -170,7 +170,8 @@ enum DebuggerCapabilities OperateByInstructionCapability = 0x400000, RunToLineCapability = 0x800000, MemoryAddressCapability = 0x1000000, - ShowModuleSectionsCapability = 0x200000 + ShowModuleSectionsCapability = 0x200000, + WatchComplexExpressionsCapability = 0x400000 // Used to filter out challenges for cdb. }; enum LogChannel diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index c3b7021bf95c3d3eec4f229a6e1db8faf26ed3a0..f204b44862b22403689851d0cc00c36ffdb96f32 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1166,7 +1166,10 @@ public slots: int line, column; exp = cppExpressionAt(textEditor, tc.position(), &line, &column); } - exp = fixCppExpression(exp); + if (currentEngine()->hasCapability(WatchComplexExpressionsCapability)) + exp = removeObviousSideEffects(exp); + else + exp = fixCppExpression(exp); if (exp.isEmpty()) return; currentEngine()->watchHandler()->watchVariable(exp); diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 156e2fa5cd440ad1fe741a19117e9abfd4d05f01..59741ba3051f868ed2123807272f03e9b28648a3 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -2132,6 +2132,7 @@ bool GdbEngine::hasCapability(unsigned cap) const | CatchCapability | OperateByInstructionCapability | RunToLineCapability + | WatchComplexExpressionsCapability | MemoryAddressCapability)) return true; diff --git a/src/plugins/debugger/watchutils.cpp b/src/plugins/debugger/watchutils.cpp index c46dd182a1d7e19bb68d4957c760ba3a42640a9b..41aa9aa20f1f94fb069fb724c1f2eae91c925e3e 100644 --- a/src/plugins/debugger/watchutils.cpp +++ b/src/plugins/debugger/watchutils.cpp @@ -820,7 +820,7 @@ QString cppExpressionAt(TextEditor::ITextEditor *editor, int pos, // free debugger expression. QString fixCppExpression(const QString &expIn) { - QString exp = expIn; + QString exp = expIn.trimmed();; // Extract the first identifier, everything else is considered // too dangerous. int pos1 = 0, pos2 = exp.size(); @@ -838,7 +838,12 @@ QString fixCppExpression(const QString &expIn) } } exp = exp.mid(pos1, pos2 - pos1); + return removeObviousSideEffects(exp); +} +QString removeObviousSideEffects(const QString &expIn) +{ + QString exp = expIn.trimmed(); if (exp.isEmpty() || exp.startsWith(QLatin1Char('#')) || !hasLetterOrNumber(exp) || isKeyWord(exp)) return QString(); diff --git a/src/plugins/debugger/watchutils.h b/src/plugins/debugger/watchutils.h index 5e0f2a4d8f3b7b5621361de10ba0802263b5ea6b..87f72d17387e6a8713ad6ceb49aa58168ebe6744 100644 --- a/src/plugins/debugger/watchutils.h +++ b/src/plugins/debugger/watchutils.h @@ -120,6 +120,7 @@ QString quoteUnprintableLatin1(const QByteArray &ba); bool isCppEditor(Core::IEditor *editor); QString cppExpressionAt(TextEditor::ITextEditor *editor, int pos, int *line, int *column, QString *function = 0); +QString removeObviousSideEffects(const QString &exp); QString fixCppExpression(const QString &exp); QString cppFunctionAt(const QString &fileName, int line); // Decode string data as returned by the dumper helpers.