diff --git a/src/plugins/debugger/dap/dapengine.cpp b/src/plugins/debugger/dap/dapengine.cpp index 1cb129d445b..954ade1c83b 100644 --- a/src/plugins/debugger/dap/dapengine.cpp +++ b/src/plugins/debugger/dap/dapengine.cpp @@ -120,7 +120,16 @@ void DapEngine::handleDapStarted() qCDebug(dapEngineLog) << "handleDapStarted"; } -void DapEngine::handleDapConfigurationDone() +void DapEngine::handleDapInitialize() +{ + QTC_ASSERT(state() == EngineRunRequested, qCDebug(dapEngineLog) << state()); + + m_dapClient->sendLaunch(runParameters().inferior.command.executable()); + + qCDebug(dapEngineLog) << "handleDapLaunch"; +} + +void DapEngine::handleDapEventInitialized() { QTC_ASSERT(state() == EngineRunRequested, qCDebug(dapEngineLog) << state()); @@ -129,14 +138,9 @@ void DapEngine::handleDapConfigurationDone() qCDebug(dapEngineLog) << "handleDapConfigurationDone"; } - -void DapEngine::handleDapInitialize() +void DapEngine::handleDapConfigurationDone() { - QTC_ASSERT(state() == EngineRunRequested, qCDebug(dapEngineLog) << state()); - - m_dapClient->sendLaunch(runParameters().inferior.command.executable()); - - qCDebug(dapEngineLog) << "handleDapLaunch"; + notifyEngineRunAndInferiorRunOk(); } void DapEngine::interruptInferior() @@ -480,6 +484,12 @@ void DapEngine::handleResponse(DapResponseType type, const QJsonObject &response { const QString command = response.value("command").toString(); + if (response.contains("success") && !response.value("success").toBool()) { + showMessage(QString("DAP COMMAND FAILED: %1").arg(command)); + qCDebug(dapEngineLog) << "DAP COMMAND FAILED:" << command; + return; + } + switch (type) { case DapResponseType::Initialize: qCDebug(dapEngineLog) << "initialize success"; @@ -488,7 +498,7 @@ void DapEngine::handleResponse(DapResponseType type, const QJsonObject &response case DapResponseType::ConfigurationDone: showMessage("configurationDone", LogDebug); qCDebug(dapEngineLog) << "configurationDone success"; - notifyEngineRunAndInferiorRunOk(); + handleDapConfigurationDone(); break; case DapResponseType::Continue: showMessage("continue", LogDebug); @@ -597,7 +607,7 @@ void DapEngine::handleEvent(DapEventType type, const QJsonObject &event) case DapEventType::Initialized: qCDebug(dapEngineLog) << "initialize success"; claimInitialBreakpoints(); - handleDapConfigurationDone(); + handleDapEventInitialized(); break; case DapEventType::Stopped: handleStoppedEvent(event); diff --git a/src/plugins/debugger/dap/dapengine.h b/src/plugins/debugger/dap/dapengine.h index 6f650c05419..fee31ba345e 100644 --- a/src/plugins/debugger/dap/dapengine.h +++ b/src/plugins/debugger/dap/dapengine.h @@ -85,7 +85,8 @@ protected: void handleDapStarted(); virtual void handleDapInitialize(); - void handleDapConfigurationDone(); + void handleDapEventInitialized(); + virtual void handleDapConfigurationDone(); void dapRemoveBreakpoint(const Breakpoint &bp); void dapInsertBreakpoint(const Breakpoint &bp); diff --git a/src/plugins/debugger/dap/gdbdapengine.cpp b/src/plugins/debugger/dap/gdbdapengine.cpp index e4334c9e39a..7414382bce2 100644 --- a/src/plugins/debugger/dap/gdbdapengine.cpp +++ b/src/plugins/debugger/dap/gdbdapengine.cpp @@ -93,12 +93,43 @@ GdbDapEngine::GdbDapEngine() setDebuggerType("DAP"); } +void GdbDapEngine::handleDapInitialize() +{ + if (!isLocalAttachEngine()) { + DapEngine::handleDapInitialize(); + return; + } + + QTC_ASSERT(state() == EngineRunRequested, qCDebug(dapEngineLog) << state()); + m_dapClient->postRequest("attach", QJsonObject{{"__restart", ""}}); + qCDebug(dapEngineLog) << "handleDapAttach"; +} + + +bool GdbDapEngine::isLocalAttachEngine() const +{ + return runParameters().startMode == AttachToLocalProcess; +} + +void GdbDapEngine::handleDapConfigurationDone() +{ + if (!isLocalAttachEngine()) { + DapEngine::handleDapConfigurationDone(); + return; + } + + notifyEngineRunAndInferiorStopOk(); +} + void GdbDapEngine::setupEngine() { QTC_ASSERT(state() == EngineSetupRequested, qCDebug(dapEngineLog) << state()); const DebuggerRunParameters &rp = runParameters(); - const CommandLine cmd{rp.debugger.command.executable(), {"-i", "dap"}}; + CommandLine cmd{rp.debugger.command.executable(), {"-i", "dap"}}; + + if (isLocalAttachEngine()) + cmd.addArgs({"-p", QString::number(rp.attachPID.pid())}); QVersionNumber oldestVersion(14, 0, 50); QVersionNumber version = QVersionNumber::fromString(rp.version); diff --git a/src/plugins/debugger/dap/gdbdapengine.h b/src/plugins/debugger/dap/gdbdapengine.h index a968ab4a5ac..0633420f494 100644 --- a/src/plugins/debugger/dap/gdbdapengine.h +++ b/src/plugins/debugger/dap/gdbdapengine.h @@ -14,6 +14,11 @@ public: private: void setupEngine() override; + + void handleDapInitialize() override; + void handleDapConfigurationDone() override; + + bool isLocalAttachEngine() const; }; } // Debugger::Internal diff --git a/src/plugins/debugger/dap/pydapengine.cpp b/src/plugins/debugger/dap/pydapengine.cpp index 89e87023245..8eca92cf6a3 100644 --- a/src/plugins/debugger/dap/pydapengine.cpp +++ b/src/plugins/debugger/dap/pydapengine.cpp @@ -88,6 +88,8 @@ public: connect(m_timer, &QTimer::timeout, this, [this]() { m_socket.connectToHost(m_hostName, m_port); m_socket.waitForConnected(); + qCDebug(dapEngineLog) << "proc id" << m_proc.processId(); + if (m_socket.state() == QTcpSocket::ConnectedState) m_timer->stop();