//===-- ReadMemoryRequestHandler.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 "DAP.h" #include "JSONUtils.h" #include "RequestHandler.h" #include "llvm/ADT/StringExtras.h" namespace lldb_dap { // Reads bytes from memory at the provided location. // // Clients should only call this request if the corresponding capability // `supportsReadMemoryRequest` is true llvm::Expected ReadMemoryRequestHandler::Run(const protocol::ReadMemoryArguments &args) const { const lldb::addr_t raw_address = args.memoryReference + args.offset; lldb::SBProcess process = dap.target.GetProcess(); if (!lldb::SBDebugger::StateIsStoppedState(process.GetState())) return llvm::make_error(); const uint64_t count_read = std::max(args.count, 1); // We also need support reading 0 bytes // VS Code sends those requests to check if a `memoryReference` // can be dereferenced. protocol::ReadMemoryResponseBody response; std::vector &buffer = response.data; buffer.resize(count_read); lldb::SBError error; const size_t memory_count = dap.target.GetProcess().ReadMemory( raw_address, buffer.data(), buffer.size(), error); response.address = raw_address; // reading memory may fail for multiple reasons. memory not readable, // reading out of memory range and gaps in memory. return from // the last readable byte. if (error.Fail() && (memory_count < count_read)) { response.unreadableBytes = count_read - memory_count; } buffer.resize(std::min(memory_count, args.count)); return response; } } // namespace lldb_dap