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.