35#include "llvm/BinaryFormat/Magic.h"
36#include "llvm/Support/MemoryBuffer.h"
75void HashElfTextSection(
ModuleSP module_sp, std::vector<uint8_t> &breakpad_uuid,
76 std::vector<uint8_t> &facebook_uuid) {
77 SectionList *sect_list = module_sp->GetSectionList();
78 if (sect_list ==
nullptr)
83 constexpr size_t kMDGUIDSize = 16;
84 constexpr size_t kBreakpadPageSize = 4096;
89 const size_t text_size = sect_sp->GetFileSize();
90 const size_t read_size = std::min<size_t>(
91 llvm::alignTo(text_size, kMDGUIDSize), kBreakpadPageSize);
92 sect_sp->GetObjectFile()->GetData(sect_sp->GetFileOffset(), read_size,
95 breakpad_uuid.assign(kMDGUIDSize, 0);
96 facebook_uuid.assign(kMDGUIDSize, 0);
101 for (
size_t i = 0; i < kMDGUIDSize; i++)
102 facebook_uuid[i] ^= text_size % 255;
108 const uint8_t *ptr = extractor_sp->GetDataStart();
109 const uint8_t *ptr_end = extractor_sp->GetDataEnd();
110 while (ptr < ptr_end) {
111 for (
unsigned i = 0; i < kMDGUIDSize; i++) {
112 breakpad_uuid[i] ^= ptr[i];
113 facebook_uuid[i] ^= ptr[i];
122 return "Minidump plug-in.";
129 if (!crash_file || can_connect)
134 constexpr size_t header_size =
sizeof(Header);
140 lldbassert(DataPtr->GetByteSize() == header_size);
141 if (identify_magic(toStringRef(DataPtr->GetData())) != llvm::file_magic::minidump)
149 return std::make_shared<ProcessMinidump>(target_sp, listener_sp, *crash_file,
154 bool plugin_specified_by_name) {
186 if (!expected_parser)
195 case llvm::Triple::x86:
196 case llvm::Triple::x86_64:
197 case llvm::Triple::arm:
198 case llvm::Triple::aarch64:
211 for (
auto exception_stream_or_err : exception_stream_it) {
214 if (!exception_stream_or_err) {
216 exception_stream_or_err.takeError(),
217 "failed to read exception stream: {0}");
220 const llvm::minidump::ExceptionStream &exception_stream =
221 *exception_stream_or_err;
224 .try_emplace(exception_stream.ThreadId, exception_stream)
227 "Duplicate exception stream for tid {0}", exception_stream.ThreadId);
239 "setting process ID to 1",
253 constexpr uint32_t BreakpadDumpRequested = 0xFFFFFFFF;
254 if (exception_stream.ExceptionRecord.ExceptionCode ==
255 BreakpadDumpRequested) {
275 if (arch.
GetTriple().getOS() == llvm::Triple::Linux) {
276 uint32_t signo = exception_stream.ExceptionRecord.ExceptionCode;
281 const char *description =
nullptr;
282 if (exception_stream.ExceptionRecord.ExceptionFlags ==
283 llvm::minidump::Exception::LLDB_FLAG)
284 description =
reinterpret_cast<const char *
>(
285 exception_stream.ExceptionRecord.ExceptionInformation);
287 llvm::StringRef description_str(description,
288 Exception::MaxParameterBytes);
290 *stop_thread, signo, description_str.str().c_str());
291 }
else if (arch.
GetTriple().getVendor() == llvm::Triple::Apple) {
293 *stop_thread, exception_stream.ExceptionRecord.ExceptionCode, 2,
294 exception_stream.ExceptionRecord.ExceptionFlags,
295 exception_stream.ExceptionRecord.ExceptionAddress, 0);
298 llvm::raw_string_ostream desc_stream(desc);
299 desc_stream <<
"Exception "
301 exception_stream.ExceptionRecord.ExceptionCode, 8)
302 <<
" encountered at address "
304 exception_stream.ExceptionRecord.ExceptionAddress, 8);
309 stop_thread->SetStopInfo(stop_info);
329 llvm::Expected<llvm::ArrayRef<uint8_t>> mem_maybe =
336 llvm::ArrayRef<uint8_t> mem = *mem_maybe;
338 std::memcpy(buf, mem.data(), mem.size());
348 triple.setVendor(llvm::Triple::VendorType::UnknownVendor);
349 triple.setArch(llvm::Triple::ArchType::x86);
350 triple.setOS(llvm::Triple::OSType::Win32);
355 std::optional<llvm::ArrayRef<uint8_t>> auxv =
365 std::optional<llvm::ArrayRef<uint8_t>> lldb_generated_section =
367 return lldb_generated_section.has_value();
395 SectionList *sections = module_sp->GetSectionList();
396 for (
size_t i = 0; i < sections->
GetSize(); ++i) {
402 section_sp->GetByteSize());
408 to_add.emplace_back();
409 to_add.back().GetRange() = section_range;
410 to_add.back().SetLLDBPermissions(section_sp->GetPermissions());
412 to_add.back().SetName(module_sp->GetFileSpec().GetPath().c_str());
440 LocationDescriptor context_location = thread.Context;
445 context_location = it->second.ThreadContext;
447 llvm::ArrayRef<uint8_t> context;
456 return new_thread_list.
GetSize(
false) > 0;
460 llvm::StringRef name,
471 const auto dmp_bytes = minidump_uuid.
GetBytes();
472 const auto mod_bytes = module_sp->GetUUID().GetBytes();
473 const bool match = dmp_bytes.empty() || mod_bytes.empty() ||
474 mod_bytes.take_front(dmp_bytes.size()) == dmp_bytes;
476 LLDB_LOG(log,
"Partial uuid match for {0}.", name);
487 std::vector<uint8_t> breakpad_uuid;
488 std::vector<uint8_t> facebook_uuid;
489 HashElfTextSection(module_sp, breakpad_uuid, facebook_uuid);
490 if (dmp_bytes == llvm::ArrayRef<uint8_t>(breakpad_uuid)) {
491 LLDB_LOG(log,
"Breakpad .text hash match for {0}.", name);
494 if (dmp_bytes == llvm::ArrayRef<uint8_t>(facebook_uuid)) {
495 LLDB_LOG(log,
"Facebook .text hash match for {0}.", name);
507 std::vector<const minidump::Module *> filtered_modules =
512 for (
auto module : filtered_modules) {
514 module->ModuleNameRVA));
515 const uint64_t load_addr =
module->BaseOfImage;
516 const uint64_t load_size =
module->SizeOfImage;
517 LLDB_LOG(log,
"found module: name: {0} {1:x10}-{2:x10} size: {3}", name,
518 load_addr, load_addr + load_size, load_size);
522 if (llvm::StringRef(name).ends_with_insensitive(
"wow64.dll")) {
536 LLDB_LOG(log,
"Full uuid match for {0}.", name);
557 auto *objfile = module_sp->GetObjectFile();
559 objfile->GetPluginName() ==
575 "Unable to locate the matching object file, creating a "
576 "placeholder module for: {0}",
580 module_spec, load_addr, load_size);
589 bool load_addr_changed =
false;
590 module_sp->SetLoadAddress(
GetTarget(), load_addr,
false,
601 const bool add_exe_file_as_first_arg =
false;
603 add_exe_file_as_first_arg);
619#define INIT_BOOL(VAR, LONG, SHORT, DESC) \
620 VAR(LLDB_OPT_SET_1, false, LONG, SHORT, DESC, false, true)
621#define APPEND_OPT(VAR) \
622 m_option_group.Append(&VAR, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1)
654 if (
m_dump_all.GetOptionValue().GetCurrentValue() ||
656 m_fb_all.GetOptionValue().GetCurrentValue() ||
676 m_fb_abort.GetOptionValue().GetCurrentValue() ||
681 m_dump_all.GetOptionValue().SetCurrentValue(
true);
684 return m_dump_all.GetOptionValue().GetCurrentValue();
772 "Dump information from the minidump file.", nullptr),
775 "Dump the everything in the minidump."),
777 "Dump the minidump directory map."),
779 "Dump linux /proc/cpuinfo."),
781 "Dump linux /proc/<pid>/status."),
783 "Dump linux /etc/lsb-release."),
785 "Dump linux /proc/<pid>/cmdline."),
787 "Dump linux /proc/<pid>/environ."),
789 "Dump linux /proc/<pid>/auxv."),
791 "Dump linux /proc/<pid>/maps."),
793 "Dump linux /proc/<pid>/stat."),
795 "Dump linux process uptime."),
797 "Dump linux /proc/<pid>/fd."),
799 "Dump all linux streams."),
801 "Dump Facebook application custom data."),
803 "Dump the Facebook build ID."),
805 "Dump Facebook application version string."),
807 "Dump Facebook java stack."),
809 "Dump Facebook Dalvik info."),
811 "Dump Facebook unwind symbols."),
813 "Dump Facebook error log."),
815 "Dump Facebook java stack."),
817 "Dump Facebook abort reason."),
819 "Dump Facebook thread name."),
821 "Dump Facebook logcat."),
870 s.
Printf(
"RVA SIZE TYPE StreamType\n");
871 s.
Printf(
"---------- ---------- ---------- --------------------------\n");
872 for (
const auto &stream_desc :
minidump.GetMinidumpFile().streams())
874 "0x%8.8x 0x%8.8x 0x%8.8x %s\n", (uint32_t)stream_desc.Location.RVA,
875 (uint32_t)stream_desc.Location.DataSize,
876 (
unsigned)(StreamType)stream_desc.Type,
880 auto DumpTextStream = [&](StreamType stream_type,
881 llvm::StringRef label) ->
void {
882 auto bytes =
minidump.GetStream(stream_type);
883 if (!bytes.empty()) {
886 s.
Printf(
"%s:\n%s\n\n", label.data(), bytes.data());
889 auto DumpBinaryStream = [&](StreamType stream_type,
890 llvm::StringRef label) ->
void {
891 auto bytes =
minidump.GetStream(stream_type);
892 if (!bytes.empty()) {
895 s.
Printf(
"%s:\n", label.data());
899 bytes.size(), 16, 0, 0, 0);
905 DumpTextStream(StreamType::LinuxCPUInfo,
"/proc/cpuinfo");
907 DumpTextStream(StreamType::LinuxProcStatus,
"/proc/PID/status");
909 DumpTextStream(StreamType::LinuxLSBRelease,
"/etc/lsb-release");
911 DumpTextStream(StreamType::LinuxCMDLine,
"/proc/PID/cmdline");
913 DumpTextStream(StreamType::LinuxEnviron,
"/proc/PID/environ");
915 DumpBinaryStream(StreamType::LinuxAuxv,
"/proc/PID/auxv");
917 DumpTextStream(StreamType::LinuxMaps,
"/proc/PID/maps");
919 DumpTextStream(StreamType::LinuxProcStat,
"/proc/PID/stat");
921 DumpTextStream(StreamType::LinuxProcUptime,
"uptime");
923 DumpTextStream(StreamType::LinuxProcFD,
"/proc/PID/fd");
925 DumpTextStream(StreamType::FacebookAppCustomData,
926 "Facebook App Data");
928 auto bytes =
minidump.GetStream(StreamType::FacebookBuildID);
929 if (bytes.size() >= 4) {
933 uint32_t build_id = data.
GetU32(&offset);
934 s.
Printf(
"Facebook Build ID:\n");
935 s.
Printf(
"%u\n", build_id);
940 DumpTextStream(StreamType::FacebookAppVersionName,
941 "Facebook Version String");
943 DumpTextStream(StreamType::FacebookJavaStack,
944 "Facebook Java Stack");
946 DumpTextStream(StreamType::FacebookDalvikInfo,
947 "Facebook Dalvik Info");
949 DumpBinaryStream(StreamType::FacebookUnwindSymbols,
950 "Facebook Unwind Symbols Bytes");
952 DumpTextStream(StreamType::FacebookDumpErrorLog,
953 "Facebook Error Log");
955 DumpTextStream(StreamType::FacebookAppStateLog,
956 "Faceook Application State Log");
958 DumpTextStream(StreamType::FacebookAbortReason,
959 "Facebook Abort Reason");
961 DumpTextStream(StreamType::FacebookThreadName,
962 "Facebook Thread Name");
964 DumpTextStream(StreamType::FacebookLogcat,
"Facebook Logcat");
972 "Commands for operating on a ProcessMinidump process.",
973 "process plugin <subcommand> [<subcommand-options>]") {
983 m_command_sp = std::make_shared<CommandObjectMultiwordProcessMinidump>(
984 GetTarget().GetDebugger().GetCommandInterpreter());
static void DumpDirectory(Stream &strm, const FileSpec *file_spec_ptr, uint32_t width)
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
#define LLDB_LOG_ERROR(log, error,...)
#define LLDB_PLUGIN_DEFINE(PluginName)
#define INIT_BOOL(VAR, LONG, SHORT, DESC)
CommandObjectMultiwordProcessMinidump(CommandInterpreter &interpreter)
~CommandObjectMultiwordProcessMinidump() override=default
bool DumpLinuxCMDLine() const
OptionGroupBoolean m_dump_linux_all
bool DumpFacebookAbortReason() const
bool DumpLinuxProcFD() const
OptionGroupBoolean m_fb_java_stack
bool DumpLinuxProcStatus() const
bool DumpLinuxProcStat() const
OptionGroupBoolean m_dump_directory
bool DumpFacebookAppData() const
bool DumpLinuxAuxv() const
Options * GetOptions() override
OptionGroupOptions m_option_group
OptionGroupBoolean m_fb_thread
bool DumpDirectory() const
OptionGroupBoolean m_dump_linux_lsb_release
bool DumpFacebookLogcat() const
OptionGroupBoolean m_fb_dalvik
bool DumpFacebookUnwindSymbols() const
OptionGroupBoolean m_fb_app_data
OptionGroupBoolean m_fb_logcat
OptionGroupBoolean m_dump_linux_cmdline
bool DumpFacebookBuildID() const
OptionGroupBoolean m_dump_linux_environ
OptionGroupBoolean m_dump_linux_proc_uptime
bool DumpLinuxLSBRelease() const
OptionGroupBoolean m_dump_linux_proc_stat
OptionGroupBoolean m_dump_all
OptionGroupBoolean m_dump_linux_maps
OptionGroupBoolean m_fb_app_state
OptionGroupBoolean m_fb_abort
bool DumpFacebookDalvikInfo() const
OptionGroupBoolean m_fb_build_id
OptionGroupBoolean m_dump_linux_proc_status
OptionGroupBoolean m_dump_linux_proc_fd
bool DumpLinuxMaps() const
CommandObjectProcessMinidumpDump(CommandInterpreter &interpreter)
bool DumpFacebookAppStateLog() const
bool DumpFacebook() const
OptionGroupBoolean m_dump_linux_cpuinfo
bool DumpLinuxCPUInfo() const
bool DumpFacebookThreadName() const
OptionGroupBoolean m_fb_error_log
bool DumpFacebookErrorLog() const
bool DumpFacebookVersionName() const
OptionGroupBoolean m_dump_linux_auxv
bool DumpLinuxEnviron() const
OptionGroupBoolean m_fb_version
bool DumpLinuxProcUptime() const
void SetDefaultOptionsIfNoneAreSet()
~CommandObjectProcessMinidumpDump() override=default
OptionGroupBoolean m_fb_all
OptionGroupBoolean m_fb_unwind
void DoExecute(Args &command, CommandReturnObject &result) override
bool DumpFacebookJavaStack() const
A minimal ObjectFile implementation providing a dummy object file for the cases when the real module ...
static llvm::StringRef GetPluginNameStatic()
An architecture specification class.
llvm::Triple & GetTriple()
Architecture triple accessor.
llvm::Triple::ArchType GetMachine() const
Returns a machine family for the current architecture.
const char * GetArchitectureName() const
Returns a static string representing the current architecture.
A command line argument class.
size_t GetArgumentCount() const
Gets the number of arguments left in this command object.
bool LoadSubCommand(llvm::StringRef cmd_name, const lldb::CommandObjectSP &command_obj) override
CommandObjectMultiword(CommandInterpreter &interpreter, const char *name, const char *help=nullptr, const char *syntax=nullptr, uint32_t flags=0)
friend class CommandInterpreter
CommandObjectParsed(CommandInterpreter &interpreter, const char *name, const char *help=nullptr, const char *syntax=nullptr, uint32_t flags=0)
CommandInterpreter & m_interpreter
void SetStatus(lldb::ReturnStatus status)
void AppendErrorWithFormat(const char *format,...) __attribute__((format(printf
Stream & GetOutputStream()
static void ReportWarning(std::string message, std::optional< lldb::user_id_t > debugger_id=std::nullopt, std::once_flag *once=nullptr)
Report warning events.
void ClearDirectory()
Clear the directory in this object.
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.
Class used by the Process to hold a list of its JITLoaders.
LazyBool GetMapped() const
Range< lldb::addr_t, lldb::addr_t > RangeType
A collection class for Module objects.
bool Remove(const lldb::ModuleSP &module_sp, bool notify=true)
Remove a module from the module list.
void Append(const lldb::ModuleSP &module_sp, bool notify=true)
Append a module to the module list.
void ForEach(std::function< IterationAction(const lldb::ModuleSP &module_sp)> const &callback) const
Applies 'callback' to each module in this ModuleList.
ArchSpec & GetArchitecture()
static lldb::ModuleSP CreateModuleFromObjectFile(Args &&...args)
A command line option parsing protocol class.
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)
An address in a process, qualified by an address space.
lldb::addr_t GetValue() const
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.
lldb::JITLoaderListUP m_jit_loaders_up
void SetUnixSignals(lldb::UnixSignalsSP &&signals_sp)
lldb::ByteOrder GetByteOrder() const
void SetID(lldb::pid_t new_pid)
Sets the stored pid.
uint32_t GetAddressByteSize() const
virtual DynamicLoader * GetDynamicLoader()
Get the dynamic loader plug-in for this process.
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.
friend class DynamicLoader
Target & GetTarget()
Get the target object pointer for this module.
lldb::SectionSP FindSectionByName(llvm::StringRef section_name) const
lldb::SectionSP GetSectionAtIndex(size_t idx) const
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status static Status FromErrorStringWithFormatv(const char *format, Args &&...args)
static Status FromError(llvm::Error error)
Avoid using this in new code. Migrate APIs to llvm::Expected instead.
static lldb::StopInfoSP CreateStopReasonWithMachException(Thread &thread, uint32_t exc_type, uint32_t exc_data_count, uint64_t exc_code, uint64_t exc_sub_code, uint64_t exc_sub_sub_code, bool pc_already_adjusted=true, bool adjust_pc_if_needed=false)
static lldb::StopInfoSP CreateStopReasonWithSignal(Thread &thread, int signo, const char *description=nullptr, std::optional< int > code=std::nullopt)
static lldb::StopInfoSP CreateStopReasonWithException(Thread &thread, const char *description)
A stream class that can stream formatted output to a file.
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
lldb::addr_t GetSectionLoadAddress(const lldb::SectionSP §ion_sp)
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 ModuleList & GetImages() const
Get accessor for the images for this process.
void SetExecutableModule(lldb::ModuleSP &module_sp, LoadDependentFiles load_dependent_files=eLoadDependentsDefault)
Set the main executable module.
bool MergeArchitecture(const ArchSpec &arch_spec)
void AddThread(const lldb::ThreadSP &thread_sp)
uint32_t GetSize(bool can_update=true)
Represents UUID's of various sizes.
llvm::ArrayRef< uint8_t > GetBytes() const
static lldb::UnixSignalsSP Create(const ArchSpec &arch)
static MemoryRegionInfo GetMemoryRegionInfo(const MemoryRegionInfos ®ions, lldb::addr_t load_addr)
static llvm::Expected< MinidumpParser > Create(const lldb::DataBufferSP &data_buf_sp)
static llvm::StringRef GetStreamTypeAsString(StreamType stream_type)
void BuildMemoryRegions()
bool DoUpdateThreadList(ThreadList &old_thread_list, ThreadList &new_thread_list) override
Update the thread list following process plug-in's specific logic.
~ProcessMinidump() override
lldb::DataBufferSP m_core_data
bool GetProcessInfo(ProcessInstanceInfo &info) override
static llvm::StringRef GetPluginNameStatic()
ProcessMinidump(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, const FileSpec &core_file, lldb::DataBufferSP code_data)
bool IsAlive() override
Check if a process is still alive.
lldb::ModuleSP GetOrCreateModule(lldb_private::UUID minidump_uuid, llvm::StringRef name, lldb_private::ModuleSpec module_spec)
lldb::CommandObjectSP m_command_sp
ArchSpec GetArchitecture()
CommandObject * GetPluginCommandObject() override
Return a multi-word command object that can be used to expose plug-in specific commands.
Status GetMemoryRegions(lldb_private::MemoryRegionInfos ®ion_list) override
Obtain all the mapped memory regions within this process.
size_t DoReadMemory(const ProcessAddress &addr, void *buf, size_t size, Status &error) override
Actually do the reading of memory from a process.
Status DoDestroy() override
std::optional< MemoryRegionInfos > m_memory_regions
static llvm::StringRef GetPluginDescriptionStatic()
static lldb::ProcessSP CreateInstance(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, const FileSpec *crash_file_path, bool can_connect)
bool WarnBeforeDetach() const override
Before lldb detaches from a process, it warns the user that they are about to lose their debug sessio...
llvm::ArrayRef< minidump::Thread > m_thread_list
lldb_private::DataExtractor GetAuxvData() override
std::unordered_map< uint32_t, const minidump::ExceptionStream > m_exceptions_by_tid
DynamicLoader * GetDynamicLoader() override
Get the dynamic loader plug-in for this process.
bool CanDebug(lldb::TargetSP target_sp, bool plugin_specified_by_name) override
Check if a plug-in instance can debug the file in module.
Status DoLoadCore() override
Status DoGetMemoryRegionInfo(lldb::addr_t load_addr, MemoryRegionInfo &range_info) override
DoGetMemoryRegionInfo is called by GetMemoryRegionInfo after it has removed non address bits from loa...
void RefreshStateAfterStop() override
Currently called as part of ShouldStop.
std::optional< MinidumpParser > m_minidump_parser
size_t ReadMemory(const ProcessAddress &addr, void *buf, size_t size, Status &error) override
Read of memory from a process.
JITLoaderList & GetJITLoaders() override
#define LLDB_INVALID_ADDRESS
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.
lldb::offset_t DumpDataExtractor(const DataExtractor &DE, Stream *s, lldb::offset_t offset, lldb::Format item_format, size_t item_byte_size, size_t item_count, size_t num_per_line, uint64_t base_addr, uint32_t item_bit_size, uint32_t item_bit_offset, ExecutionContextScope *exe_scope=nullptr, bool show_memory_tags=false)
Dumps item_count objects into the stream s.
std::shared_ptr< lldb_private::Thread > ThreadSP
std::shared_ptr< lldb_private::CommandObject > CommandObjectSP
std::shared_ptr< lldb_private::Process > ProcessSP
@ eReturnStatusSuccessFinishResult
std::shared_ptr< lldb_private::Listener > ListenerSP
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
std::shared_ptr< lldb_private::StopInfo > StopInfoSP
std::shared_ptr< lldb_private::Section > SectionSP
std::shared_ptr< lldb_private::Target > TargetSP
std::shared_ptr< lldb_private::DataExtractor > DataExtractorSP
std::shared_ptr< lldb_private::Module > ModuleSP
BaseType GetRangeBase() const
BaseType GetRangeEnd() const