27#include "llvm/BinaryFormat/ELF.h"
38namespace ELF = llvm::ELF;
43 return "ELF core dump plug-in.";
55 if (crash_file && !can_connect) {
59 const size_t header_size =
sizeof(llvm::ELF::Elf64_Ehdr);
62 crash_file->
GetPath(), header_size, 0);
63 if (data_sp && data_sp->GetByteSize() == header_size &&
68 if (elf_header.
Parse(data, &data_offset)) {
73 if (elf_header.
e_type == llvm::ELF::ET_CORE)
74 process_sp = std::make_shared<ProcessElfCore>(target_sp, listener_sp,
83 bool plugin_specified_by_name) {
127 last_entry->
data.GetRangeEnd() == range_entry.
data.GetRangeBase() &&
130 last_entry->
data.SetRangeEnd(range_entry.
data.GetRangeEnd());
137 const uint32_t permissions =
138 ((header.
p_flags & llvm::ELF::PF_R) ? lldb::ePermissionsReadable : 0u) |
139 ((header.
p_flags & llvm::ELF::PF_W) ? lldb::ePermissionsWritable : 0u) |
140 ((header.
p_flags & llvm::ELF::PF_X) ? lldb::ePermissionsExecutable : 0u);
169 if (core ==
nullptr) {
174 llvm::ArrayRef<elf::ELFProgramHeader> segments = core->
ProgramHeaders();
175 if (segments.size() == 0) {
195 bool ranges_are_sorted =
true;
206 if (H.p_type == llvm::ELF::PT_NOTE) {
212 if (H.p_type == llvm::ELF::PT_LOAD) {
214 if (vm_addr > last_addr)
215 ranges_are_sorted =
false;
217 }
else if (H.p_type == llvm::ELF::PT_AARCH64_MEMTAG_MTE) {
219 if (tag_addr > last_addr)
220 ranges_are_sorted =
false;
221 tag_addr = last_addr;
225 if (!ranges_are_sorted) {
232 bool siginfo_signal_found =
false;
233 bool prstatus_signal_found =
false;
236 if (!thread_data.siginfo_bytes.empty() || thread_data.signo != 0)
237 siginfo_signal_found =
true;
238 if (thread_data.prstatus_sig != 0)
239 prstatus_signal_found =
true;
241 if (!siginfo_signal_found) {
244 if (prstatus_signal_found) {
246 thread_data.signo = thread_data.prstatus_sig;
260 if (!exe_module_sp) {
265 if (!exe_module_sp) {
270 std::optional<NT_FILE_Entry> exe_header =
273 if (llvm::Expected<lldb::ModuleSP> module_sp_or_err =
276 exe_header->end - exe_header->start))
277 exe_module_sp = *module_sp_or_err;
279 llvm::consumeError(module_sp_or_err.takeError());
283 if (!exe_module_sp) {
287 exe_header ? (exe_header->end - exe_header->start) : 0;
290 exe_module_spec, load_addr, size);
292 exe_module_sp->SetPlatformFileSpec(
310 assert(
m_uuids.count(entry.path) == 0 ||
m_uuids[entry.path] == uuid);
312 LLDB_LOGF(log,
"%s found UUID @ %16.16" PRIx64
": %s \"%s\"",
313 __FUNCTION__, entry.start, uuid.
GetAsString().c_str(),
327 path_style = *guessed_style;
336 std::optional<NT_FILE_Entry> exe_header =
354 std::string execfn_str;
388 auto it =
m_uuids.find(std::string(path));
396 llvm::StringRef dyld_name;
399 llvm::Triple::UnknownOS)
414 for (
lldb::tid_t tid = 0; tid < num_threads; ++tid) {
419 return new_thread_list.
GetSize(
false) > 0;
434 addr = abi_sp->FixAnyAddress(addr);
446 if (permission_entry) {
447 if (permission_entry->
Contains(load_addr)) {
450 const Flags permissions(permission_entry->
data);
470 }
else if (load_addr < permission_entry->GetRangeBase()) {
496 if (core_objfile ==
nullptr)
502 if (address_range ==
nullptr || address_range->
GetRangeEnd() < addr) {
504 "core file does not contain 0x%" PRIx64, addr);
512 size_t bytes_to_read = size;
513 size_t bytes_copied = 0;
519 if (file_start == file_end)
524 if (file_end > file_start + offset)
525 bytes_left = file_end - (file_start + offset);
527 if (bytes_to_read > bytes_left)
528 bytes_to_read = bytes_left;
533 core_objfile->
CopyData(offset + file_start, bytes_to_read, buf);
538llvm::Expected<std::vector<lldb::addr_t>>
541 if (core_objfile ==
nullptr)
542 return llvm::createStringError(llvm::inconvertibleErrorCode(),
543 "No core object file.");
545 llvm::Expected<const MemoryTagManager *> tag_manager_or_err =
547 if (!tag_manager_or_err)
548 return tag_manager_or_err.takeError();
558 if (!tag_entry || (addr + len) >= tag_entry->
GetRangeEnd())
559 return llvm::createStringError(llvm::inconvertibleErrorCode(),
560 "No tag segment that covers this range.");
565 return core_objfile->
CopyData(offset, length, dst);
595 int pr_version = data.
GetU32(&offset);
599 LLDB_LOGF(log,
"FreeBSD PRSTATUS unexpected version %d", pr_version);
621 int pr_version = data.
GetU32(&offset);
625 LLDB_LOGF(log,
"FreeBSD PRPSINFO unexpected version %d", pr_version);
638 uint32_t &cpi_siglwp,
642 uint32_t version = data.
GetU32(&offset);
644 return llvm::createStringError(
645 "Error parsing NetBSD core(5) notes: Unsupported procinfo version");
647 uint32_t cpisize = data.
GetU32(&offset);
649 return llvm::createStringError(
650 "Error parsing NetBSD core(5) notes: Unsupported procinfo size");
652 cpi_signo = data.
GetU32(&offset);
659 cpi_pid = data.
GetU32(&offset);
669 cpi_nlwps = data.
GetU32(&offset);
672 cpi_siglwp = data.
GetU32(&offset);
674 return llvm::Error::success();
681 int version = data.
GetU32(&offset);
689llvm::Expected<std::vector<CoreNote>>
692 std::vector<CoreNote> result;
694 while (offset <
segment.GetByteSize()) {
697 return llvm::createStringError(
"unable to parse note segment");
699 size_t note_start = offset;
700 size_t note_size = llvm::alignTo(
note.n_descsz, 4);
706 return std::move(result);
711 bool lp64 = (arch.
GetMachine() == llvm::Triple::aarch64 ||
714 bool have_prstatus =
false;
715 bool have_prpsinfo =
false;
717 for (
const auto &
note : notes) {
718 if (
note.info.n_name !=
"FreeBSD")
721 if ((
note.info.n_type == ELF::NT_PRSTATUS && have_prstatus) ||
722 (
note.info.n_type == ELF::NT_PRPSINFO && have_prpsinfo)) {
727 have_prstatus =
false;
728 have_prpsinfo =
false;
731 switch (
note.info.n_type) {
732 case ELF::NT_PRSTATUS:
733 have_prstatus =
true;
736 case ELF::NT_PRPSINFO:
737 have_prpsinfo =
true;
740 case ELF::NT_FREEBSD_THRMISC: {
742 thread_data.
name =
note.data.GetCStr(&offset, 20);
745 case ELF::NT_FREEBSD_PROCSTAT_AUXV:
754 if (!have_prstatus) {
755 return llvm::createStringError(
756 "Could not find NT_PRSTATUS note in core file.");
759 return llvm::Error::success();
786 bool had_nt_regs =
false;
795 for (
const auto &
note : notes) {
796 llvm::StringRef name =
note.info.n_name;
798 if (name ==
"NetBSD-CORE") {
808 }
else if (name.consume_front(
"NetBSD-CORE@")) {
810 if (name.getAsInteger(10, tid))
811 return llvm::createStringError(
812 "Error parsing NetBSD core(5) notes: Cannot convert LWP ID "
816 case llvm::Triple::aarch64: {
827 thread_data.
tid = tid;
829 return llvm::createStringError(
830 "Could not find general purpose registers note in core file.");
833 if (!had_nt_regs || tid != thread_data.
tid)
834 return llvm::createStringError(
835 "Error parsing NetBSD core(5) notes: Unexpected order "
836 "of NOTEs PT_GETFPREG before PT_GETREG");
840 case llvm::Triple::x86: {
851 thread_data.
tid = tid;
853 return llvm::createStringError(
854 "Could not find general purpose registers note in core file.");
857 if (!had_nt_regs || tid != thread_data.
tid)
858 return llvm::createStringError(
859 "Error parsing NetBSD core(5) notes: Unexpected order "
860 "of NOTEs PT_GETFPREG before PT_GETREG");
864 case llvm::Triple::x86_64: {
875 thread_data.
tid = tid;
877 return llvm::createStringError(
878 "Could not find general purpose registers note in core file.");
881 if (!had_nt_regs || tid != thread_data.
tid)
882 return llvm::createStringError(
883 "Error parsing NetBSD core(5) notes: Unexpected order "
884 "of NOTEs PT_GETFPREG before PT_GETREG");
899 return llvm::createStringError(
900 "Error parsing NetBSD core(5) notes: No threads information "
901 "specified in notes");
904 return llvm::createStringError(
905 "Error parsing NetBSD core(5) notes: Mismatch between the number "
906 "of LWPs in netbsd_elfcore_procinfo and the number of LWPs specified "
919 if (data.tid == siglwp) {
927 return llvm::createStringError(
928 "Error parsing NetBSD core(5) notes: Signal passed to unknown LWP");
931 return llvm::Error::success();
936 for (
const auto &
note : notes) {
939 if (!llvm::StringRef(
note.info.n_name).starts_with(
"OpenBSD"))
942 switch (
note.info.n_type) {
958 return llvm::createStringError(
959 "Could not find general purpose registers note in core file.");
962 return llvm::Error::success();
979 bool have_prstatus =
false;
980 bool have_prpsinfo =
false;
982 for (
const auto &
note : notes) {
983 if (
note.info.n_name !=
"CORE" &&
note.info.n_name !=
"LINUX")
986 if ((
note.info.n_type == ELF::NT_PRSTATUS && have_prstatus) ||
987 (
note.info.n_type == ELF::NT_PRPSINFO && have_prpsinfo)) {
992 have_prstatus =
false;
993 have_prpsinfo =
false;
996 switch (
note.info.n_type) {
997 case ELF::NT_PRSTATUS: {
998 have_prstatus =
true;
1006 size_t len =
note.data.GetByteSize() - header_size;
1010 case ELF::NT_PRPSINFO: {
1011 have_prpsinfo =
true;
1019 auto core_arg = llvm::StringRef(prpsinfo.
pr_psargs,
1028 CoreArgs(core_arg, core_arg.size() ==
1032 case ELF::NT_SIGINFO: {
1036 static_cast<const char *
>(
note.data.GetData(&offset, size));
1040 case ELF::NT_FILE: {
1043 const uint64_t count =
note.data.GetAddress(&offset);
1044 note.data.GetAddress(&offset);
1045 for (uint64_t i = 0; i < count; ++i) {
1047 entry.
start =
note.data.GetAddress(&offset);
1048 entry.
end =
note.data.GetAddress(&offset);
1052 for (uint64_t i = 0; i < count; ++i) {
1053 const char *path =
note.data.GetCStr(&offset);
1054 if (path && path[0])
1070 return llvm::Error::success();
1079 assert(segment_header.
p_type == llvm::ELF::PT_NOTE);
1083 return notes_or_error.takeError();
1085 case llvm::Triple::FreeBSD:
1087 case llvm::Triple::Linux:
1089 case llvm::Triple::NetBSD:
1091 case llvm::Triple::OpenBSD:
1097 llvm::Triple::UnknownOS)
1100 return llvm::createStringError(
1101 "don't know how to parse core file: unsupported OS");
1108 const size_t elf_header_size = addr_size == 4 ?
sizeof(llvm::ELF::Elf32_Ehdr)
1109 :
sizeof(llvm::ELF::Elf64_Ehdr);
1111 std::vector<uint8_t> elf_header_bytes;
1112 elf_header_bytes.resize(elf_header_size);
1116 if (byte_read != elf_header_size ||
1118 return invalid_uuid;
1119 DataExtractor elf_header_data(elf_header_bytes.data(), elf_header_size,
1124 elf_header.
Parse(elf_header_data, &offset);
1128 std::vector<uint8_t> ph_bytes;
1131 bool found_first_load_segment =
false;
1132 for (
unsigned int i = 0; i < elf_header.
e_phnum; ++i) {
1141 program_header.
Parse(program_header_data, &offset);
1142 if (program_header.
p_type == llvm::ELF::PT_LOAD &&
1143 !found_first_load_segment) {
1144 base_addr = program_header.
p_vaddr;
1145 found_first_load_segment =
true;
1147 if (program_header.
p_type != llvm::ELF::PT_NOTE)
1150 std::vector<uint8_t> note_bytes;
1151 note_bytes.resize(program_header.
p_memsz);
1158 if (byte_read != program_header.
p_memsz)
1160 DataExtractor segment_data(note_bytes.data(), note_bytes.size(),
1163 if (!notes_or_error) {
1164 llvm::consumeError(notes_or_error.takeError());
1165 return invalid_uuid;
1168 if (
note.info.n_namesz == 4 &&
1169 note.info.n_type == llvm::ELF::NT_GNU_BUILD_ID &&
1170 "GNU" ==
note.info.n_name &&
1171 note.data.ValidOffsetForDataOfSize(0,
note.info.n_descsz))
1172 return UUID(
note.data.GetData().take_front(
note.info.n_descsz));
1175 return invalid_uuid;
1193 if (target_arch.
IsMIPS()) {
1201 assert(
m_auxv.GetByteSize() == 0 ||
1208 return std::nullopt;
1218 const bool add_exe_file_as_first_arg =
false;
1220 add_exe_file_as_first_arg);
1227std::optional<ProcessElfCore::NT_FILE_Entry>
1230 if (file_entry.start <= addr && addr < file_entry.end)
1233 return std::nullopt;
1236std::optional<ProcessElfCore::NT_FILE_Entry>
1251 return std::nullopt;
1257 if (std::optional<uint64_t> opt_value =
1259 if (std::optional<NT_FILE_Entry> nt =
1265 if (std::optional<uint64_t> opt_value =
1267 if (std::optional<NT_FILE_Entry> nt =
1271 return std::nullopt;
static llvm::raw_ostream & error(Stream &strm)
static llvm::raw_ostream & note(Stream &strm)
#define LLDB_LOGF(log,...)
#define LLDB_PLUGIN_DEFINE(PluginName)
static FileSpec CreateFileSpecFromPath(llvm::StringRef path)
Correctly create a FileSpec from a path found in a core file.
static void ParseOpenBSDProcInfo(ThreadData &thread_data, const DataExtractor &data)
static void ParseFreeBSDPrPsInfo(ProcessElfCore &process, const DataExtractor &data, bool lp64)
static void ParseFreeBSDPrStatus(ThreadData &thread_data, const DataExtractor &data, bool lp64)
static llvm::Error ParseNetBSDProcInfo(const DataExtractor &data, uint32_t &cpi_nlwps, uint32_t &cpi_signo, uint32_t &cpi_siglwp, uint32_t &cpi_pid)
@ AUXV_AT_EXECFN
Filename of executable.
@ AUXV_AT_PHDR
Program headers.
@ AUXV_AT_ENTRY
Program entry point.
std::optional< uint64_t > GetAuxValue(enum EntryType entry_type) const
static llvm::StringRef GetPluginNameStatic()
static llvm::StringRef GetPluginNameStatic()
Generic COFF object file reader.
lldb_private::DataExtractor GetSegmentData(const elf::ELFProgramHeader &H)
llvm::ArrayRef< elf::ELFProgramHeader > ProgramHeaders()
std::vector< NT_FILE_Entry > m_nt_file_entries
std::optional< NT_FILE_Entry > GetNTFileEntryForExecutableELFHeader()
Intelligently find the NT_FILE entry for the executable's ELF header.
lldb_private::UUID FindModuleUUID(const llvm::StringRef path) override
lldb::addr_t GetImageInfoAddress() override
Get the image information address for the current process.
lldb::addr_t AddAddressRangeFromMemoryTagSegment(const elf::ELFProgramHeader &header)
lldb_private::DataExtractor m_auxv
llvm::Error parseLinuxNotes(llvm::ArrayRef< lldb_private::CoreNote > notes)
A description of a linux process usually contains the following NOTE entries:
llvm::Error ParseThreadContextsFromNoteSegment(const elf::ELFProgramHeader &segment_header, const lldb_private::DataExtractor &segment_data)
Parse Thread context from PT_NOTE segment and store it in the thread list A note segment consists of ...
void UpdateBuildIdForNTFileEntries()
std::vector< ThreadData > m_thread_data
lldb_private::Range< lldb::addr_t, lldb::addr_t > FileRange
bool DoUpdateThreadList(lldb_private::ThreadList &old_thread_list, lldb_private::ThreadList &new_thread_list) override
Update the thread list following process plug-in's specific logic.
size_t ReadMemory(lldb::addr_t addr, void *buf, size_t size, lldb_private::Status &error) override
Read of memory from a process.
VMRangeToPermissions m_core_range_infos
static llvm::StringRef GetPluginDescriptionStatic()
std::unordered_map< std::string, lldb_private::UUID > m_uuids
llvm::Expected< std::vector< lldb_private::CoreNote > > parseSegment(const lldb_private::DataExtractor &segment)
lldb::addr_t AddAddressRangeFromLoadSegment(const elf::ELFProgramHeader &header)
~ProcessElfCore() override
bool GetMainExecutableModuleSpec(lldb_private::ModuleSpec &exe_spec)
llvm::Error parseFreeBSDNotes(llvm::ArrayRef< lldb_private::CoreNote > notes)
lldb_private::UUID FindBuidIdInCoreMemory(lldb::addr_t address)
VMRangeToFileOffset m_core_aranges
lldb_private::Status DoGetMemoryRegionInfo(lldb::addr_t load_addr, lldb_private::MemoryRegionInfo ®ion_info) override
DoGetMemoryRegionInfo is called by GetMemoryRegionInfo after it has removed non address bits from loa...
Process::CoreArgs m_process_args
size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size, lldb_private::Status &error) override
Actually do the reading of memory from a process.
VMRangeToFileOffset m_core_tag_ranges
llvm::Error parseNetBSDNotes(llvm::ArrayRef< lldb_private::CoreNote > notes)
NetBSD specific Thread context from PT_NOTE segment.
lldb_private::Status DoLoadCore() override
ProcessElfCore(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, const lldb_private::FileSpec &core_file)
lldb_private::DynamicLoader * GetDynamicLoader() override
Get the dynamic loader plug-in for this process.
llvm::Expected< std::vector< lldb::addr_t > > ReadMemoryTags(lldb::addr_t addr, size_t len) override
Read memory tags for the range addr to addr+len.
lldb_private::DataExtractor GetAuxvData() override
bool IsAlive() override
Check if a process is still alive.
uint32_t GetNumThreadContexts()
std::string m_executable_name
static lldb::ProcessSP CreateInstance(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, const lldb_private::FileSpec *crash_file_path, bool can_connect)
llvm::Error parseOpenBSDNotes(llvm::ArrayRef< lldb_private::CoreNote > notes)
void RefreshStateAfterStop() override
Currently called as part of ShouldStop.
lldb_private::ArchSpec GetArchitecture()
bool CanDebug(lldb::TargetSP target_sp, bool plugin_specified_by_name) override
Check if a plug-in instance can debug the file in module.
std::optional< Process::CoreArgs > GetCoreFileArgs() override
Provide arguments of a command that triggered a core dump.
bool GetProcessInfo(lldb_private::ProcessInstanceInfo &info) override
static llvm::StringRef GetPluginNameStatic()
lldb::ModuleSP m_core_module_sp
std::optional< NT_FILE_Entry > GetNTFileEntryContainingAddress(lldb::addr_t addr)
Find the NT_FILE entry that contains an address.
lldb_private::Status DoDestroy() override
A section + offset based address class.
lldb::addr_t GetLoadAddress(Target *target) const
Get the load address.
bool IsValid() const
Check if the object state is valid.
An architecture specification class.
void MergeFrom(const ArchSpec &other)
Merges fields from another ArchSpec into this ArchSpec.
bool IsMIPS() const
if MIPS architecture return true.
llvm::Triple::ArchType GetMachine() const
Returns a machine family for the current architecture.
A plug-in interface definition class for dynamic loaders.
static DynamicLoader * FindPlugin(Process *process, llvm::StringRef plugin_name)
Find a dynamic loader plugin for a given process.
static std::optional< Style > GuessPathStyle(llvm::StringRef absolute_path)
Attempt to guess path style for a given path string.
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
llvm::sys::path::Style Style
static FileSystem & Instance()
std::shared_ptr< DataBuffer > CreateDataBuffer(const llvm::Twine &path, uint64_t size=0, uint64_t offset=0)
Create memory buffer from path.
bool Test(ValueType bit) const
Test a single flag bit.
void SetReadable(LazyBool val)
MemoryRegionInfo & SetMemoryTagged(LazyBool val)
void SetMapped(LazyBool val)
void SetExecutable(LazyBool val)
void SetWritable(LazyBool val)
virtual llvm::Expected< std::vector< lldb::addr_t > > UnpackTagsFromCoreFileSegment(CoreReaderFn reader, lldb::addr_t tag_segment_virtual_address, lldb::addr_t tag_segment_data_address, lldb::addr_t addr, size_t len) const =0
static Status GetSharedModule(const ModuleSpec &module_spec, lldb::ModuleSP &module_sp, llvm::SmallVectorImpl< lldb::ModuleSP > *old_modules, bool *did_create_ptr, bool invoke_locate_callback=true)
FileSpec & GetPlatformFileSpec()
ArchSpec & GetArchitecture()
void SetTarget(lldb::TargetSP target)
Set the target to be used when resolving a module.
static lldb::ModuleSP CreateModuleFromObjectFile(Args &&...args)
A plug-in interface definition class for object file parsers.
virtual lldb_private::Address GetImageInfoAddress(Target *target)
Similar to Process::GetImageInfoAddress().
@ eTypeCoreFile
A core file that has a checkpoint of a program's execution state.
size_t CopyData(lldb::offset_t offset, size_t length, void *dst) const
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, ABICreateInstance create_callback)
static bool UnregisterPlugin(ABICreateInstance create_callback)
PostMortemProcess(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, const FileSpec &core_file)
void SetExecutableFile(const FileSpec &exe_file, bool add_exe_file_as_first_arg)
void SetArchitecture(const ArchSpec &arch)
void SetArguments(const Args &args, bool first_arg_is_executable)
void SetProcessID(lldb::pid_t pid)
lldb::pid_t GetID() const
Returns the pid of the process or LLDB_INVALID_PROCESS_ID if there is no known pid.
void SetUnixSignals(lldb::UnixSignalsSP &&signals_sp)
size_t ReadCStringFromMemory(lldb::addr_t vm_addr, char *cstr, size_t cstr_max_len, Status &error)
Read a NULL terminated C string from memory.
void SetCanJIT(bool can_jit)
Sets whether executing JIT-compiled code in this process is possible.
lldb::DynamicLoaderUP m_dyld_up
llvm::Expected< const MemoryTagManager * > GetMemoryTagManager()
If this architecture and process supports memory tagging, return a tag manager that can be used to ma...
lldb::ByteOrder GetByteOrder() const
llvm::Expected< lldb::ModuleSP > ReadModuleFromMemory(const FileSpec &file_spec, lldb::addr_t header_addr, size_t size_to_read=512)
Creates and populates a module using an in-memory object file.
void SetID(lldb::pid_t new_pid)
Sets the stored pid.
uint32_t GetAddressByteSize() const
virtual void Finalize(bool destructing)
This object is about to be destroyed, do any necessary cleanup.
ThreadList m_thread_list
The threads for this process as the user will see them.
const lldb::UnixSignalsSP & GetUnixSignals()
const lldb::ABISP & GetABI()
Target & GetTarget()
Get the target object pointer for this module.
RangeData< lldb::addr_t, lldb::addr_t, FileRange > Entry
llvm::Error ToError() const
FIXME: Replace all uses with takeError() instead.
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
bool Fail() const
Test for error condition.
static Status FromError(llvm::Error error)
Avoid using this in new code. Migrate APIs to llvm::Expected instead.
lldb::ModuleSP GetOrCreateModule(const ModuleSpec &module_spec, bool notify, Status *error_ptr=nullptr)
Find a binary on the system and return its Module, or return an existing Module that is already in th...
bool SetArchitecture(const ArchSpec &arch_spec, bool set_platform=false, bool merge=true)
Set the architecture for this target.
lldb::ModuleSP GetExecutableModule()
Gets the module for the main executable.
const ArchSpec & GetArchitecture() const
void SetExecutableModule(lldb::ModuleSP &module_sp, LoadDependentFiles load_dependent_files=eLoadDependentsDefault)
Set the main executable module.
void AddThread(const lldb::ThreadSP &thread_sp)
uint32_t GetSize(bool can_update=true)
Represents UUID's of various sizes.
std::string GetAsString(llvm::StringRef separator="-") const
static lldb::UnixSignalsSP Create(const ArchSpec &arch)
#define LLDB_INVALID_ADDRESS
@ NT_PROCINFO_CPI_SIGIGNORE_SIZE
@ NT_PROCINFO_CPI_NAME_SIZE
@ NT_PROCINFO_CPI_RUID_SIZE
@ NT_PROCINFO_CPI_SVUID_SIZE
@ NT_PROCINFO_CPI_SIGCODE_SIZE
@ NT_PROCINFO_CPI_SVGID_SIZE
@ NT_PROCINFO_CPI_EUID_SIZE
@ NT_PROCINFO_CPI_PPID_SIZE
@ NT_PROCINFO_CPI_RGID_SIZE
@ NT_PROCINFO_CPI_SIGCATCH_SIZE
@ NT_PROCINFO_CPI_SIGMASK_SIZE
@ NT_PROCINFO_CPI_SID_SIZE
@ NT_PROCINFO_CPI_SIGPEND_SIZE
@ NT_PROCINFO_CPI_EGID_SIZE
@ NT_PROCINFO_CPI_PGRP_SIZE
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
std::shared_ptr< lldb_private::ABI > ABISP
std::shared_ptr< lldb_private::Thread > ThreadSP
std::shared_ptr< lldb_private::Process > ProcessSP
std::shared_ptr< lldb_private::Listener > ListenerSP
std::shared_ptr< lldb_private::Target > TargetSP
std::shared_ptr< lldb_private::Module > ModuleSP
lldb_private::Status Parse(const lldb_private::DataExtractor &data, const lldb_private::ArchSpec &arch)
static size_t GetSize(const lldb_private::ArchSpec &arch)
lldb_private::Status Parse(const lldb_private::DataExtractor &data, const lldb_private::ArchSpec &arch)
llvm::StringRef siginfo_bytes
lldb_private::DataExtractor gpregset
std::vector< lldb_private::CoreNote > notes
bool Contains(BaseType r) const
BaseType GetRangeBase() const
void SetRangeEnd(BaseType end)
SizeType GetByteSize() const
void SetRangeBase(BaseType b)
Set the start value for the range, and keep the same size.
BaseType GetRangeEnd() const