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);
327 llvm::Expected<llvm::ArrayRef<uint8_t>> mem_maybe =
334 llvm::ArrayRef<uint8_t> mem = *mem_maybe;
336 std::memcpy(buf, mem.data(), mem.size());
346 triple.setVendor(llvm::Triple::VendorType::UnknownVendor);
347 triple.setArch(llvm::Triple::ArchType::x86);
348 triple.setOS(llvm::Triple::OSType::Win32);
353 std::optional<llvm::ArrayRef<uint8_t>> auxv =
363 std::optional<llvm::ArrayRef<uint8_t>> lldb_generated_section =
365 return lldb_generated_section.has_value();
393 SectionList *sections = module_sp->GetSectionList();
394 for (
size_t i = 0; i < sections->
GetSize(); ++i) {
400 section_sp->GetByteSize());
406 to_add.emplace_back();
407 to_add.back().GetRange() = section_range;
408 to_add.back().SetLLDBPermissions(section_sp->GetPermissions());
410 to_add.back().SetName(module_sp->GetFileSpec().GetPath().c_str());
438 LocationDescriptor context_location = thread.Context;
443 context_location = it->second.ThreadContext;
445 llvm::ArrayRef<uint8_t> context;
454 return new_thread_list.
GetSize(
false) > 0;
458 llvm::StringRef name,
469 const auto dmp_bytes = minidump_uuid.
GetBytes();
470 const auto mod_bytes = module_sp->GetUUID().GetBytes();
471 const bool match = dmp_bytes.empty() || mod_bytes.empty() ||
472 mod_bytes.take_front(dmp_bytes.size()) == dmp_bytes;
474 LLDB_LOG(log,
"Partial uuid match for {0}.", name);
485 std::vector<uint8_t> breakpad_uuid;
486 std::vector<uint8_t> facebook_uuid;
487 HashElfTextSection(module_sp, breakpad_uuid, facebook_uuid);
488 if (dmp_bytes == llvm::ArrayRef<uint8_t>(breakpad_uuid)) {
489 LLDB_LOG(log,
"Breakpad .text hash match for {0}.", name);
492 if (dmp_bytes == llvm::ArrayRef<uint8_t>(facebook_uuid)) {
493 LLDB_LOG(log,
"Facebook .text hash match for {0}.", name);
505 std::vector<const minidump::Module *> filtered_modules =
510 for (
auto module : filtered_modules) {
512 module->ModuleNameRVA));
513 const uint64_t load_addr =
module->BaseOfImage;
514 const uint64_t load_size =
module->SizeOfImage;
515 LLDB_LOG(log,
"found module: name: {0} {1:x10}-{2:x10} size: {3}", name,
516 load_addr, load_addr + load_size, load_size);
520 if (llvm::StringRef(name).ends_with_insensitive(
"wow64.dll")) {
534 LLDB_LOG(log,
"Full uuid match for {0}.", name);
555 auto *objfile = module_sp->GetObjectFile();
557 objfile->GetPluginName() ==
573 "Unable to locate the matching object file, creating a "
574 "placeholder module for: {0}",
578 module_spec, load_addr, load_size);
587 bool load_addr_changed =
false;
588 module_sp->SetLoadAddress(
GetTarget(), load_addr,
false,
599 const bool add_exe_file_as_first_arg =
false;
601 add_exe_file_as_first_arg);
617#define INIT_BOOL(VAR, LONG, SHORT, DESC) \
618 VAR(LLDB_OPT_SET_1, false, LONG, SHORT, DESC, false, true)
619#define APPEND_OPT(VAR) \
620 m_option_group.Append(&VAR, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1)
652 if (
m_dump_all.GetOptionValue().GetCurrentValue() ||
654 m_fb_all.GetOptionValue().GetCurrentValue() ||
674 m_fb_abort.GetOptionValue().GetCurrentValue() ||
679 m_dump_all.GetOptionValue().SetCurrentValue(
true);
682 return m_dump_all.GetOptionValue().GetCurrentValue();
770 "Dump information from the minidump file.", nullptr),
773 "Dump the everything in the minidump."),
775 "Dump the minidump directory map."),
777 "Dump linux /proc/cpuinfo."),
779 "Dump linux /proc/<pid>/status."),
781 "Dump linux /etc/lsb-release."),
783 "Dump linux /proc/<pid>/cmdline."),
785 "Dump linux /proc/<pid>/environ."),
787 "Dump linux /proc/<pid>/auxv."),
789 "Dump linux /proc/<pid>/maps."),
791 "Dump linux /proc/<pid>/stat."),
793 "Dump linux process uptime."),
795 "Dump linux /proc/<pid>/fd."),
797 "Dump all linux streams."),
799 "Dump Facebook application custom data."),
801 "Dump the Facebook build ID."),
803 "Dump Facebook application version string."),
805 "Dump Facebook java stack."),
807 "Dump Facebook Dalvik info."),
809 "Dump Facebook unwind symbols."),
811 "Dump Facebook error log."),
813 "Dump Facebook java stack."),
815 "Dump Facebook abort reason."),
817 "Dump Facebook thread name."),
819 "Dump Facebook logcat."),
868 s.
Printf(
"RVA SIZE TYPE StreamType\n");
869 s.
Printf(
"---------- ---------- ---------- --------------------------\n");
870 for (
const auto &stream_desc :
minidump.GetMinidumpFile().streams())
872 "0x%8.8x 0x%8.8x 0x%8.8x %s\n", (uint32_t)stream_desc.Location.RVA,
873 (uint32_t)stream_desc.Location.DataSize,
874 (
unsigned)(StreamType)stream_desc.Type,
878 auto DumpTextStream = [&](StreamType stream_type,
879 llvm::StringRef label) ->
void {
880 auto bytes =
minidump.GetStream(stream_type);
881 if (!bytes.empty()) {
884 s.
Printf(
"%s:\n%s\n\n", label.data(), bytes.data());
887 auto DumpBinaryStream = [&](StreamType stream_type,
888 llvm::StringRef label) ->
void {
889 auto bytes =
minidump.GetStream(stream_type);
890 if (!bytes.empty()) {
893 s.
Printf(
"%s:\n", label.data());
897 bytes.size(), 16, 0, 0, 0);
903 DumpTextStream(StreamType::LinuxCPUInfo,
"/proc/cpuinfo");
905 DumpTextStream(StreamType::LinuxProcStatus,
"/proc/PID/status");
907 DumpTextStream(StreamType::LinuxLSBRelease,
"/etc/lsb-release");
909 DumpTextStream(StreamType::LinuxCMDLine,
"/proc/PID/cmdline");
911 DumpTextStream(StreamType::LinuxEnviron,
"/proc/PID/environ");
913 DumpBinaryStream(StreamType::LinuxAuxv,
"/proc/PID/auxv");
915 DumpTextStream(StreamType::LinuxMaps,
"/proc/PID/maps");
917 DumpTextStream(StreamType::LinuxProcStat,
"/proc/PID/stat");
919 DumpTextStream(StreamType::LinuxProcUptime,
"uptime");
921 DumpTextStream(StreamType::LinuxProcFD,
"/proc/PID/fd");
923 DumpTextStream(StreamType::FacebookAppCustomData,
924 "Facebook App Data");
926 auto bytes =
minidump.GetStream(StreamType::FacebookBuildID);
927 if (bytes.size() >= 4) {
931 uint32_t build_id = data.
GetU32(&offset);
932 s.
Printf(
"Facebook Build ID:\n");
933 s.
Printf(
"%u\n", build_id);
938 DumpTextStream(StreamType::FacebookAppVersionName,
939 "Facebook Version String");
941 DumpTextStream(StreamType::FacebookJavaStack,
942 "Facebook Java Stack");
944 DumpTextStream(StreamType::FacebookDalvikInfo,
945 "Facebook Dalvik Info");
947 DumpBinaryStream(StreamType::FacebookUnwindSymbols,
948 "Facebook Unwind Symbols Bytes");
950 DumpTextStream(StreamType::FacebookDumpErrorLog,
951 "Facebook Error Log");
953 DumpTextStream(StreamType::FacebookAppStateLog,
954 "Faceook Application State Log");
956 DumpTextStream(StreamType::FacebookAbortReason,
957 "Facebook Abort Reason");
959 DumpTextStream(StreamType::FacebookThreadName,
960 "Facebook Thread Name");
962 DumpTextStream(StreamType::FacebookLogcat,
"Facebook Logcat");
970 "Commands for operating on a ProcessMinidump process.",
971 "process plugin <subcommand> [<subcommand-options>]") {
981 m_command_sp = std::make_shared<CommandObjectMultiwordProcessMinidump>(
982 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()
A uniqued constant string class.
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)
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(ConstString section_dstr) 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)
size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size, Status &error) override
Actually do the reading of memory from a process.
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.
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(lldb::addr_t 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