LLDB-DAP: Handle source mapping and additional debugger startup commands

This way we can step into Qt source code, and run startup commands like
`process handle SIGSEGV --notify true --pass true --stop true`

Change-Id: I495c1ef1554157989f4013473c22217e2d980053
Reviewed-by: Artem Sokolovskii <artem.sokolovskii@qt.io>
This commit is contained in:
Cristian Adam
2024-06-15 14:08:54 +02:00
parent 76e176afe6
commit 1ba52d1daa
2 changed files with 55 additions and 3 deletions

View File

@@ -7,7 +7,9 @@
#include <coreplugin/messagemanager.h>
#include <debugger/debuggeractions.h>
#include <debugger/debuggermainwindow.h>
#include <debugger/debuggersourcepathmappingwidget.h>
#include <utils/mimeconstants.h>
#include <utils/mimeutils.h>
@@ -18,6 +20,7 @@
#include <projectexplorer/projecttree.h>
#include <QDebug>
#include <QJsonArray>
#include <QLocalSocket>
#include <QVersionNumber>
@@ -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";
}

View File

@@ -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