From 1aef962e5ad98c7947d4316367e73d77917a4dac Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 14 Jan 2011 17:08:59 +0100 Subject: [PATCH] debugger: first shot at combined cpp/qml stepping --- src/plugins/debugger/debuggerengine.h | 3 +++ src/plugins/debugger/gdb/gdbengine.cpp | 18 ++++++++++++++++++ src/plugins/debugger/gdb/gdbengine.h | 3 +++ src/plugins/debugger/qml/qmlcppengine.cpp | 26 ++++++++++++++++---------- src/plugins/debugger/qml/qmlcppengine.h | 2 ++ 5 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h index 6273a319ea..6b758345e4 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 1b29301395..fe7a3adee6 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 ea356246f5..d9ab60bf71 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 4acaa6ca42..4f106a981d 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 "qmlcppengine.h" -#include -#include +#include "debuggercore.h" +#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; @@ -220,6 +214,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 47723628de..f538da03be 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; }; -- 2.11.0