27#include "llvm/BinaryFormat/ELF.h"
37namespace ELF = llvm::ELF;
42 return "ELF core dump plug-in.";
54 if (crash_file && !can_connect) {
58 const size_t header_size =
sizeof(llvm::ELF::Elf64_Ehdr);
61 crash_file->
GetPath(), header_size, 0);
62 if (data_sp && data_sp->GetByteSize() == header_size &&
67 if (elf_header.
Parse(data, &data_offset)) {
72 if (elf_header.
e_type == llvm::ELF::ET_CORE)
73 process_sp = std::make_shared<ProcessElfCore>(target_sp, listener_sp,
82 bool plugin_specified_by_name) {
126 last_entry->
data.GetRangeEnd() == range_entry.
data.GetRangeBase() &&
129 last_entry->
data.SetRangeEnd(range_entry.
data.GetRangeEnd());
136 const uint32_t permissions =
137 ((header.
p_flags & llvm::ELF::PF_R) ? lldb::ePermissionsReadable : 0u) |
138 ((header.
p_flags & llvm::ELF::PF_W) ? lldb::ePermissionsWritable : 0u) |
139 ((header.
p_flags & llvm::ELF::PF_X) ? lldb::ePermissionsExecutable : 0u);
168 if (core ==
nullptr) {
173 llvm::ArrayRef<elf::ELFProgramHeader> segments = core->
ProgramHeaders();
174 if (segments.size() == 0) {
194 bool ranges_are_sorted =
true;
205 if (H.p_type == llvm::ELF::PT_NOTE) {
211 if (H.p_type == llvm::ELF::PT_LOAD) {
213 if (vm_addr > last_addr)
214 ranges_are_sorted =
false;
216 }
else if (H.p_type == llvm::ELF::PT_AARCH64_MEMTAG_MTE) {
218 if (tag_addr > last_addr)
219 ranges_are_sorted =
false;
220 tag_addr = last_addr;
224 if (!ranges_are_sorted) {
231 bool siginfo_signal_found =
false;
232 bool prstatus_signal_found =
false;
235 if (!thread_data.siginfo_bytes.empty() || thread_data.signo != 0)
236 siginfo_signal_found =
true;
237 if (thread_data.prstatus_sig != 0)
238 prstatus_signal_found =
true;
240 if (!siginfo_signal_found) {
243 if (prstatus_signal_found) {
245 thread_data.signo = thread_data.prstatus_sig;
259 if (!exe_module_sp) {
264 if (!exe_module_sp) {
269 std::optional<NT_FILE_Entry> exe_header =
272 if (llvm::Expected<lldb::ModuleSP> module_sp_or_err =
275 exe_header->end - exe_header->start))
276 exe_module_sp = *module_sp_or_err;
278 llvm::consumeError(module_sp_or_err.takeError());
282 if (!exe_module_sp) {
286 exe_header ? (exe_header->end - exe_header->start) : 0;
289 exe_module_spec, load_addr, size);
291 exe_module_sp->SetPlatformFileSpec(
309 assert(
m_uuids.count(entry.path) == 0 ||
m_uuids[entry.path] == uuid);
311 LLDB_LOGF(log,
"%s found UUID @ %16.16" PRIx64
": %s \"%s\"",
312 __FUNCTION__, entry.start, uuid.
GetAsString().c_str(),
326 path_style = *guessed_style;
335 std::optional<NT_FILE_Entry> exe_header =
353 std::string execfn_str;
387 auto it =
m_uuids.find(std::string(path));
406 for (
lldb::tid_t tid = 0; tid < num_threads; ++tid) {
411 return new_thread_list.
GetSize(
false) > 0;
426 addr = abi_sp->FixAnyAddress(addr);
438 if (permission_entry) {
439 if (permission_entry->
Contains(load_addr)) {
442 const Flags permissions(permission_entry->
data);
462 }
else if (load_addr < permission_entry->GetRangeBase()) {
488 if (core_objfile ==
nullptr)
494 if (address_range ==
nullptr || address_range->
GetRangeEnd() < addr) {
496 "core file does not contain 0x%" PRIx64, addr);
504 size_t bytes_to_read = size;
505 size_t bytes_copied = 0;
511 if (file_start == file_end)
516 if (file_end > file_start + offset)
517 bytes_left = file_end - (file_start + offset);
519 if (bytes_to_read > bytes_left)
520 bytes_to_read = bytes_left;
525 core_objfile->
CopyData(offset + file_start, bytes_to_read, buf);
530llvm::Expected<std::vector<lldb::addr_t>>
533 if (core_objfile ==
nullptr)
534 return llvm::createStringError(llvm::inconvertibleErrorCode(),
535 "No core object file.");
537 llvm::Expected<const MemoryTagManager *> tag_manager_or_err =
539 if (!tag_manager_or_err)
540 return tag_manager_or_err.takeError();
550 if (!tag_entry || (addr + len) >= tag_entry->
GetRangeEnd())
551 return llvm::createStringError(llvm::inconvertibleErrorCode(),
552 "No tag segment that covers this range.");
557 return core_objfile->
CopyData(offset, length, dst);
587 int pr_version = data.
GetU32(&offset);
591 LLDB_LOGF(log,
"FreeBSD PRSTATUS unexpected version %d", pr_version);
613 int pr_version = data.
GetU32(&offset);
617 LLDB_LOGF(log,
"FreeBSD PRPSINFO unexpected version %d", pr_version);
630 uint32_t &cpi_siglwp,
634 uint32_t version = data.
GetU32(&offset);
636 return llvm::createStringError(
637 "Error parsing NetBSD core(5) notes: Unsupported procinfo version");
639 uint32_t cpisize = data.
GetU32(&offset);
641 return llvm::createStringError(
642 "Error parsing NetBSD core(5) notes: Unsupported procinfo size");
644 cpi_signo = data.
GetU32(&offset);
651 cpi_pid = data.
GetU32(&offset);
661 cpi_nlwps = data.
GetU32(&offset);
664 cpi_siglwp = data.
GetU32(&offset);
666 return llvm::Error::success();
673 int version = data.
GetU32(&offset);
681llvm::Expected<std::vector<CoreNote>>
684 std::vector<CoreNote> result;
686 while (offset <
segment.GetByteSize()) {
689 return llvm::createStringError(
"unable to parse note segment");
691 size_t note_start = offset;
692 size_t note_size = llvm::alignTo(
note.n_descsz, 4);
698 return std::move(result);
703 bool lp64 = (arch.
GetMachine() == llvm::Triple::aarch64 ||
706 bool have_prstatus =
false;
707 bool have_prpsinfo =
false;
709 for (
const auto &
note : notes) {
710 if (
note.info.n_name !=
"FreeBSD")
713 if ((
note.info.n_type == ELF::NT_PRSTATUS && have_prstatus) ||
714 (
note.info.n_type == ELF::NT_PRPSINFO && have_prpsinfo)) {
719 have_prstatus =
false;
720 have_prpsinfo =
false;
723 switch (
note.info.n_type) {
724 case ELF::NT_PRSTATUS:
725 have_prstatus =
true;
728 case ELF::NT_PRPSINFO:
729 have_prpsinfo =
true;
732 case ELF::NT_FREEBSD_THRMISC: {
734 thread_data.
name =
note.data.GetCStr(&offset, 20);
737 case ELF::NT_FREEBSD_PROCSTAT_AUXV:
746 if (!have_prstatus) {
747 return llvm::createStringError(
748 "Could not find NT_PRSTATUS note in core file.");
751 return llvm::Error::success();
778 bool had_nt_regs =
false;
787 for (
const auto &
note : notes) {
788 llvm::StringRef name =
note.info.n_name;
790 if (name ==
"NetBSD-CORE") {
800 }
else if (name.consume_front(
"NetBSD-CORE@")) {
802 if (name.getAsInteger(10, tid))
803 return llvm::createStringError(
804 "Error parsing NetBSD core(5) notes: Cannot convert LWP ID "
808 case llvm::Triple::aarch64: {
819 thread_data.
tid = tid;
821 return llvm::createStringError(
822 "Could not find general purpose registers note in core file.");
825 if (!had_nt_regs || tid != thread_data.
tid)
826 return llvm::createStringError(
827 "Error parsing NetBSD core(5) notes: Unexpected order "
828 "of NOTEs PT_GETFPREG before PT_GETREG");
832 case llvm::Triple::x86: {
843 thread_data.
tid = tid;
845 return llvm::createStringError(
846 "Could not find general purpose registers note in core file.");
849 if (!had_nt_regs || tid != thread_data.
tid)
850 return llvm::createStringError(
851 "Error parsing NetBSD core(5) notes: Unexpected order "
852 "of NOTEs PT_GETFPREG before PT_GETREG");
856 case llvm::Triple::x86_64: {
867 thread_data.
tid = tid;
869 return llvm::createStringError(
870 "Could not find general purpose registers note in core file.");
873 if (!had_nt_regs || tid != thread_data.
tid)
874 return llvm::createStringError(
875 "Error parsing NetBSD core(5) notes: Unexpected order "
876 "of NOTEs PT_GETFPREG before PT_GETREG");
891 return llvm::createStringError(
892 "Error parsing NetBSD core(5) notes: No threads information "
893 "specified in notes");
896 return llvm::createStringError(
897 "Error parsing NetBSD core(5) notes: Mismatch between the number "
898 "of LWPs in netbsd_elfcore_procinfo and the number of LWPs specified "
911 if (data.tid == siglwp) {
919 return llvm::createStringError(
920 "Error parsing NetBSD core(5) notes: Signal passed to unknown LWP");
923 return llvm::Error::success();
928 for (
const auto &
note : notes) {
931 if (!llvm::StringRef(
note.info.n_name).starts_with(
"OpenBSD"))
934 switch (
note.info.n_type) {
950 return llvm::createStringError(
951 "Could not find general purpose registers note in core file.");
954 return llvm::Error::success();
971 bool have_prstatus =
false;
972 bool have_prpsinfo =
false;
974 for (
const auto &
note : notes) {
975 if (
note.info.n_name !=
"CORE" &&
note.info.n_name !=
"LINUX")
978 if ((
note.info.n_type == ELF::NT_PRSTATUS && have_prstatus) ||
979 (
note.info.n_type == ELF::NT_PRPSINFO && have_prpsinfo)) {
984 have_prstatus =
false;
985 have_prpsinfo =
false;
988 switch (
note.info.n_type) {
989 case ELF::NT_PRSTATUS: {
990 have_prstatus =
true;
998 size_t len =
note.data.GetByteSize() - header_size;
1002 case ELF::NT_PRPSINFO: {
1003 have_prpsinfo =
true;
1011 auto core_arg = llvm::StringRef(prpsinfo.
pr_psargs,
1020 CoreArgs(core_arg, core_arg.size() ==
1024 case ELF::NT_SIGINFO: {
1028 static_cast<const char *
>(
note.data.GetData(&offset, size));
1032 case ELF::NT_FILE: {
1035 const uint64_t count =
note.data.GetAddress(&offset);
1036 note.data.GetAddress(&offset);
1037 for (uint64_t i = 0; i < count; ++i) {
1039 entry.
start =
note.data.GetAddress(&offset);
1040 entry.
end =
note.data.GetAddress(&offset);
1044 for (uint64_t i = 0; i < count; ++i) {
1045 const char *path =
note.data.GetCStr(&offset);
1046 if (path && path[0])
1062 return llvm::Error::success();
1071 assert(segment_header.
p_type == llvm::ELF::PT_NOTE);
1075 return notes_or_error.takeError();
1077 case llvm::Triple::FreeBSD:
1079 case llvm::Triple::Linux:
1081 case llvm::Triple::NetBSD:
1083 case llvm::Triple::OpenBSD:
1086 return llvm::createStringError(
1087 "Don't know how to parse core file. Unsupported OS.");
1094 const size_t elf_header_size = addr_size == 4 ?
sizeof(llvm::ELF::Elf32_Ehdr)
1095 :
sizeof(llvm::ELF::Elf64_Ehdr);
1097 std::vector<uint8_t> elf_header_bytes;
1098 elf_header_bytes.resize(elf_header_size);
1102 if (byte_read != elf_header_size ||
1104 return invalid_uuid;
1105 DataExtractor elf_header_data(elf_header_bytes.data(), elf_header_size,
1110 elf_header.
Parse(elf_header_data, &offset);
1114 std::vector<uint8_t> ph_bytes;
1117 bool found_first_load_segment =
false;
1118 for (
unsigned int i = 0; i < elf_header.
e_phnum; ++i) {
1127 program_header.
Parse(program_header_data, &offset);
1128 if (program_header.
p_type == llvm::ELF::PT_LOAD &&
1129 !found_first_load_segment) {
1130 base_addr = program_header.
p_vaddr;
1131 found_first_load_segment =
true;
1133 if (program_header.
p_type != llvm::ELF::PT_NOTE)
1136 std::vector<uint8_t> note_bytes;
1137 note_bytes.resize(program_header.
p_memsz);
1144 if (byte_read != program_header.
p_memsz)
1146 DataExtractor segment_data(note_bytes.data(), note_bytes.size(),
1149 if (!notes_or_error) {
1150 llvm::consumeError(notes_or_error.takeError());
1151 return invalid_uuid;
1154 if (
note.info.n_namesz == 4 &&
1155 note.info.n_type == llvm::ELF::NT_GNU_BUILD_ID &&
1156 "GNU" ==
note.info.n_name &&
1157 note.data.ValidOffsetForDataOfSize(0,
note.info.n_descsz))
1158 return UUID(
note.data.GetData().take_front(
note.info.n_descsz));
1161 return invalid_uuid;
1179 if (target_arch.
IsMIPS()) {
1187 assert(
m_auxv.GetByteSize() == 0 ||
1194 return std::nullopt;
1204 const bool add_exe_file_as_first_arg =
false;
1206 add_exe_file_as_first_arg);
1213std::optional<ProcessElfCore::NT_FILE_Entry>
1216 if (file_entry.start <= addr && addr < file_entry.end)
1219 return std::nullopt;
1222std::optional<ProcessElfCore::NT_FILE_Entry>
1237 return std::nullopt;
1243 if (std::optional<uint64_t> opt_value =
1245 if (std::optional<NT_FILE_Entry> nt =
1251 if (std::optional<uint64_t> opt_value =
1253 if (std::optional<NT_FILE_Entry> nt =
1257 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()
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