28#include "llvm/BinaryFormat/ELF.h"
29#include "llvm/Support/Threading.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;
207 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) {
267 FileSpec::Style::native);
271 if (!exe_module_sp) {
276 std::optional<lldb::addr_t> exe_header_addr;
280 if (file_entry.path == executable_path) {
281 exe_header_addr = file_entry.start;
285 if (exe_header_addr.has_value())
304 assert(
m_uuids.count(entry.path) == 0 ||
m_uuids[entry.path] == uuid);
307 LLDB_LOGF(log,
"%s found UUID @ %16.16" PRIx64
": %s \"%s\"",
308 __FUNCTION__, entry.start, uuid.
GetAsString().c_str(),
319 std::string execfn_str;
334 executable_path = file_entry.path;
337 return executable_path;
344 auto it =
m_uuids.find(std::string(path));
363 for (
lldb::tid_t tid = 0; tid < num_threads; ++tid) {
368 return new_thread_list.
GetSize(
false) > 0;
383 addr = abi_sp->FixAnyAddress(addr);
395 if (permission_entry) {
396 if (permission_entry->
Contains(load_addr)) {
399 const Flags permissions(permission_entry->
data);
419 }
else if (load_addr < permission_entry->GetRangeBase()) {
445 if (core_objfile ==
nullptr)
451 if (address_range ==
nullptr || address_range->
GetRangeEnd() < addr) {
453 "core file does not contain 0x%" PRIx64, addr);
461 size_t bytes_to_read = size;
462 size_t bytes_copied = 0;
468 if (file_start == file_end)
473 if (file_end > file_start + offset)
474 bytes_left = file_end - (file_start + offset);
476 if (bytes_to_read > bytes_left)
477 bytes_to_read = bytes_left;
482 core_objfile->
CopyData(offset + file_start, bytes_to_read, buf);
487llvm::Expected<std::vector<lldb::addr_t>>
490 if (core_objfile ==
nullptr)
491 return llvm::createStringError(llvm::inconvertibleErrorCode(),
492 "No core object file.");
494 llvm::Expected<const MemoryTagManager *> tag_manager_or_err =
496 if (!tag_manager_or_err)
497 return tag_manager_or_err.takeError();
507 if (!tag_entry || (addr + len) >= tag_entry->
GetRangeEnd())
508 return llvm::createStringError(llvm::inconvertibleErrorCode(),
509 "No tag segment that covers this range.");
514 return core_objfile->
CopyData(offset, length, dst);
526 static llvm::once_flag g_once_flag;
528 llvm::call_once(g_once_flag, []() {
548 int pr_version = data.
GetU32(&offset);
553 LLDB_LOGF(log,
"FreeBSD PRSTATUS unexpected version %d", pr_version);
576 int pr_version = data.
GetU32(&offset);
581 LLDB_LOGF(log,
"FreeBSD PRPSINFO unexpected version %d", pr_version);
595 uint32_t &cpi_siglwp,
599 uint32_t version = data.
GetU32(&offset);
601 return llvm::make_error<llvm::StringError>(
602 "Error parsing NetBSD core(5) notes: Unsupported procinfo version",
603 llvm::inconvertibleErrorCode());
605 uint32_t cpisize = data.
GetU32(&offset);
607 return llvm::make_error<llvm::StringError>(
608 "Error parsing NetBSD core(5) notes: Unsupported procinfo size",
609 llvm::inconvertibleErrorCode());
611 cpi_signo = data.
GetU32(&offset);
618 cpi_pid = data.
GetU32(&offset);
628 cpi_nlwps = data.
GetU32(&offset);
631 cpi_siglwp = data.
GetU32(&offset);
633 return llvm::Error::success();
640 int version = data.
GetU32(&offset);
648llvm::Expected<std::vector<CoreNote>>
651 std::vector<CoreNote> result;
655 if (!
note.Parse(segment, &offset))
656 return llvm::make_error<llvm::StringError>(
657 "Unable to parse note segment", llvm::inconvertibleErrorCode());
659 size_t note_start = offset;
660 size_t note_size = llvm::alignTo(
note.n_descsz, 4);
666 return std::move(result);
671 bool lp64 = (arch.
GetMachine() == llvm::Triple::aarch64 ||
675 bool have_prstatus =
false;
676 bool have_prpsinfo =
false;
678 for (
const auto &
note : notes) {
679 if (
note.info.n_name !=
"FreeBSD")
682 if ((
note.info.n_type == ELF::NT_PRSTATUS && have_prstatus) ||
683 (
note.info.n_type == ELF::NT_PRPSINFO && have_prpsinfo)) {
688 have_prstatus =
false;
689 have_prpsinfo =
false;
692 switch (
note.info.n_type) {
693 case ELF::NT_PRSTATUS:
694 have_prstatus =
true;
697 case ELF::NT_PRPSINFO:
698 have_prpsinfo =
true;
701 case ELF::NT_FREEBSD_THRMISC: {
703 thread_data.
name =
note.data.GetCStr(&offset, 20);
706 case ELF::NT_FREEBSD_PROCSTAT_AUXV:
715 if (!have_prstatus) {
716 return llvm::make_error<llvm::StringError>(
717 "Could not find NT_PRSTATUS note in core file.",
718 llvm::inconvertibleErrorCode());
721 return llvm::Error::success();
748 bool had_nt_regs =
false;
757 for (
const auto &
note : notes) {
758 llvm::StringRef name =
note.info.n_name;
760 if (name ==
"NetBSD-CORE") {
770 }
else if (name.consume_front(
"NetBSD-CORE@")) {
772 if (name.getAsInteger(10, tid))
773 return llvm::make_error<llvm::StringError>(
774 "Error parsing NetBSD core(5) notes: Cannot convert LWP ID "
776 llvm::inconvertibleErrorCode());
779 case llvm::Triple::aarch64: {
790 thread_data.
tid = tid;
792 return llvm::make_error<llvm::StringError>(
793 "Could not find general purpose registers note in core file.",
794 llvm::inconvertibleErrorCode());
797 if (!had_nt_regs || tid != thread_data.
tid)
798 return llvm::make_error<llvm::StringError>(
799 "Error parsing NetBSD core(5) notes: Unexpected order "
800 "of NOTEs PT_GETFPREG before PT_GETREG",
801 llvm::inconvertibleErrorCode());
805 case llvm::Triple::x86: {
816 thread_data.
tid = tid;
818 return llvm::make_error<llvm::StringError>(
819 "Could not find general purpose registers note in core file.",
820 llvm::inconvertibleErrorCode());
823 if (!had_nt_regs || tid != thread_data.
tid)
824 return llvm::make_error<llvm::StringError>(
825 "Error parsing NetBSD core(5) notes: Unexpected order "
826 "of NOTEs PT_GETFPREG before PT_GETREG",
827 llvm::inconvertibleErrorCode());
831 case llvm::Triple::x86_64: {
842 thread_data.
tid = tid;
844 return llvm::make_error<llvm::StringError>(
845 "Could not find general purpose registers note in core file.",
846 llvm::inconvertibleErrorCode());
849 if (!had_nt_regs || tid != thread_data.
tid)
850 return llvm::make_error<llvm::StringError>(
851 "Error parsing NetBSD core(5) notes: Unexpected order "
852 "of NOTEs PT_GETFPREG before PT_GETREG",
853 llvm::inconvertibleErrorCode());
868 return llvm::make_error<llvm::StringError>(
869 "Error parsing NetBSD core(5) notes: No threads information "
870 "specified in notes",
871 llvm::inconvertibleErrorCode());
874 return llvm::make_error<llvm::StringError>(
875 "Error parsing NetBSD core(5) notes: Mismatch between the number "
876 "of LWPs in netbsd_elfcore_procinfo and the number of LWPs specified "
878 llvm::inconvertibleErrorCode());
890 if (data.tid == siglwp) {
898 return llvm::make_error<llvm::StringError>(
899 "Error parsing NetBSD core(5) notes: Signal passed to unknown LWP",
900 llvm::inconvertibleErrorCode());
903 return llvm::Error::success();
908 for (
const auto &
note : notes) {
911 if (!llvm::StringRef(
note.info.n_name).starts_with(
"OpenBSD"))
914 switch (
note.info.n_type) {
930 return llvm::make_error<llvm::StringError>(
931 "Could not find general purpose registers note in core file.",
932 llvm::inconvertibleErrorCode());
935 return llvm::Error::success();
952 bool have_prstatus =
false;
953 bool have_prpsinfo =
false;
955 for (
const auto &
note : notes) {
956 if (
note.info.n_name !=
"CORE" &&
note.info.n_name !=
"LINUX")
959 if ((
note.info.n_type == ELF::NT_PRSTATUS && have_prstatus) ||
960 (
note.info.n_type == ELF::NT_PRPSINFO && have_prpsinfo)) {
965 have_prstatus =
false;
966 have_prpsinfo =
false;
969 switch (
note.info.n_type) {
970 case ELF::NT_PRSTATUS: {
971 have_prstatus =
true;
979 size_t len =
note.data.GetByteSize() - header_size;
983 case ELF::NT_PRPSINFO: {
984 have_prpsinfo =
true;
994 case ELF::NT_SIGINFO: {
998 static_cast<const char *
>(
note.data.GetData(&offset, size));
1002 case ELF::NT_FILE: {
1005 const uint64_t count =
note.data.GetAddress(&offset);
1006 note.data.GetAddress(&offset);
1007 for (uint64_t i = 0; i < count; ++i) {
1009 entry.
start =
note.data.GetAddress(&offset);
1010 entry.
end =
note.data.GetAddress(&offset);
1014 for (uint64_t i = 0; i < count; ++i) {
1015 const char *path =
note.data.GetCStr(&offset);
1016 if (path && path[0])
1032 return llvm::Error::success();
1041 assert(segment_header.
p_type == llvm::ELF::PT_NOTE);
1045 return notes_or_error.takeError();
1047 case llvm::Triple::FreeBSD:
1049 case llvm::Triple::Linux:
1051 case llvm::Triple::NetBSD:
1053 case llvm::Triple::OpenBSD:
1056 return llvm::make_error<llvm::StringError>(
1057 "Don't know how to parse core file. Unsupported OS.",
1058 llvm::inconvertibleErrorCode());
1065 const size_t elf_header_size = addr_size == 4 ?
sizeof(llvm::ELF::Elf32_Ehdr)
1066 :
sizeof(llvm::ELF::Elf64_Ehdr);
1068 std::vector<uint8_t> elf_header_bytes;
1069 elf_header_bytes.resize(elf_header_size);
1073 if (byte_read != elf_header_size ||
1075 return invalid_uuid;
1076 DataExtractor elf_header_data(elf_header_bytes.data(), elf_header_size,
1081 elf_header.
Parse(elf_header_data, &offset);
1085 std::vector<uint8_t> ph_bytes;
1088 bool found_first_load_segment =
false;
1089 for (
unsigned int i = 0; i < elf_header.
e_phnum; ++i) {
1098 program_header.
Parse(program_header_data, &offset);
1099 if (program_header.
p_type == llvm::ELF::PT_LOAD &&
1100 !found_first_load_segment) {
1101 base_addr = program_header.
p_vaddr;
1102 found_first_load_segment =
true;
1104 if (program_header.
p_type != llvm::ELF::PT_NOTE)
1107 std::vector<uint8_t> note_bytes;
1108 note_bytes.resize(program_header.
p_memsz);
1115 if (byte_read != program_header.
p_memsz)
1117 DataExtractor segment_data(note_bytes.data(), note_bytes.size(),
1120 if (!notes_or_error) {
1121 llvm::consumeError(notes_or_error.takeError());
1122 return invalid_uuid;
1125 if (
note.info.n_namesz == 4 &&
1126 note.info.n_type == llvm::ELF::NT_GNU_BUILD_ID &&
1127 "GNU" ==
note.info.n_name &&
1128 note.data.ValidOffsetForDataOfSize(0,
note.info.n_descsz))
1129 return UUID(
note.data.GetData().take_front(
note.info.n_descsz));
1132 return invalid_uuid;
1150 if (target_arch.
IsMIPS()) {
1158 assert(
m_auxv.GetByteSize() == 0 ||
1170 const bool add_exe_file_as_first_arg =
false;
1172 add_exe_file_as_first_arg);
static llvm::raw_ostream & error(Stream &strm)
static llvm::raw_ostream & note(Stream &strm)
#define LLDB_LOGF(log,...)
#define LLDB_PLUGIN_DEFINE(PluginName)
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.
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
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::string GetMainExecutablePath()
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
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...
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.
bool GetProcessInfo(lldb_private::ProcessInstanceInfo &info) override
static llvm::StringRef GetPluginNameStatic()
lldb::ModuleSP m_core_module_sp
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.
void SetFile(llvm::StringRef path, Style style)
Change the file specified with a new path.
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
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 SetMapped(OptionalBool val)
void SetMemoryTagged(OptionalBool val)
void SetReadable(OptionalBool val)
void SetExecutable(OptionalBool val)
void SetWritable(OptionalBool 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)
ArchSpec & GetArchitecture()
void SetTarget(lldb::TargetSP target)
Set the target to be used when resolving a module.
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 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
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()
lldb::ModuleSP ReadModuleFromMemory(const FileSpec &file_spec, lldb::addr_t header_addr, size_t size_to_read=512)
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