diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h index 6273a319ea8..6b758345e46 100644 --- a/src/plugins/debugger/debuggerengine.h +++ b/src/plugins/debugger/debuggerengine.h @@ -244,6 +244,9 @@ public: bool isMasterEngine() const; DebuggerEngine *masterEngine() const; + virtual bool prepareForQmlBreak() { return false; } + virtual void handlePrepareForQmlBreak() {} + signals: void stateChanged(const DebuggerState &state); void updateViewsRequested(); diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 1b29301395a..fe7a3adee69 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -4502,6 +4502,24 @@ void GdbEngine::handleRemoteSetupFailed(const QString &message) m_gdbAdapter->handleRemoteSetupFailed(message); } +bool GdbEngine::prepareForQmlBreak() +{ + QTC_ASSERT(isSlaveEngine(), return false); + postCommand("-break-insert -t qscriptfunction.cpp:82", + NeedsStop, CB(handleQmlBreakpoint)); + return true; +} + +void GdbEngine::handleQmlBreakpoint(const GdbResponse &response) +{ + if (response.resultClass == GdbResultDone) { + qDebug() << "RESPONSE: " << response.toString(); + } + QTC_ASSERT(masterEngine(), return); + masterEngine()->handlePrepareForQmlBreak(); +} + + // // Factory // diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index ea356246f54..d9ab60bf71e 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -517,6 +517,9 @@ private: ////////// View & Data Stuff ////////// void setLocals(const QList &locals); void handleStackListArgumentsClassic(const GdbResponse &response); + bool prepareForQmlBreak(); + void handleQmlBreakpoint(const GdbResponse &response); + QSet m_processedNames; // diff --git a/src/plugins/debugger/qml/qmlcppengine.cpp b/src/plugins/debugger/qml/qmlcppengine.cpp index 4acaa6ca425..4f106a981dc 100644 --- a/src/plugins/debugger/qml/qmlcppengine.cpp +++ b/src/plugins/debugger/qml/qmlcppengine.cpp @@ -1,17 +1,11 @@ + #include "qmlcppengine.h" -#include "debuggerstartparameters.h" -#include "qmlengine.h" -#include "debuggermainwindow.h" + #include "debuggercore.h" - -#include - -#include -#include +#include "debuggerstartparameters.h" #include -#include namespace Debugger { namespace Internal { @@ -63,7 +57,7 @@ QmlCppEngine::QmlCppEngine(const DebuggerStartParameters &sp) d->m_cppEngine = createGdbEngine(sp, this); } else { QString errorMessage; - d->m_cppEngine = Debugger::Internal::createCdbEngine(sp, this, &errorMessage); + d->m_cppEngine = createCdbEngine(sp, this, &errorMessage); if (!d->m_cppEngine) { qWarning("%s", qPrintable(errorMessage)); return; @@ -219,6 +213,18 @@ void QmlCppEngine::detachDebugger() } void QmlCppEngine::executeStep() +{ + if (d->m_activeEngine == d->m_qmlEngine) { + QTC_ASSERT(d->m_cppEngine->state() == InferiorRunOk, /**/); + if (d->m_cppEngine->prepareForQmlBreak()) + return; // Wait for call back. + } + + notifyInferiorRunRequested(); + d->m_activeEngine->executeStep(); +} + +void QmlCppEngine::handlePrepareForQmlBreak() { notifyInferiorRunRequested(); d->m_activeEngine->executeStep(); diff --git a/src/plugins/debugger/qml/qmlcppengine.h b/src/plugins/debugger/qml/qmlcppengine.h index 47723628dec..f538da03bee 100644 --- a/src/plugins/debugger/qml/qmlcppengine.h +++ b/src/plugins/debugger/qml/qmlcppengine.h @@ -94,6 +94,8 @@ private: void setState(DebuggerState newState, bool forced = false); void slaveEngineStateChanged(DebuggerEngine *slaveEngine, DebuggerState state); + virtual void handlePrepareForQmlBreak(); + private: QScopedPointer d; };