diff --git a/src/plugins/debugger/gdb/abstractgdbadapter.cpp b/src/plugins/debugger/gdb/abstractgdbadapter.cpp index cd99fec311e288c0f44e43d97fc85f552562e135..dca2e9ad5bece78bf8d02aab450a1dde4d343cd7 100644 --- a/src/plugins/debugger/gdb/abstractgdbadapter.cpp +++ b/src/plugins/debugger/gdb/abstractgdbadapter.cpp @@ -51,6 +51,10 @@ void AbstractGdbAdapter::shutdown() { } +void AbstractGdbAdapter::startInferiorPhase2() +{ +} + const char *AbstractGdbAdapter::inferiorShutdownCommand() const { return "kill"; diff --git a/src/plugins/debugger/gdb/abstractgdbadapter.h b/src/plugins/debugger/gdb/abstractgdbadapter.h index 9dc018e0380385b4dc17871683edc1d434bd2783..7fed63fc8c3af25d1f1ab67fd24a90d3a9f34d63 100644 --- a/src/plugins/debugger/gdb/abstractgdbadapter.h +++ b/src/plugins/debugger/gdb/abstractgdbadapter.h @@ -56,6 +56,7 @@ public: virtual void startAdapter() = 0; virtual void startInferior() = 0; + virtual void startInferiorPhase2(); virtual void interruptInferior() = 0; virtual void shutdown(); virtual const char *inferiorShutdownCommand() const; @@ -80,6 +81,10 @@ signals: // Make sure to clean up everything before emitting this signal. void adapterCrashed(const QString &msg); + // This triggers the initial breakpoint synchronization and causes + // startInferiorPhase2() being called once done. + void inferiorPrepared(); + // The adapter is still running just fine, but it failed to acquire a debuggee. void inferiorStartFailed(const QString &msg); diff --git a/src/plugins/debugger/gdb/attachgdbadapter.cpp b/src/plugins/debugger/gdb/attachgdbadapter.cpp index f89421e5929ed2c010b42ada40b2d71553516398..ae83ed6a49076b347a61fe195cb33e305f693a6a 100644 --- a/src/plugins/debugger/gdb/attachgdbadapter.cpp +++ b/src/plugins/debugger/gdb/attachgdbadapter.cpp @@ -82,6 +82,7 @@ void AttachGdbAdapter::handleAttach(const GdbResponse &response) QTC_ASSERT(state() == InferiorStopped, qDebug() << state()); debugMessage(_("INFERIOR ATTACHED")); showStatusMessage(msgAttachedToStoppedInferior()); + emit inferiorPrepared(); m_engine->updateAll(); } else { QString msg = __(response.data.findChild("msg").data()); diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 93916267abbe98aca8947854a3e01f3cf99a9d98..87024f56ea7be4dd896828685e05680645096f46 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -234,6 +234,9 @@ void GdbEngine::connectAdapter() connect(m_gdbAdapter, SIGNAL(adapterStartFailed(QString,QString)), this, SLOT(handleAdapterStartFailed(QString,QString))); + connect(m_gdbAdapter, SIGNAL(inferiorPrepared()), + this, SLOT(handleInferiorPrepared())); + connect(m_gdbAdapter, SIGNAL(inferiorStartFailed(QString)), this, SLOT(handleInferiorStartFailed(QString))); @@ -692,7 +695,8 @@ void GdbEngine::postCommandHelper(const GdbCommand &cmd) } if (cmd.flags & NeedsStop) { - if (state() == InferiorStopped || state() == AdapterStarted) { + if (state() == InferiorStopped + || state() == InferiorStarting || state() == AdapterStarted) { // Can be safely sent now. flushCommand(cmd); } else { @@ -4318,24 +4322,29 @@ void GdbEngine::handleAdapterStarted() setState(AdapterStarted); debugMessage(_("ADAPTER SUCCESSFULLY STARTED")); + showStatusMessage(tr("Starting inferior...")); + setState(InferiorStarting); + m_gdbAdapter->startInferior(); +} + +void GdbEngine::handleInferiorPrepared() +{ // Initial attempt to set breakpoints showStatusMessage(tr("Setting breakpoints...")); attemptBreakpointSynchronization(); if (m_cookieForToken.isEmpty()) { - startInferior(); + startInferiorPhase2(); } else { QTC_ASSERT(m_commandsDoneCallback == 0, /**/); - m_commandsDoneCallback = &GdbEngine::startInferior; + m_commandsDoneCallback = &GdbEngine::startInferiorPhase2; } } -void GdbEngine::startInferior() +void GdbEngine::startInferiorPhase2() { - QTC_ASSERT(state() == AdapterStarted, qDebug() << state()); - showStatusMessage(tr("Starting inferior...")); - setState(InferiorStarting); - m_gdbAdapter->startInferior(); + debugMessage(_("BREAKPOINTS SET, CONTINUING INFERIOR STARTUP")); + m_gdbAdapter->startInferiorPhase2(); } void GdbEngine::handleInferiorStartFailed(const QString &msg) diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index 91c230dacc9db2b5baa4a7a5c2198f1f10f61fd9..94e91e4669a8451d61f63c961beb4fb02cf98477 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -126,7 +126,7 @@ private: ////////// Gdb Process Management ////////// AbstractGdbAdapter *createAdapter(const DebuggerStartParametersPtr &dp); void connectAdapter(); bool startGdb(const QStringList &args = QStringList(), const QString &gdb = QString()); - void startInferior(); + void startInferiorPhase2(); void handleInferiorShutdown(const GdbResponse &response); void handleGdbExit(const GdbResponse &response); @@ -146,6 +146,8 @@ private slots: void handleAdapterStarted(); void handleAdapterStartFailed(const QString &msg, const QString &settingsIdHint = QString()); + void handleInferiorPrepared(); + void handleInferiorStartFailed(const QString &msg); void handleAdapterCrashed(const QString &msg); diff --git a/src/plugins/debugger/gdb/plaingdbadapter.cpp b/src/plugins/debugger/gdb/plaingdbadapter.cpp index 2a16c27628f5a76ae0f2285182645ebb8a57ba3c..8df6d740165dd922cbe63c8c8c48a904a6dc6ff8 100644 --- a/src/plugins/debugger/gdb/plaingdbadapter.cpp +++ b/src/plugins/debugger/gdb/plaingdbadapter.cpp @@ -106,9 +106,7 @@ void PlainGdbAdapter::handleFileExecAndSymbols(const GdbResponse &response) { QTC_ASSERT(state() == InferiorStarting, qDebug() << state()); if (response.resultClass == GdbResultDone) { - //m_breakHandler->clearBreakMarkers(); - setState(InferiorRunningRequested); - m_engine->postCommand(_("-exec-run"), GdbEngine::RunRequest, CB(handleExecRun)); + emit inferiorPrepared(); } else { QString msg = tr("Starting executable failed:\n") + __(response.data.findChild("msg").data()); @@ -116,6 +114,12 @@ void PlainGdbAdapter::handleFileExecAndSymbols(const GdbResponse &response) } } +void PlainGdbAdapter::startInferiorPhase2() +{ + setState(InferiorRunningRequested); + m_engine->postCommand(_("-exec-run"), GdbEngine::RunRequest, CB(handleExecRun)); +} + void PlainGdbAdapter::handleExecRun(const GdbResponse &response) { if (response.resultClass == GdbResultRunning) { diff --git a/src/plugins/debugger/gdb/plaingdbadapter.h b/src/plugins/debugger/gdb/plaingdbadapter.h index fb445d3b329a3a045261c386b741cb1e53cab2dd..0998ad2b82fe53175868aabfe48d94f3713551e9 100644 --- a/src/plugins/debugger/gdb/plaingdbadapter.h +++ b/src/plugins/debugger/gdb/plaingdbadapter.h @@ -57,6 +57,7 @@ public: void startAdapter(); void startInferior(); + void startInferiorPhase2(); void interruptInferior(); void shutdown(); const char *inferiorShutdownCommand() const { return "kill"; } diff --git a/src/plugins/debugger/gdb/remotegdbadapter.cpp b/src/plugins/debugger/gdb/remotegdbadapter.cpp index 504e0a5620881917ebc3c7daa56f575b16811445..ab06baab43343fa96960c3790500c959df480937 100644 --- a/src/plugins/debugger/gdb/remotegdbadapter.cpp +++ b/src/plugins/debugger/gdb/remotegdbadapter.cpp @@ -199,7 +199,7 @@ void RemoteGdbAdapter::handleTargetRemote(const GdbResponse &record) // gdb server will stop the remote application itself. debugMessage(_("INFERIOR STARTED")); showStatusMessage(msgAttachedToStoppedInferior()); - m_engine->continueInferior(); + emit inferiorPrepared(); } else { // 16^error,msg="hd:5555: Connection timed out." QString msg = msgConnectRemoteServerFailed(__(record.data.findChild("msg").data())); @@ -207,6 +207,11 @@ void RemoteGdbAdapter::handleTargetRemote(const GdbResponse &record) } } +void RemoteGdbAdapter::startInferiorPhase2() +{ + m_engine->continueInferior(); +} + void RemoteGdbAdapter::interruptInferior() { m_engine->postCommand(_("-exec-interrupt")); diff --git a/src/plugins/debugger/gdb/remotegdbadapter.h b/src/plugins/debugger/gdb/remotegdbadapter.h index a7f4bc645a4511ccdebd80bc964ab52af87f65bc..edc65ece950d085b69cdf75458c59b8f84d93e9e 100644 --- a/src/plugins/debugger/gdb/remotegdbadapter.h +++ b/src/plugins/debugger/gdb/remotegdbadapter.h @@ -56,6 +56,7 @@ public: void startAdapter(); void startInferior(); + void startInferiorPhase2(); void interruptInferior(); void shutdown(); diff --git a/src/plugins/debugger/gdb/trkgdbadapter.cpp b/src/plugins/debugger/gdb/trkgdbadapter.cpp index e1405d86f4267485affc84eb887a5c17c2b62d67..d41ff2327338bcf5ebcec17d648f8b85f93b5f36 100644 --- a/src/plugins/debugger/gdb/trkgdbadapter.cpp +++ b/src/plugins/debugger/gdb/trkgdbadapter.cpp @@ -1639,8 +1639,7 @@ void TrkGdbAdapter::handleTargetRemote(const GdbResponse &record) { QTC_ASSERT(state() == InferiorStarting, qDebug() << state()); if (record.resultClass == GdbResultDone) { - setState(InferiorRunningRequested); - m_engine->postCommand(_("-exec-continue"), GdbEngine::RunRequest, CB(handleFirstContinue)); + emit inferiorPrepared(); } else { QString msg = tr("Connecting to trk server adapter failed:\n") + _(record.data.findChild("msg").data()); @@ -1648,6 +1647,12 @@ void TrkGdbAdapter::handleTargetRemote(const GdbResponse &record) } } +void TrkGdbAdapter::startInferiorPhase2() +{ + setState(InferiorRunningRequested); + m_engine->postCommand(_("-exec-continue"), GdbEngine::RunRequest, CB(handleFirstContinue)); +} + void TrkGdbAdapter::handleFirstContinue(const GdbResponse &record) { QTC_ASSERT(state() == InferiorRunning, qDebug() << state()); diff --git a/src/plugins/debugger/gdb/trkgdbadapter.h b/src/plugins/debugger/gdb/trkgdbadapter.h index 72a996ef01ffde07ef84c7d9c7355dae24a0213c..42d8911401f3a9c4d2874c44704d4b8ed432056d 100644 --- a/src/plugins/debugger/gdb/trkgdbadapter.h +++ b/src/plugins/debugger/gdb/trkgdbadapter.h @@ -170,6 +170,7 @@ public: private: void startAdapter(); void startInferior(); + void startInferiorPhase2(); void interruptInferior(); void shutdown();