diff --git a/src/plugins/debugger/dap/lldbdapengine.cpp b/src/plugins/debugger/dap/lldbdapengine.cpp index 58622cf8a4f..a42573c2a6a 100644 --- a/src/plugins/debugger/dap/lldbdapengine.cpp +++ b/src/plugins/debugger/dap/lldbdapengine.cpp @@ -7,7 +7,9 @@ #include +#include #include +#include #include #include @@ -18,6 +20,7 @@ #include #include +#include #include #include @@ -112,22 +115,68 @@ LldbDapEngine::LldbDapEngine() setDebuggerType("DAP"); } +QJsonArray LldbDapEngine::sourceMap() const +{ + QJsonArray sourcePathMapping; + const SourcePathMap sourcePathMap + = mergePlatformQtPath(runParameters(), settings().sourcePathMap()); + for (auto it = sourcePathMap.constBegin(), cend = sourcePathMap.constEnd(); it != cend; ++it) { + sourcePathMapping.append(QJsonArray{ + {it.key(), expand(it.value())}, + }); + } + return sourcePathMapping; +} + +QJsonArray LldbDapEngine::preRunCommands() const +{ + const QStringList lines = settings().gdbStartupCommands().split('\n') + + runParameters().additionalStartupCommands.split('\n'); + QJsonArray result; + for (const QString &line : lines) { + const QString trimmed = line.trimmed(); + if (!trimmed.isEmpty() && !trimmed.startsWith('#')) + result.append(trimmed); + } + return result; +} + void LldbDapEngine::handleDapInitialize() { + // Documentation at: + // * https://github.com/llvm/llvm-project/tree/main/lldb/tools/lldb-dap#lldb-dap + // * https://github.com/llvm/llvm-project/blob/main/lldb/tools/lldb-dap/package.json + + const DebuggerRunParameters &rp = runParameters(); + if (!isLocalAttachEngine()) { - DapEngine::handleDapInitialize(); + m_dapClient->postRequest( + "launch", + QJsonObject{ + {"noDebug", false}, + {"program", rp.inferior.command.executable().path()}, + {"args", rp.inferior.command.arguments()}, + {"cwd", rp.inferior.workingDirectory.path()}, + {"sourceMap", sourceMap()}, + {"preRunCommands", preRunCommands()}, + {"__restart", ""}, + }); + + qCDebug(logCategory()) << "handleDapLaunch"; return; } QTC_ASSERT(state() == EngineRunRequested, qCDebug(logCategory()) << state()); - const DebuggerRunParameters &rp = runParameters(); m_dapClient->postRequest( "attach", QJsonObject{ {"program", rp.inferior.command.executable().path()}, {"pid", QString::number(rp.attachPID.pid())}, - {"__restart", ""}}); + {"sourceMap", sourceMap()}, + {"preRunCommands", preRunCommands()}, + {"__restart", ""}, + }); qCDebug(logCategory()) << "handleDapAttach"; } diff --git a/src/plugins/debugger/dap/lldbdapengine.h b/src/plugins/debugger/dap/lldbdapengine.h index 276714dccd5..0ebeb2d2ee1 100644 --- a/src/plugins/debugger/dap/lldbdapengine.h +++ b/src/plugins/debugger/dap/lldbdapengine.h @@ -21,6 +21,9 @@ private: bool isLocalAttachEngine() const; bool acceptsBreakpoint(const BreakpointParameters &bp) const override; const QLoggingCategory &logCategory() override; + + QJsonArray sourceMap() const; + QJsonArray preRunCommands() const; }; } // Debugger::Internal