35#include "llvm/BinaryFormat/Magic.h"
36#include "llvm/Support/MemoryBuffer.h"
37#include "llvm/Support/Threading.h"
76void HashElfTextSection(
ModuleSP module_sp, std::vector<uint8_t> &breakpad_uuid,
77 std::vector<uint8_t> &facebook_uuid) {
78 SectionList *sect_list = module_sp->GetSectionList();
79 if (sect_list ==
nullptr)
84 constexpr size_t kMDGUIDSize = 16;
85 constexpr size_t kBreakpadPageSize = 4096;
90 const size_t text_size = sect_sp->GetFileSize();
91 const size_t read_size = std::min<size_t>(
92 llvm::alignTo(text_size, kMDGUIDSize), kBreakpadPageSize);
93 sect_sp->GetObjectFile()->GetData(sect_sp->GetFileOffset(), read_size, data);
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;
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) {
175 static llvm::once_flag g_once_flag;
177 llvm::call_once(g_once_flag, []() {
190 if (!expected_parser)
199 case llvm::Triple::x86:
200 case llvm::Triple::x86_64:
201 case llvm::Triple::arm:
202 case llvm::Triple::aarch64:
215 for (
auto exception_stream : exception_stream_it) {
218 if (!exception_stream)
222 .try_emplace(exception_stream->ThreadId, exception_stream.get())
225 "Duplicate exception stream for tid {0}", exception_stream->ThreadId);
237 "setting process ID to 1",
251 constexpr uint32_t BreakpadDumpRequested = 0xFFFFFFFF;
252 if (exception_stream.ExceptionRecord.ExceptionCode ==
253 BreakpadDumpRequested) {
273 if (arch.
GetTriple().getOS() == llvm::Triple::Linux) {
274 uint32_t signo = exception_stream.ExceptionRecord.ExceptionCode;
279 const char *description =
nullptr;
280 if (exception_stream.ExceptionRecord.ExceptionFlags ==
281 llvm::minidump::Exception::LLDB_FLAG)
282 description =
reinterpret_cast<const char *
>(
283 exception_stream.ExceptionRecord.ExceptionInformation);
285 llvm::StringRef description_str(description,
286 Exception::MaxParameterBytes);
288 *stop_thread, signo, description_str.str().c_str());
289 }
else if (arch.
GetTriple().getVendor() == llvm::Triple::Apple) {
291 *stop_thread, exception_stream.ExceptionRecord.ExceptionCode, 2,
292 exception_stream.ExceptionRecord.ExceptionFlags,
293 exception_stream.ExceptionRecord.ExceptionAddress, 0);
296 llvm::raw_string_ostream desc_stream(desc);
297 desc_stream <<
"Exception "
299 exception_stream.ExceptionRecord.ExceptionCode, 8)
300 <<
" encountered at address "
302 exception_stream.ExceptionRecord.ExceptionAddress, 8);
307 stop_thread->SetStopInfo(stop_info);
325 llvm::Expected<llvm::ArrayRef<uint8_t>> mem_maybe =
332 llvm::ArrayRef<uint8_t> mem = *mem_maybe;
334 std::memcpy(buf, mem.data(), mem.size());
344 triple.setVendor(llvm::Triple::VendorType::UnknownVendor);
345 triple.setArch(llvm::Triple::ArchType::x86);
346 triple.setOS(llvm::Triple::OSType::Win32);
351 std::optional<llvm::ArrayRef<uint8_t>> auxv =
361 std::optional<llvm::ArrayRef<uint8_t>> lldb_generated_section =
363 return lldb_generated_section.has_value();
391 SectionList *sections = module_sp->GetSectionList();
392 for (
size_t i = 0; i < sections->
GetSize(); ++i) {
398 section_sp->GetByteSize());
404 to_add.emplace_back();
405 to_add.back().GetRange() = section_range;
406 to_add.back().SetLLDBPermissions(section_sp->GetPermissions());
408 to_add.back().SetName(module_sp->GetFileSpec().GetPath().c_str());
436 LocationDescriptor context_location = thread.Context;
441 context_location = it->second.ThreadContext;
443 llvm::ArrayRef<uint8_t> context;
452 return new_thread_list.
GetSize(
false) > 0;
456 llvm::StringRef name,
467 const auto dmp_bytes = minidump_uuid.
GetBytes();
468 const auto mod_bytes = module_sp->GetUUID().GetBytes();
469 const bool match = dmp_bytes.empty() || mod_bytes.empty() ||
470 mod_bytes.take_front(dmp_bytes.size()) == dmp_bytes;
472 LLDB_LOG(log,
"Partial uuid match for {0}.", name);
483 std::vector<uint8_t> breakpad_uuid;
484 std::vector<uint8_t> facebook_uuid;
485 HashElfTextSection(module_sp, breakpad_uuid, facebook_uuid);
486 if (dmp_bytes == llvm::ArrayRef<uint8_t>(breakpad_uuid)) {
487 LLDB_LOG(log,
"Breakpad .text hash match for {0}.", name);
490 if (dmp_bytes == llvm::ArrayRef<uint8_t>(facebook_uuid)) {
491 LLDB_LOG(log,
"Facebook .text hash match for {0}.", name);
503 std::vector<const minidump::Module *> filtered_modules =
508 for (
auto module : filtered_modules) {
510 module->ModuleNameRVA));
511 const uint64_t load_addr =
module->BaseOfImage;
512 const uint64_t load_size =
module->SizeOfImage;
513 LLDB_LOG(log,
"found module: name: {0} {1:x10}-{2:x10} size: {3}", name,
514 load_addr, load_addr + load_size, load_size);
518 if (llvm::StringRef(name).ends_with_insensitive(
"wow64.dll")) {
532 LLDB_LOG(log,
"Full uuid match for {0}.", name);
553 auto *objfile = module_sp->GetObjectFile();
555 objfile->GetPluginName() ==
571 "Unable to locate the matching object file, creating a "
572 "placeholder module for: {0}",
576 module_spec, load_addr, load_size);
585 bool load_addr_changed =
false;
586 module_sp->SetLoadAddress(
GetTarget(), load_addr,
false,
597 const bool add_exe_file_as_first_arg =
false;
599 add_exe_file_as_first_arg);
615#define INIT_BOOL(VAR, LONG, SHORT, DESC) \
616 VAR(LLDB_OPT_SET_1, false, LONG, SHORT, DESC, false, true)
617#define APPEND_OPT(VAR) \
618 m_option_group.Append(&VAR, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1)
650 if (
m_dump_all.GetOptionValue().GetCurrentValue() ||
652 m_fb_all.GetOptionValue().GetCurrentValue() ||
672 m_fb_abort.GetOptionValue().GetCurrentValue() ||
677 m_dump_all.GetOptionValue().SetCurrentValue(
true);
680 return m_dump_all.GetOptionValue().GetCurrentValue();
768 "Dump information from the minidump file.", nullptr),
771 "Dump the everything in the minidump."),
773 "Dump the minidump directory map."),
775 "Dump linux /proc/cpuinfo."),
777 "Dump linux /proc/<pid>/status."),
779 "Dump linux /etc/lsb-release."),
781 "Dump linux /proc/<pid>/cmdline."),
783 "Dump linux /proc/<pid>/environ."),
785 "Dump linux /proc/<pid>/auxv."),
787 "Dump linux /proc/<pid>/maps."),
789 "Dump linux /proc/<pid>/stat."),
791 "Dump linux process uptime."),
793 "Dump linux /proc/<pid>/fd."),
795 "Dump all linux streams."),
797 "Dump Facebook application custom data."),
799 "Dump the Facebook build ID."),
801 "Dump Facebook application version string."),
803 "Dump Facebook java stack."),
805 "Dump Facebook Dalvik info."),
807 "Dump Facebook unwind symbols."),
809 "Dump Facebook error log."),
811 "Dump Facebook java stack."),
813 "Dump Facebook abort reason."),
815 "Dump Facebook thread name."),
817 "Dump Facebook logcat."),
866 s.
Printf(
"RVA SIZE TYPE StreamType\n");
867 s.
Printf(
"---------- ---------- ---------- --------------------------\n");
868 for (
const auto &stream_desc :
minidump.GetMinidumpFile().streams())
870 "0x%8.8x 0x%8.8x 0x%8.8x %s\n", (uint32_t)stream_desc.Location.RVA,
871 (uint32_t)stream_desc.Location.DataSize,
872 (
unsigned)(StreamType)stream_desc.Type,
876 auto DumpTextStream = [&](StreamType stream_type,
877 llvm::StringRef label) ->
void {
878 auto bytes =
minidump.GetStream(stream_type);
879 if (!bytes.empty()) {
882 s.
Printf(
"%s:\n%s\n\n", label.data(), bytes.data());
885 auto DumpBinaryStream = [&](StreamType stream_type,
886 llvm::StringRef label) ->
void {
887 auto bytes =
minidump.GetStream(stream_type);
888 if (!bytes.empty()) {
891 s.
Printf(
"%s:\n", label.data());
895 bytes.size(), 16, 0, 0, 0);
901 DumpTextStream(StreamType::LinuxCPUInfo,
"/proc/cpuinfo");
903 DumpTextStream(StreamType::LinuxProcStatus,
"/proc/PID/status");
905 DumpTextStream(StreamType::LinuxLSBRelease,
"/etc/lsb-release");
907 DumpTextStream(StreamType::LinuxCMDLine,
"/proc/PID/cmdline");
909 DumpTextStream(StreamType::LinuxEnviron,
"/proc/PID/environ");
911 DumpBinaryStream(StreamType::LinuxAuxv,
"/proc/PID/auxv");
913 DumpTextStream(StreamType::LinuxMaps,
"/proc/PID/maps");
915 DumpTextStream(StreamType::LinuxProcStat,
"/proc/PID/stat");
917 DumpTextStream(StreamType::LinuxProcUptime,
"uptime");
919 DumpTextStream(StreamType::LinuxProcFD,
"/proc/PID/fd");
921 DumpTextStream(StreamType::FacebookAppCustomData,
922 "Facebook App Data");
924 auto bytes =
minidump.GetStream(StreamType::FacebookBuildID);
925 if (bytes.size() >= 4) {
929 uint32_t build_id = data.
GetU32(&offset);
930 s.
Printf(
"Facebook Build ID:\n");
931 s.
Printf(
"%u\n", build_id);
936 DumpTextStream(StreamType::FacebookAppVersionName,
937 "Facebook Version String");
939 DumpTextStream(StreamType::FacebookJavaStack,
940 "Facebook Java Stack");
942 DumpTextStream(StreamType::FacebookDalvikInfo,
943 "Facebook Dalvik Info");
945 DumpBinaryStream(StreamType::FacebookUnwindSymbols,
946 "Facebook Unwind Symbols Bytes");
948 DumpTextStream(StreamType::FacebookDumpErrorLog,
949 "Facebook Error Log");
951 DumpTextStream(StreamType::FacebookAppStateLog,
952 "Faceook Application State Log");
954 DumpTextStream(StreamType::FacebookAbortReason,
955 "Facebook Abort Reason");
957 DumpTextStream(StreamType::FacebookThreadName,
958 "Facebook Thread Name");
960 DumpTextStream(StreamType::FacebookLogcat,
"Facebook Logcat");
968 "Commands for operating on a ProcessMinidump process.",
969 "process plugin <subcommand> [<subcommand-options>]") {
979 m_command_sp = std::make_shared<CommandObjectMultiwordProcessMinidump>(
980 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_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.
OptionalBool 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::Module > ModuleSP
BaseType GetRangeBase() const
BaseType GetRangeEnd() const