
This adds new types for setExceptionBreakpoints and adds support for `supportsExceptionFilterOptions`, which allows exception breakpoints to set a condition. While testing this, I noticed that obj-c exception catch breakpoints may not be working correctly in lldb-dap.
81 lines
2.9 KiB
C++
81 lines
2.9 KiB
C++
//===-- InitializeRequestHandler.cpp --------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "CommandPlugins.h"
|
|
#include "DAP.h"
|
|
#include "EventHelper.h"
|
|
#include "JSONUtils.h"
|
|
#include "LLDBUtils.h"
|
|
#include "Protocol/ProtocolRequests.h"
|
|
#include "RequestHandler.h"
|
|
#include "lldb/API/SBTarget.h"
|
|
|
|
using namespace lldb_dap;
|
|
using namespace lldb_dap::protocol;
|
|
|
|
/// Initialize request; value of command field is 'initialize'.
|
|
llvm::Expected<InitializeResponse> InitializeRequestHandler::Run(
|
|
const InitializeRequestArguments &arguments) const {
|
|
dap.clientFeatures = arguments.supportedFeatures;
|
|
|
|
// Do not source init files until in/out/err are configured.
|
|
dap.debugger = lldb::SBDebugger::Create(false);
|
|
dap.debugger.SetInputFile(dap.in);
|
|
dap.target = dap.debugger.GetDummyTarget();
|
|
|
|
llvm::Expected<int> out_fd = dap.out.GetWriteFileDescriptor();
|
|
if (!out_fd)
|
|
return out_fd.takeError();
|
|
dap.debugger.SetOutputFile(lldb::SBFile(*out_fd, "w", false));
|
|
|
|
llvm::Expected<int> err_fd = dap.err.GetWriteFileDescriptor();
|
|
if (!err_fd)
|
|
return err_fd.takeError();
|
|
dap.debugger.SetErrorFile(lldb::SBFile(*err_fd, "w", false));
|
|
|
|
auto interp = dap.debugger.GetCommandInterpreter();
|
|
|
|
// The sourceInitFile option is not part of the DAP specification. It is an
|
|
// extension used by the test suite to prevent sourcing `.lldbinit` and
|
|
// changing its behavior.
|
|
if (arguments.lldbExtSourceInitFile.value_or(true)) {
|
|
dap.debugger.SkipLLDBInitFiles(false);
|
|
dap.debugger.SkipAppInitFiles(false);
|
|
lldb::SBCommandReturnObject init;
|
|
interp.SourceInitFileInGlobalDirectory(init);
|
|
interp.SourceInitFileInHomeDirectory(init);
|
|
}
|
|
|
|
if (llvm::Error err = dap.RunPreInitCommands())
|
|
return err;
|
|
|
|
auto cmd = dap.debugger.GetCommandInterpreter().AddMultiwordCommand(
|
|
"lldb-dap", "Commands for managing lldb-dap.");
|
|
if (arguments.supportedFeatures.contains(
|
|
eClientFeatureStartDebuggingRequest)) {
|
|
cmd.AddCommand(
|
|
"start-debugging", new StartDebuggingCommand(dap),
|
|
"Sends a startDebugging request from the debug adapter to the client "
|
|
"to start a child debug session of the same type as the caller.");
|
|
}
|
|
cmd.AddCommand(
|
|
"repl-mode", new ReplModeCommand(dap),
|
|
"Get or set the repl behavior of lldb-dap evaluation requests.");
|
|
cmd.AddCommand("send-event", new SendEventCommand(dap),
|
|
"Sends an DAP event to the client.");
|
|
|
|
if (arguments.supportedFeatures.contains(eClientFeatureProgressReporting))
|
|
dap.StartProgressEventThread();
|
|
|
|
// Start our event thread so we can receive events from the debugger, target,
|
|
// process and more.
|
|
dap.StartEventThread();
|
|
|
|
return dap.GetCapabilities();
|
|
}
|