From 561dbbf5de3d45a02318e0cc6a0eaf0a274f7091 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Thu, 20 Jun 2024 12:38:40 +0200 Subject: [PATCH] LLDB-DAP: Add "env" to "launch" command On Windows where there are no RPATHs we need to pass the environment to the "launch" event, otherwise applications can't be started. Also only add "sourceMap" and "preRunCommands" if the arrays are not empty. Change-Id: If631d36db8e28d2c30962b4e9c6a3aa3162000a1 Reviewed-by: Artem Sokolovskii --- src/plugins/debugger/dap/lldbdapengine.cpp | 56 ++++++++++++++-------- src/plugins/debugger/dap/lldbdapengine.h | 1 + 2 files changed, 37 insertions(+), 20 deletions(-) diff --git a/src/plugins/debugger/dap/lldbdapengine.cpp b/src/plugins/debugger/dap/lldbdapengine.cpp index 4dc38ca857e..8dfd75a75b2 100644 --- a/src/plugins/debugger/dap/lldbdapengine.cpp +++ b/src/plugins/debugger/dap/lldbdapengine.cpp @@ -115,6 +115,14 @@ LldbDapEngine::LldbDapEngine() setDebuggerType("DAP"); } +QJsonArray LldbDapEngine::environment() const +{ + QJsonArray envArray; + for (const QString &value : runParameters().inferior.environment.toDictionary().toStringList()) + envArray.append(value); + return envArray; +} + QJsonArray LldbDapEngine::sourceMap() const { QJsonArray sourcePathMapping; @@ -148,19 +156,25 @@ void LldbDapEngine::handleDapInitialize() // * https://github.com/llvm/llvm-project/blob/main/lldb/tools/lldb-dap/package.json const DebuggerRunParameters &rp = runParameters(); + const QJsonArray map = sourceMap(); + const QJsonArray commands = preRunCommands(); if (!isLocalAttachEngine()) { - 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", ""}, - }); + const QJsonArray env = environment(); + QJsonObject launchJson{ + {"noDebug", false}, + {"program", rp.inferior.command.executable().path()}, + {"args", rp.inferior.command.arguments()}, + {"cwd", rp.inferior.workingDirectory.path()}, + {"env", env}, + {"__restart", ""}, + }; + if (!map.isEmpty()) + launchJson.insert("sourceMap", map); + if (!commands.isEmpty()) + launchJson.insert("preRunCommands", commands); + + m_dapClient->postRequest("launch", launchJson); qCDebug(logCategory()) << "handleDapLaunch"; return; @@ -168,15 +182,17 @@ void LldbDapEngine::handleDapInitialize() QTC_ASSERT(state() == EngineRunRequested, qCDebug(logCategory()) << state()); - m_dapClient->postRequest( - "attach", - QJsonObject{ - {"program", rp.inferior.command.executable().path()}, - {"pid", QString::number(rp.attachPID.pid())}, - {"sourceMap", sourceMap()}, - {"preRunCommands", preRunCommands()}, - {"__restart", ""}, - }); + QJsonObject attachJson{ + {"program", rp.inferior.command.executable().path()}, + {"pid", QString::number(rp.attachPID.pid())}, + {"__restart", ""}, + }; + if (!map.isEmpty()) + attachJson.insert("sourceMap", map); + if (!commands.isEmpty()) + attachJson.insert("preRunCommands", commands); + + m_dapClient->postRequest("attach", attachJson); qCDebug(logCategory()) << "handleDapAttach"; } diff --git a/src/plugins/debugger/dap/lldbdapengine.h b/src/plugins/debugger/dap/lldbdapengine.h index 0ebeb2d2ee1..f4f59903820 100644 --- a/src/plugins/debugger/dap/lldbdapengine.h +++ b/src/plugins/debugger/dap/lldbdapengine.h @@ -22,6 +22,7 @@ private: bool acceptsBreakpoint(const BreakpointParameters &bp) const override; const QLoggingCategory &logCategory() override; + QJsonArray environment() const; QJsonArray sourceMap() const; QJsonArray preRunCommands() const; };