14#include "llvm/ADT/ScopeExit.h"
15#include "llvm/Support/ScopedPrinter.h"
16#include "llvm/Support/Threading.h"
80using namespace std::chrono;
83 :
public Cloneable<ProcessOptionValueProperties, OptionValueProperties> {
99 if (
this != instance_properties)
111 "Continue tracing the parent process and detach the child.",
116 "Trace the child process and detach the parent.",
120#define LLDB_PROPERTIES_process
121#include "TargetProperties.inc"
124#define LLDB_PROPERTIES_process
125#include "TargetPropertiesEnum.inc"
129#define LLDB_PROPERTIES_process_experimental
130#include "TargetProperties.inc"
133#define LLDB_PROPERTIES_process_experimental
134#include "TargetPropertiesEnum.inc"
138 :
public Cloneable<ProcessExperimentalOptionValueProperties,
139 OptionValueProperties> {
155 if (process ==
nullptr) {
157 m_collection_sp = std::make_shared<ProcessOptionValueProperties>(
"process");
160 "thread",
"Settings specific to threads.",
true,
166 ePropertyPythonOSPluginPath,
167 [
this] {
m_process->LoadOperatingSystemPlugin(
true); });
169 ePropertyDisableLangRuntimeUnwindPlans,
174 std::make_unique<ProcessExperimentalProperties>();
177 "Experimental settings - setting these won't produce "
178 "errors if the setting is not present.",
185 const uint32_t idx = ePropertyDisableMemCache;
187 idx, g_process_properties[idx].default_uint_value != 0);
191 const uint32_t idx = ePropertyMemCacheLineSize;
193 idx, g_process_properties[idx].default_uint_value);
198 const uint32_t idx = ePropertyExtraStartCommand;
204 const uint32_t idx = ePropertyExtraStartCommand;
209 const uint32_t idx = ePropertyPythonOSPluginPath;
214 const uint32_t idx = ePropertyVirtualAddressableBits;
216 idx, g_process_properties[idx].default_uint_value);
220 const uint32_t idx = ePropertyVirtualAddressableBits;
225 const uint32_t idx = ePropertyHighmemVirtualAddressableBits;
227 idx, g_process_properties[idx].default_uint_value);
231 const uint32_t idx = ePropertyHighmemVirtualAddressableBits;
236 const uint32_t idx = ePropertyPythonOSPluginPath;
241 const uint32_t idx = ePropertyIgnoreBreakpointsInExpressions;
243 idx, g_process_properties[idx].default_uint_value != 0);
247 const uint32_t idx = ePropertyIgnoreBreakpointsInExpressions;
252 const uint32_t idx = ePropertyUnwindOnErrorInExpressions;
254 idx, g_process_properties[idx].default_uint_value != 0);
258 const uint32_t idx = ePropertyUnwindOnErrorInExpressions;
263 const uint32_t idx = ePropertyStopOnSharedLibraryEvents;
265 idx, g_process_properties[idx].default_uint_value != 0);
269 const uint32_t idx = ePropertyStopOnSharedLibraryEvents;
274 const uint32_t idx = ePropertyDisableLangRuntimeUnwindPlans;
276 idx, g_process_properties[idx].default_uint_value != 0);
280 const uint32_t idx = ePropertyDisableLangRuntimeUnwindPlans;
288 for (
auto thread_sp :
m_process->Threads()) {
289 thread_sp->ClearStackFrames();
290 thread_sp->DiscardThreadPlans(
true);
295 const uint32_t idx = ePropertyDetachKeepsStopped;
297 idx, g_process_properties[idx].default_uint_value != 0);
301 const uint32_t idx = ePropertyDetachKeepsStopped;
306 const uint32_t idx = ePropertyWarningOptimization;
308 idx, g_process_properties[idx].default_uint_value != 0);
312 const uint32_t idx = ePropertyWarningUnsupportedLanguage;
314 idx, g_process_properties[idx].default_uint_value != 0);
318 const uint32_t idx = ePropertyStopOnExec;
320 idx, g_process_properties[idx].default_uint_value != 0);
324 const uint32_t idx = ePropertyUtilityExpressionTimeout;
326 idx, g_process_properties[idx].default_uint_value);
327 return std::chrono::seconds(value);
331 const uint32_t idx = ePropertyInterruptTimeout;
333 idx, g_process_properties[idx].default_uint_value);
334 return std::chrono::seconds(value);
338 const uint32_t idx = ePropertySteppingRunsAllThreads;
340 idx, g_process_properties[idx].default_uint_value != 0);
344 const bool fail_value =
true;
348 exp_property->
GetValue()->GetAsProperties();
354 .value_or(fail_value);
361 exp_property->
GetValue()->GetAsProperties();
368 const uint32_t idx = ePropertyFollowForkMode;
371 g_process_properties[idx].default_uint_value));
375 const uint32_t idx = ePropertyTrackMemoryCacheChanges;
377 idx, g_process_properties[idx].default_uint_value != 0);
381 llvm::StringRef plugin_name,
385 static uint32_t g_process_unique_id = 0;
389 if (!plugin_name.empty()) {
392 if (create_callback) {
393 process_sp = create_callback(target_sp, listener_sp, crash_file_path,
396 if (process_sp->CanDebug(target_sp,
true)) {
397 process_sp->m_process_unique_id = ++g_process_unique_id;
403 for (uint32_t idx = 0;
407 process_sp = create_callback(target_sp, listener_sp, crash_file_path,
410 if (process_sp->CanDebug(target_sp,
false)) {
411 process_sp->m_process_unique_id = ++g_process_unique_id;
422 static constexpr llvm::StringLiteral class_name(
"lldb.process");
435 Broadcaster((target_sp->GetDebugger().GetBroadcasterManager()),
440 "lldb.process.internal_state_broadcaster"),
442 nullptr,
"lldb.process.internal_state_control_broadcaster"),
444 Listener::MakeListener(
"lldb.process.internal_state_listener")),
468 LLDB_LOGF(log,
"%p Process::Process()",
static_cast<void *
>(
this));
506 uint64_t platform_cache_line_size =
507 target_sp->GetPlatform()->GetDefaultMemoryCacheLineSize();
508 if (!value_sp->OptionWasSet() && platform_cache_line_size != 0)
509 value_sp->SetValueAs(platform_cache_line_size);
519 LLDB_LOGF(log,
"%p Process::~Process()",
static_cast<void *
>(
this));
533 return *g_settings_ptr;
568 std::vector<Notifications> empty_notifications;
600 if (pos->baton == callbacks.
baton &&
611 std::vector<Notifications>::iterator notification_pos,
614 notification_pos != notification_end; ++notification_pos) {
615 if (notification_pos->process_state_changed)
616 notification_pos->process_state_changed(notification_pos->baton,
this,
635 std::chrono::seconds(0)) &&
649 auto Result =
m_iohandler_sync.WaitForValueNotEqualTo(iohandler_id, timeout);
655 "waited from m_iohandler_sync to change from {0}. New value is {1}.",
656 iohandler_id, *Result);
658 LLDB_LOG(log,
"timed out waiting for m_iohandler_sync to change from {0}.",
671 event_sp_ptr->reset();
679 LLDB_LOG(log,
"timeout = {0}", timeout);
684 "Process::%s returning without waiting for events; process "
685 "private and public states are already 'stopped'.",
689 if (hijack_listener_sp && use_run_lock)
697 if (event_sp_ptr && event_sp)
698 *event_sp_ptr = event_sp;
700 bool pop_process_io_handler = (hijack_listener_sp.get() !=
nullptr);
702 event_sp, stream, select_most_relevant, pop_process_io_handler);
711 if (hijack_listener_sp && use_run_lock)
720 if (hijack_listener_sp && use_run_lock)
734 bool &pop_process_io_handler) {
735 const bool handle_pop = pop_process_io_handler;
737 pop_process_io_handler =
false;
749 switch (event_state) {
757 stream->
Printf(
"Process %" PRIu64
" %s\n", process_sp->GetID(),
760 pop_process_io_handler =
true;
770 process_sp->GetStatus(*stream);
771 pop_process_io_handler =
true;
782 if (num_reasons > 0) {
785 if (num_reasons == 1) {
789 stream->
Printf(
"Process %" PRIu64
" stopped and restarted: %s\n",
791 reason ? reason :
"<UNKNOWN REASON>");
793 stream->
Printf(
"Process %" PRIu64
794 " stopped and restarted, reasons:\n",
795 process_sp->GetID());
797 for (
size_t i = 0; i < num_reasons; i++) {
801 stream->
Printf(
"\t%s\n", reason ? reason :
"<UNKNOWN REASON>");
811 ThreadList &thread_list = process_sp->GetThreadList();
812 std::lock_guard<std::recursive_mutex> guard(thread_list.
GetMutex());
816 if (curr_thread && curr_thread->IsValid())
817 curr_thread_stop_info_sp = curr_thread->GetStopInfo();
818 bool prefer_curr_thread = curr_thread_stop_info_sp &&
819 curr_thread_stop_info_sp->ShouldSelect();
821 if (!prefer_curr_thread) {
829 if (!stop_info || !stop_info->ShouldSelect())
831 StopReason thread_stop_reason = stop_info->GetStopReason();
834 plan_thread = thread;
835 }
else if (!other_thread) {
836 other_thread = thread;
841 else if (other_thread)
845 if (curr_thread && curr_thread->IsValid())
846 thread = curr_thread;
860 Debugger &debugger = process_sp->GetTarget().GetDebugger();
862 &process_sp->GetTarget()) {
863 ThreadSP thread_sp = process_sp->GetThreadList().GetSelectedThread();
865 if (!thread_sp || !thread_sp->IsValid())
868 const bool only_threads_with_stop_reason =
true;
869 const uint32_t start_frame =
870 thread_sp->GetSelectedFrameIndex(select_most_relevant);
871 const uint32_t num_frames = 1;
872 const uint32_t num_frames_with_source = 1;
873 const bool stop_format =
true;
875 process_sp->GetStatus(*stream);
876 process_sp->GetThreadStatus(*stream, only_threads_with_stop_reason,
877 start_frame, num_frames,
878 num_frames_with_source,
880 if (curr_thread_stop_info_sp) {
883 curr_thread_stop_info_sp, &crashing_address);
886 ValueObject::GetExpressionPathFormat::
887 eGetExpressionPathFormatHonorPointers;
889 valobj_sp->GetExpressionPath(*stream, format);
890 stream->
Printf(
" accessed 0x%" PRIx64
"\n", crashing_address);
895 process_sp->GetTarget().shared_from_this());
897 stream->
Printf(
"Target %d: (", target_idx);
899 stream->
Printf(
"Target <unknown index>: (");
901 stream->
Printf(
") stopped.\n");
906 pop_process_io_handler =
true;
911 if (handle_pop && pop_process_io_handler)
912 process_sp->PopProcessIOHandler();
931 LLDB_LOG(log,
"timeout = {0}, event_sp)...", timeout);
938 if (listener_sp->GetEventForBroadcasterWithType(
944 LLDB_LOG(log,
"got no event or was interrupted.");
947 LLDB_LOG(log,
"timeout = {0}, event_sp) => {1}", timeout, state);
954 LLDB_LOGF(log,
"Process::%s...", __FUNCTION__);
961 LLDB_LOGF(log,
"Process::%s (event_ptr) => %s", __FUNCTION__,
964 LLDB_LOGF(log,
"Process::%s no events found", __FUNCTION__);
974 LLDB_LOG(log,
"timeout = {0}, event_sp)...", timeout);
984 LLDB_LOG(log,
"timeout = {0}, event_sp) => {1}", timeout,
993 LLDB_LOG(log,
"timeout = {0}, event_sp)...", timeout);
1026 LLDB_LOG(log,
"(plugin = {0} status = {1} ({1:x8}), description=\"{2}\")",
1033 "(plugin = {0}) ignoring exit status because state was already set "
1045 if (
ModuleSP mod = target_sp->GetExecutableModule())
1046 module_uuid = mod->GetUUID();
1053 info->
exit_desc = {status, exit_string.str()};
1063 if (!exit_string.empty())
1107 "Process::SetProcessExitStatus (pid=%" PRIu64
1108 ", exited=%i, signal=%i, exit_status=%i)\n",
1109 pid, exited, signo, exit_status);
1114 ProcessSP process_sp(target_sp->GetProcessSP());
1116 llvm::StringRef signal_str =
1117 process_sp->GetUnixSignals()->GetSignalAsStringRef(signo);
1118 process_sp->SetExitStatus(exit_status, signal_str);
1136 bool clear_unused_threads =
true;
1139 std::lock_guard<std::recursive_mutex> guard(
m_thread_list.GetMutex());
1159 size_t num_old_threads = old_thread_list.
GetSize(
false);
1160 for (
size_t i = 0; i < num_old_threads; ++i)
1193 new_thread_list = real_thread_list;
1233 bool internal,
bool condense_trivial,
1234 bool skip_unreported_plans) {
1236 strm, tid, desc_level, internal, condense_trivial, skip_unreported_plans);
1239 bool internal,
bool condense_trivial,
1240 bool skip_unreported_plans) {
1241 m_thread_plans.DumpPlans(strm, desc_level, internal, condense_trivial,
1242 skip_unreported_plans);
1275 auto [iterator, inserted] =
1280 return iterator->second;
1292 if (new_state_is_stopped) {
1303 LLDB_LOGF(log,
"(plugin = %s, state = %s, restarted = %i)",
1314 "(plugin = %s, state = %s) -- unlocking run lock for detach",
1319 if ((old_state_is_stopped != new_state_is_stopped)) {
1320 if (new_state_is_stopped && !restarted) {
1321 LLDB_LOGF(log,
"(plugin = %s, state = %s) -- unlocking run lock",
1334 LLDB_LOGF(log,
"(plugin = %s) -- SetRunning failed, not resuming.",
1337 "resume request failed - process already running");
1340 if (!
error.Success()) {
1349 LLDB_LOGF(log,
"Process::ResumeSynchronous -- locking run lock");
1351 LLDB_LOGF(log,
"Process::Resume: -- SetRunning failed, not resuming.");
1353 "resume request failed: process already running");
1361 if (
error.Success()) {
1365 const bool must_be_alive =
1369 "process not in stopped state after synchronous resume: %s",
1385 if (!hijacking_name.starts_with(
"lldb.internal"))
1413 bool state_changed =
false;
1418 std::lock_guard<std::recursive_mutex> thread_guard(
m_thread_list.GetMutex());
1419 std::lock_guard<std::recursive_mutex> guard(
m_private_state.GetMutex());
1422 state_changed = old_state != new_state;
1426 if (old_state_is_stopped != new_state_is_stopped) {
1427 if (new_state_is_stopped)
1433 if (state_changed) {
1454 if (!
m_mod_id.IsLastResumeForUserExpression())
1455 m_mod_id.SetStopEventForLastNaturalStopID(event_sp);
1457 LLDB_LOGF(log,
"(plugin = %s, state = %s, stop_id = %u",
1464 LLDB_LOGF(log,
"(plugin = %s, state = %s) state didn't change. Ignoring...",
1470 m_mod_id.SetRunningUserExpression(on);
1474 m_mod_id.SetRunningUtilityFunction(on);
1486 std::vector<LanguageRuntime *> language_runtimes;
1489 return language_runtimes;
1499 language_runtimes.emplace_back(runtime);
1502 return language_runtimes;
1512 LanguageRuntimeCollection::iterator pos;
1519 runtime = runtime_sp.get();
1521 runtime = pos->second.get();
1547 if (runtime->CouldHaveDynamicValue(in_value))
1577 if (
error.Success())
1587 if (bp_site_sp->IsEnabled())
1591 "invalid breakpoint site ID: %" PRIu64, break_id);
1601 if (!bp_site_sp->IsEnabled())
1605 "invalid breakpoint site ID: %" PRIu64, break_id);
1612 bool use_hardware) {
1615 bool show_error =
true;
1638 constituent->SetIsIndirect(
false);
1640 if (constituent->ShouldResolveIndirectFunctions()) {
1646 if (!
error.Success() && show_error) {
1648 "warning: failed to resolve indirect function at 0x%" PRIx64
1649 " for breakpoint %i.%i: %s\n",
1651 constituent->GetBreakpoint().GetID(), constituent->GetID(),
1652 error.AsCString() ?
error.AsCString() :
"unknown error");
1655 Address resolved_address(load_addr);
1657 constituent->SetIsIndirect(
true);
1659 load_addr = constituent->GetAddress().GetOpcodeLoadAddress(&
GetTarget());
1661 load_addr = constituent->GetAddress().GetOpcodeLoadAddress(&
GetTarget());
1672 bp_site_sp->AddConstituent(constituent);
1673 constituent->SetBreakpointSite(bp_site_sp);
1674 return bp_site_sp->GetID();
1680 if (
error.Success()) {
1681 constituent->SetBreakpointSite(bp_site_sp);
1684 if (show_error || use_hardware) {
1687 "warning: failed to set breakpoint site at 0x%" PRIx64
1688 " for breakpoint %i.%i: %s\n",
1689 load_addr, constituent->GetBreakpoint().GetID(),
1690 constituent->GetID(),
1691 error.AsCString() ?
error.AsCString() :
"unknown error");
1704 uint32_t num_constituents =
1705 bp_site_sp->RemoveConstituent(constituent_id, constituent_loc_id);
1706 if (num_constituents == 0) {
1715 uint8_t *buf)
const {
1716 size_t bytes_removed = 0;
1720 bp_sites_in_range)) {
1721 bp_sites_in_range.
ForEach([bp_addr, size,
1725 size_t intersect_size;
1726 size_t opcode_offset;
1728 &intersect_size, &opcode_offset)) {
1729 assert(bp_addr <= intersect_addr && intersect_addr < bp_addr + size);
1730 assert(bp_addr < intersect_addr + intersect_size &&
1731 intersect_addr + intersect_size <= bp_addr + size);
1732 assert(opcode_offset + intersect_size <= bp_site->GetByteSize());
1733 size_t buf_offset = intersect_addr - bp_addr;
1734 ::memcpy(buf + buf_offset,
1741 return bytes_removed;
1747 return platform_sp->GetSoftwareBreakpointTrapOpcode(
GetTarget(), bp_site);
1753 assert(bp_site !=
nullptr);
1757 log,
"Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64,
1758 bp_site->
GetID(), (uint64_t)bp_addr);
1762 "Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64
1763 " -- already enabled",
1764 bp_site->
GetID(), (uint64_t)bp_addr);
1770 "BreakpointSite contains an invalid load address.");
1777 if (bp_opcode_size == 0) {
1779 "Process::GetSoftwareBreakpointTrapOpcode() "
1780 "returned zero, unable to get breakpoint "
1781 "trap for address 0x%" PRIx64,
1786 if (bp_opcode_bytes ==
nullptr) {
1788 "BreakpointSite doesn't contain a valid breakpoint trap opcode.");
1794 error) == bp_opcode_size) {
1798 uint8_t verify_bp_opcode_bytes[64];
1799 if (
DoReadMemory(bp_addr, verify_bp_opcode_bytes, bp_opcode_size,
1800 error) == bp_opcode_size) {
1801 if (::memcmp(bp_opcode_bytes, verify_bp_opcode_bytes,
1802 bp_opcode_size) == 0) {
1806 "Process::EnableSoftwareBreakpoint (site_id = %d) "
1807 "addr = 0x%" PRIx64
" -- SUCCESS",
1808 bp_site->
GetID(), (uint64_t)bp_addr);
1811 "failed to verify the breakpoint trap in memory.");
1814 "Unable to read memory to verify breakpoint trap.");
1817 "Unable to write breakpoint trap to memory.");
1820 "Unable to read memory at breakpoint address.");
1822 if (log &&
error.Fail())
1825 "Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64
1827 bp_site->
GetID(), (uint64_t)bp_addr,
error.AsCString());
1833 assert(bp_site !=
nullptr);
1838 "Process::DisableSoftwareBreakpoint (breakID = %" PRIu64
1839 ") addr = 0x%" PRIx64,
1840 breakID, (uint64_t)bp_addr);
1846 const size_t break_op_size = bp_site->
GetByteSize();
1848 if (break_op_size > 0) {
1850 uint8_t curr_break_op[8];
1851 assert(break_op_size <=
sizeof(curr_break_op));
1852 bool break_op_found =
false;
1857 bool verify =
false;
1859 if (::memcmp(curr_break_op, break_op, break_op_size) == 0) {
1860 break_op_found =
true;
1864 break_op_size,
error) == break_op_size) {
1868 "Memory write failed when restoring original opcode.");
1871 "Original breakpoint trap is no longer in memory.");
1878 uint8_t verify_opcode[8];
1879 assert(break_op_size <
sizeof(verify_opcode));
1885 break_op_size) == 0) {
1889 "Process::DisableSoftwareBreakpoint (site_id = %d) "
1890 "addr = 0x%" PRIx64
" -- SUCCESS",
1891 bp_site->
GetID(), (uint64_t)bp_addr);
1896 "Failed to restore original opcode.");
1901 "breakpoint trap was restored.");
1905 "Unable to read memory that should contain the breakpoint trap.");
1910 "Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64
1911 " -- already disabled",
1912 bp_site->
GetID(), (uint64_t)bp_addr);
1918 "Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64
1920 bp_site->
GetID(), (uint64_t)bp_addr,
error.AsCString());
1930 addr = abi_sp->FixAnyAddress(addr);
1934#if defined(VERIFY_MEMORY_READS)
1946 std::string verify_buf(size,
'\0');
1947 assert(verify_buf.size() == size);
1948 const size_t cache_bytes_read =
1951 const size_t verify_bytes_read =
1953 verify_buf.size(), verify_error);
1954 assert(cache_bytes_read == verify_bytes_read);
1955 assert(memcmp(buf, verify_buf.data(), verify_buf.size()) == 0);
1957 return cache_bytes_read;
1972llvm::SmallVector<llvm::MutableArrayRef<uint8_t>>
1974 llvm::MutableArrayRef<uint8_t> buffer) {
1975 auto total_ranges_len = llvm::sum_of(
1976 llvm::map_range(ranges, [](
auto range) {
return range.size; }));
1980 assert(buffer.size() >= total_ranges_len &&
"provided buffer is too short");
1981 if (buffer.size() < total_ranges_len) {
1982 llvm::MutableArrayRef<uint8_t> empty;
1983 return {ranges.size(), empty};
1986 llvm::SmallVector<llvm::MutableArrayRef<uint8_t>> results;
1990 for (
auto [addr, range_len] : ranges) {
1992 size_t num_bytes_read =
1999 assert(num_bytes_read <= range_len &&
"read more than requested bytes");
2000 if (num_bytes_read > range_len) {
2003 results.emplace_back();
2007 results.push_back(buffer.take_front(num_bytes_read));
2009 buffer = buffer.drop_front(num_bytes_read);
2016 const uint8_t *buf,
size_t size,
2018 size_t max_matches) {
2020 assert(buf !=
nullptr);
2022 assert(alignment > 0);
2023 assert(max_matches > 0);
2026 assert(start_addr < end_addr);
2028 lldb::addr_t start = llvm::alignTo(start_addr, alignment);
2029 while (matches.size() < max_matches && (start + size) < end_addr) {
2034 if (found_addr % alignment) {
2037 start = llvm::alignTo(start + 1, alignment);
2041 matches.emplace_back(found_addr, size);
2042 start = found_addr + alignment;
2048 size_t alignment,
size_t max_matches,
2051 if (buf ==
nullptr) {
2059 if (ranges.empty()) {
2063 if (alignment == 0) {
2067 if (max_matches == 0) {
2072 int resolved_ranges = 0;
2074 for (
size_t i = 0; i < ranges.size(); ++i) {
2075 if (matches.size() >= max_matches)
2088 DoFindInMemory(start_addr, end_addr, buf, size, matches, alignment,
2092 if (resolved_ranges > 0)
2103 if (buf ==
nullptr) {
2115 if (alignment == 0) {
2130 DoFindInMemory(start_addr, end_addr, buf, size, matches, alignment, 1);
2131 if (matches.empty())
2135 return matches[0].GetBaseAddress().GetLoadAddress(&target);
2147 out_str.append(buf, length);
2150 if (length ==
sizeof(buf) - 1)
2151 curr_addr += length;
2155 return out_str.size();
2163 size_t total_cstr_len = 0;
2164 if (dst && dst_max_len) {
2165 result_error.
Clear();
2167 memset(dst, 0, dst_max_len);
2169 const size_t cache_line_size =
m_memory_cache.GetMemoryCacheLineSize();
2170 size_t bytes_left = dst_max_len - 1;
2171 char *curr_dst = dst;
2173 while (bytes_left > 0) {
2174 addr_t cache_line_bytes_left =
2175 cache_line_size - (curr_addr % cache_line_size);
2177 std::min<addr_t>(bytes_left, cache_line_bytes_left);
2179 size_t bytes_read =
ReadMemory(curr_addr, curr_dst, bytes_to_read,
error);
2181 if (bytes_read == 0) {
2182 result_error = std::move(
error);
2183 dst[total_cstr_len] =
'\0';
2186 const size_t len = strlen(curr_dst);
2188 total_cstr_len += len;
2190 if (len < bytes_to_read)
2193 curr_dst += bytes_read;
2194 curr_addr += bytes_read;
2195 bytes_left -= bytes_read;
2201 result_error.
Clear();
2203 return total_cstr_len;
2211 addr = abi_sp->FixAnyAddress(addr);
2213 if (buf ==
nullptr || size == 0)
2216 size_t bytes_read = 0;
2217 uint8_t *bytes = (uint8_t *)buf;
2219 while (bytes_read < size) {
2220 const size_t curr_size = size - bytes_read;
2221 const size_t curr_bytes_read =
2223 bytes_read += curr_bytes_read;
2224 if (curr_bytes_read == curr_size || curr_bytes_read == 0)
2240 if (chunk_size == 0)
2252 uint64_t bytes_remaining = size;
2253 uint64_t bytes_read = 0;
2255 while (bytes_remaining > 0) {
2258 const lldb::addr_t bytes_to_read = std::min(bytes_remaining, chunk_size);
2259 const lldb::addr_t current_addr = vm_addr + bytes_read;
2263 bytes_read += bytes_read_for_chunk;
2266 if (bytes_read_for_chunk > bytes_remaining)
2269 bytes_remaining -= bytes_read_for_chunk;
2271 if (callback(
error, current_addr, buf, bytes_read_for_chunk) ==
2280 size_t integer_byte_size,
2281 uint64_t fail_value,
2291 size_t integer_byte_size,
2313 if (addr_byte_size <= 4)
2314 scalar = (uint32_t)ptr_value;
2323 size_t bytes_written = 0;
2324 const uint8_t *bytes = (
const uint8_t *)buf;
2326 while (bytes_written < size) {
2327 const size_t curr_size = size - bytes_written;
2329 addr + bytes_written, bytes + bytes_written, curr_size,
error);
2330 bytes_written += curr_bytes_written;
2331 if (curr_bytes_written == curr_size || curr_bytes_written == 0)
2334 return bytes_written;
2340 addr = abi_sp->FixAnyAddress(addr);
2344 if (buf ==
nullptr || size == 0)
2359 if (bp_sites_in_range.
IsEmpty())
2362 const uint8_t *ubuf = (
const uint8_t *)buf;
2363 uint64_t bytes_written = 0;
2365 bp_sites_in_range.
ForEach([
this, addr, size, &bytes_written, &ubuf,
2374 size_t intersect_size;
2375 size_t opcode_offset;
2377 addr, size, &intersect_addr, &intersect_size, &opcode_offset);
2380 assert(addr <= intersect_addr && intersect_addr < addr + size);
2381 assert(addr < intersect_addr + intersect_size &&
2382 intersect_addr + intersect_size <= addr + size);
2383 assert(opcode_offset + intersect_size <= bp->GetByteSize());
2386 const addr_t curr_addr = addr + bytes_written;
2387 if (intersect_addr > curr_addr) {
2390 size_t curr_size = intersect_addr - curr_addr;
2391 size_t curr_bytes_written =
2393 bytes_written += curr_bytes_written;
2394 if (curr_bytes_written != curr_size) {
2398 if (
error.Success())
2406 bytes_written += intersect_size;
2410 if (bytes_written < size)
2413 size - bytes_written,
error);
2415 return bytes_written;
2422 if (byte_size > 0) {
2424 const size_t mem_size =
2437 bool is_signed,
Scalar &scalar,
2440 if (byte_size == 0) {
2442 }
else if (byte_size & (byte_size - 1)) {
2444 "byte size %u is not a power of 2", byte_size);
2445 }
else if (byte_size <=
sizeof(uval)) {
2447 if (bytes_read == byte_size) {
2452 scalar = data.
GetMaxU32(&offset, byte_size);
2454 scalar = data.
GetMaxU64(&offset, byte_size);
2461 "byte size of %u is too large for integer scalar type", byte_size);
2468 for (
const auto &
Entry : entries) {
2471 if (!
error.Success())
2481 "cannot allocate memory while process is running");
2491 if (
error.Success()) {
2492 std::string buffer(size, 0);
2504 8, ePermissionsReadable | ePermissionsWritable | ePermissionsExecutable,
2510 "Process::%s pid %" PRIu64
2511 " allocation test passed, CanJIT () is true",
2512 __FUNCTION__,
GetID());
2516 "Process::%s pid %" PRIu64
2517 " allocation test failed, CanJIT () is false: %s",
2540 "deallocation of memory at 0x%" PRIx64
" failed.", (uint64_t)ptr);
2547 return *subclass_override;
2549 bool reported_after =
true;
2552 return reported_after;
2555 if (triple.isMIPS() || triple.isPPC64() || triple.isRISCV() ||
2556 triple.isAArch64() || triple.isArmMClass() || triple.isARM() ||
2557 triple.isLoongArch())
2558 reported_after =
false;
2560 return reported_after;
2565 size_t size_to_read) {
2569 "Process::ReadModuleFromMemory reading %s binary from memory",
2575 std::unique_ptr<Progress> progress_up;
2580 progress_up = std::make_unique<Progress>(
2583 ObjectFile *objfile = module_sp->GetMemoryObjectFile(
2584 shared_from_this(), header_addr,
error, size_to_read);
2592 uint32_t &permissions) {
2596 if (!
error.Success())
2654 LaunchPrivate(launch_info, state_after_launch, first_stop_event_sp);
2676 if (launch_info.
GetFlags().
Test(eLaunchFlagStopAtEntry))
2735 std::string local_exec_file_path = exe_spec_to_use.
GetPath();
2737 local_exec_file_path.c_str());
2740 const bool restarted =
false;
2750 const char *error_string =
error.AsCString();
2751 if (error_string ==
nullptr)
2752 error_string =
"launch failed";
2807 "Unexpected process state after the launch: %s, expected %s, "
2817 if (
error.Success()) {
2852 LLDB_LOGF(log,
"Process::Halt() failed to stop, state is: %s",
2855 "Did not get stopped event after loading the core file.");
2896 uint32_t exec_count)
2901 "Process::AttachCompletionHandler::%s process=%p, exec_count=%" PRIu32,
2902 __FUNCTION__,
static_cast<void *
>(process), exec_count);
2911 "Process::AttachCompletionHandler::%s called with state %s (%d)",
2935 "Process::AttachCompletionHandler::%s state %s: reduced "
2936 "remaining exec count to %" PRIu32
", requesting resume",
2943 "Process::AttachCompletionHandler::%s state %s: no more "
2944 "execs expected to start, continuing with attach",
2987 bool wait_for_launch) {
3009 sizeof(process_name))) {
3012 if (wait_for_launch) {
3014 if (
error.Success()) {
3017 const bool restarted =
false;
3025 if (
error.AsCString() ==
nullptr)
3045 platform_sp->FindProcesses(match_info, process_infos);
3046 const uint32_t num_matches = process_infos.size();
3047 if (num_matches == 1) {
3048 attach_pid = process_infos[0].GetProcessID();
3052 process_name,
sizeof(process_name));
3053 if (num_matches > 1) {
3056 for (
size_t i = 0; i < num_matches; i++) {
3057 process_infos[i].DumpAsTableRow(
3058 s, platform_sp->GetUserIDResolver(),
true,
false);
3061 "more than one process named %s:\n%s", process_name,
3065 "could not find a process named %s", process_name);
3069 "invalid platform, can't find processes by name");
3080 if (
error.Success()) {
3085 const bool restarted =
false;
3089 if (
error.Success()) {
3097 const char *error_string =
error.AsCString();
3098 if (error_string ==
nullptr)
3099 error_string =
"attach failed";
3110 LLDB_LOGF(log,
"Process::%s()", __FUNCTION__);
3119 "Process::{0} replacing process architecture with DidAttach() "
3120 "architecture: \"{1}\"",
3121 __FUNCTION__, process_arch.
GetTriple().getTriple());
3129 assert(platform_sp);
3133 if (target_arch.
IsValid() && !platform_sp->IsCompatibleArchitecture(
3134 target_arch, process_host_arch,
3138 target_arch, process_host_arch, &platform_arch);
3143 "switching platform to {0} and architecture to {1} based on "
3145 platform_sp->GetName(), platform_arch.
GetTriple().getTriple());
3147 }
else if (!process_arch.
IsValid()) {
3157 "Process::%s switching architecture to %s based on info "
3158 "the platform retrieved for pid %" PRIu64,
3159 __FUNCTION__, process_arch.
GetTriple().getTriple().c_str(),
3178 "after DynamicLoader::DidAttach(), target "
3179 "executable is {0} (using {1} plugin)",
3180 exe_module_sp ? exe_module_sp->GetFileSpec() :
FileSpec(),
3188 if (system_runtime) {
3193 "after SystemRuntime::DidAttach(), target "
3194 "executable is {0} (using {1} plugin)",
3195 exe_module_sp ? exe_module_sp->GetFileSpec() :
FileSpec(),
3216 if (module_sp && module_sp->IsExecutable()) {
3217 if (
GetTarget().GetExecutableModulePointer() != module_sp.get())
3218 new_executable_module_sp = module_sp;
3222 if (new_executable_module_sp) {
3229 "Process::%s after looping through modules, target executable is %s",
3231 exe_module_sp ? exe_module_sp->GetFileSpec().GetPath().c_str()
3251 if (
error.Success()) {
3286 "Process::PrivateResume() m_stop_id = %u, public state: %s "
3287 "private state: %s",
3296 if (!
GetModID().IsLastResumeForUserExpression())
3301 if (
error.Success()) {
3311 LLDB_LOGF(log,
"Process::PrivateResume WillResume direction=%d",
3316 "Process::PrivateResume PreResumeActions failed, not resuming.");
3319 "Process::PrivateResume PreResumeActions failed, not resuming.");
3323 if (
error.Success()) {
3327 "Process::PrivateResume thinks the process has resumed.");
3329 LLDB_LOGF(log,
"Process::PrivateResume() DoResume failed.");
3339 "Process::PrivateResume() asked to simulate a start & stop.");
3345 LLDB_LOGF(log,
"Process::PrivateResume() got an error \"%s\".",
3346 error.AsCString(
"<unknown error>"));
3381 halt_listener_sp,
nullptr,
3382 use_run_lock, select_most_relevant);
3397 const uint8_t *buf,
size_t size) {
3398 const size_t region_size = high - low;
3400 if (region_size < size)
3404 std::vector<size_t> bad_char_heuristic(256, size);
3405 for (
size_t idx = 0; idx < size - 1; idx++) {
3406 decltype(bad_char_heuristic)::size_type bcu_idx = buf[idx];
3407 bad_char_heuristic[bcu_idx] = size - idx - 1;
3411 llvm::SmallVector<uint8_t, 0> mem;
3416 const size_t max_read_size = std::max<size_t>(size, 0x10000);
3418 for (
addr_t cur_addr = low; cur_addr <= (high - size);) {
3419 if (cur_addr + size > mem_pos + mem.size()) {
3425 mem.resize_for_overwrite(max_read_size);
3428 std::min<addr_t>(mem.size(), high - cur_addr),
3431 if (size > mem.size()) {
3441 int64_t j = size - 1;
3442 while (j >= 0 && buf[j] == mem[cur_addr + j - mem_pos])
3446 cur_addr += bad_char_heuristic[mem[cur_addr + size - 1 - mem_pos]];
3461 LLDB_LOGF(log,
"Process::%s() About to stop.", __FUNCTION__);
3471 &exit_event_sp,
true, listener_sp);
3481 LLDB_LOGF(log,
"Process::%s() Process exited while waiting to stop.",
3485 exit_event_sp.reset();
3488 LLDB_LOGF(log,
"Process::%s() failed to stop, state is: %s", __FUNCTION__,
3496 "Attempt to stop the target in order to detach timed out. "
3512 if (
error.Success()) {
3515 if (!
error.Success()) {
3518 }
else if (exit_event_sp) {
3531 if (
error.Success()) {
3542 if (exit_event_sp) {
3577 bool keep_stopped =
false;
3584 if (
error.Success()) {
3601 if (
error.Success()) {
3620 if (exit_event_sp) {
3640 if (
error.Success()) {
3642 if (
error.Success())
3649 assert(signals_sp &&
"null signals_sp");
3669 bool return_value =
true;
3687 return_value =
true;
3691 return_value =
false;
3703 return_value =
true;
3709 return_value =
false;
3722 return_value =
true;
3725 return_value =
false;
3744 "Process::ShouldBroadcastEvent (%p) stopped due to an "
3745 "interrupt, state: %s",
3750 return_value =
true;
3753 bool should_resume =
false;
3765 "Process::ShouldBroadcastEvent: should_resume: %i state: "
3766 "%s was_restarted: %i report_stop_vote: %d.",
3770 switch (report_stop_vote) {
3772 return_value =
true;
3776 return_value =
false;
3780 if (!was_restarted) {
3782 "Process::ShouldBroadcastEvent (%p) Restarting process "
3789 return_value =
true;
3812 "Process::ShouldBroadcastEvent (%p) => new state: %s, last "
3813 "broadcast state: %s - %s",
3816 return_value ?
"YES" :
"NO");
3817 return return_value;
3824 LLDB_LOGF(log,
"Process::%s()%s ", __FUNCTION__,
3825 already_running ?
" already running"
3826 :
" starting private state thread");
3828 if (!is_secondary_thread && already_running)
3833 char thread_name[1024];
3834 uint32_t max_len = llvm::get_max_thread_name_length();
3835 if (max_len > 0 && max_len <= 30) {
3838 if (already_running)
3839 snprintf(thread_name,
sizeof(thread_name),
"intern-state-OV");
3841 snprintf(thread_name,
sizeof(thread_name),
"intern-state");
3843 if (already_running)
3844 snprintf(thread_name,
sizeof(thread_name),
3845 "<lldb.process.internal-state-override(pid=%" PRIu64
")>",
3848 snprintf(thread_name,
sizeof(thread_name),
3849 "<lldb.process.internal-state(pid=%" PRIu64
")>",
GetID());
3852 llvm::Expected<HostThread> private_state_thread =
3855 [
this, is_secondary_thread] {
3859 if (!private_state_thread) {
3861 "failed to launch host thread: {0}");
3865 assert(private_state_thread->IsJoinable());
3886 "Went to stop the private state thread, but it was already invalid.");
3897 LLDB_LOGF(log,
"Process::%s (signal = %d)", __FUNCTION__, signal);
3906 LLDB_LOGF(log,
"Sending control event of type: %d.", signal);
3907 std::shared_ptr<EventDataReceipt> event_receipt_sp(
new EventDataReceipt());
3912 bool receipt_received =
false;
3914 while (!receipt_received) {
3919 if (!receipt_received) {
3936 "Private state thread already dead, no need to signal it to stop.");
3941 if (thread !=
nullptr)
3963 LLDB_LOGF(log,
"Ran next event action, result was %d.", action_result);
3965 switch (action_result) {
3991 if (should_broadcast) {
3995 "Process::%s (pid = %" PRIu64
3996 ") broadcasting new state %s (old state %s) to %s",
3999 is_hijacked ?
"hijacked" :
"public");
4006 if (!
GetTarget().GetDebugger().IsForwardingEvents() &&
4011 LLDB_LOGF(log,
"Process::%s updated m_iohandler_sync to %d",
4045 if (is_hijacked || !
GetTarget().GetDebugger().IsHandlingEvents())
4055 "Process::%s (pid = %" PRIu64
4056 ") suppressing state %s (old state %s): should_broadcast == false",
4078 bool control_only =
true;
4081 LLDB_LOGF(log,
"Process::%s (arg = %p, pid = %" PRIu64
") thread starting...",
4082 __FUNCTION__,
static_cast<void *
>(
this),
GetID());
4084 bool exit_now =
false;
4085 bool interrupt_requested =
false;
4091 "Process::%s (arg = %p, pid = %" PRIu64
4092 ") got a control event: %d",
4093 __FUNCTION__,
static_cast<void *
>(
this),
GetID(),
4094 event_sp->GetType());
4096 switch (event_sp->GetType()) {
4102 control_only =
true;
4106 control_only =
false;
4114 "Process::%s (arg = %p, pid = %" PRIu64
4115 ") woke up with an interrupt while attaching - "
4116 "forwarding interrupt.",
4117 __FUNCTION__,
static_cast<void *
>(
this),
GetID());
4128 "Process::%s (arg = %p, pid = %" PRIu64
4129 ") woke up with an interrupt - Halting.",
4130 __FUNCTION__,
static_cast<void *
>(
this),
GetID());
4132 if (
error.Fail() && log)
4134 "Process::%s (arg = %p, pid = %" PRIu64
4135 ") failed to halt the process: %s",
4136 __FUNCTION__,
static_cast<void *
>(
this),
GetID(),
4143 interrupt_requested =
true;
4152 "Process::%s ignoring interrupt as we have already stopped.",
4168 if (interrupt_requested) {
4178 interrupt_requested =
false;
4181 "Process::%s interrupt_requested, but a non-stopped "
4182 "state '%s' received.",
4193 "Process::%s (arg = %p, pid = %" PRIu64
4194 ") about to exit with internal state %s...",
4195 __FUNCTION__,
static_cast<void *
>(
this),
GetID(),
4203 LLDB_LOGF(log,
"Process::%s (arg = %p, pid = %" PRIu64
") thread exiting...",
4204 __FUNCTION__,
static_cast<void *
>(
this),
GetID());
4209 if (!is_secondary_thread)
4228 return "Process::ProcessEventData";
4236 bool &found_valid_stopinfo) {
4237 found_valid_stopinfo =
false;
4243 ThreadList &curr_thread_list = process_sp->GetThreadList();
4244 uint32_t num_threads = curr_thread_list.
GetSize();
4256 std::vector<std::pair<ThreadSP, size_t>> not_suspended_threads;
4257 for (uint32_t idx = 0; idx < num_threads; ++idx) {
4265 not_suspended_threads.emplace_back(thread_sp, thread_sp->GetIndexID());
4273 bool still_should_stop =
false;
4281 for (
auto [thread_sp, thread_index] : not_suspended_threads) {
4282 if (curr_thread_list.
GetSize() != num_threads) {
4286 "Number of threads changed from %u to %u while processing event.",
4287 num_threads, curr_thread_list.
GetSize());
4291 if (thread_sp->GetIndexID() != thread_index) {
4294 "The thread {0} changed from {1} to {2} while processing event.",
4295 thread_sp.get(), thread_index, thread_sp->GetIndexID());
4299 StopInfoSP stop_info_sp = thread_sp->GetStopInfo();
4300 if (stop_info_sp && stop_info_sp->IsValid()) {
4301 found_valid_stopinfo =
true;
4302 bool this_thread_wants_to_stop;
4303 if (stop_info_sp->GetOverrideShouldStop()) {
4304 this_thread_wants_to_stop =
4305 stop_info_sp->GetOverriddenShouldStopValue();
4307 stop_info_sp->PerformAction(event_ptr);
4320 thread_sp->ClearSelectedFrameIndex();
4323 if (stop_info_sp->HasTargetRunSinceMe()) {
4328 this_thread_wants_to_stop = stop_info_sp->ShouldStop(event_ptr);
4331 if (!still_should_stop)
4332 still_should_stop = this_thread_wants_to_stop;
4336 return still_should_stop;
4371 process_sp->SetPublicState(
4378 process_sp->WillPublicStop();
4393 bool does_anybody_have_an_opinion =
false;
4394 bool still_should_stop =
ShouldStop(event_ptr, does_anybody_have_an_opinion);
4400 if (!still_should_stop && does_anybody_have_an_opinion) {
4405 process_sp->PrivateResume();
4408 !process_sp->StateChangedIsHijackedForSynchronousResume();
4416 if (process_sp->GetTarget().RunStopHooks())
4426 s->
Printf(
" process = %p (pid = %" PRIu64
"), ",
4427 static_cast<void *
>(process_sp.get()), process_sp->GetID());
4456 if (data ==
nullptr)
4464 if (data ==
nullptr)
4474 if (data !=
nullptr)
4482 if (data !=
nullptr)
4493 if (data !=
nullptr)
4500 const char *reason) {
4503 if (data !=
nullptr)
4508 const Event *event_ptr) {
4510 if (data ==
nullptr)
4520 if (data !=
nullptr)
4563 auto event_data_sp =
4564 std::make_shared<ProcessEventData>(shared_from_this(),
GetState());
4565 return std::make_shared<Event>(event_type, event_data_sp);
4591 auto data_sp = std::make_shared<EventDataStructuredData>(
4592 shared_from_this(), object_sp, plugin_sp);
4600 return find_it->second;
4611 size_t bytes_available = one_profile_data.size();
4612 if (bytes_available > 0) {
4614 LLDB_LOGF(log,
"Process::GetProfileData (buf = %p, size = %" PRIu64
")",
4615 static_cast<void *
>(buf),
static_cast<uint64_t
>(buf_size));
4616 if (bytes_available > buf_size) {
4617 memcpy(buf, one_profile_data.c_str(), buf_size);
4618 one_profile_data.erase(0, buf_size);
4619 bytes_available = buf_size;
4621 memcpy(buf, one_profile_data.c_str(), bytes_available);
4625 return bytes_available;
4633 if (bytes_available > 0) {
4635 LLDB_LOGF(log,
"Process::GetSTDOUT (buf = %p, size = %" PRIu64
")",
4636 static_cast<void *
>(buf),
static_cast<uint64_t
>(buf_size));
4637 if (bytes_available > buf_size) {
4640 bytes_available = buf_size;
4646 return bytes_available;
4652 if (bytes_available > 0) {
4654 LLDB_LOGF(log,
"Process::GetSTDERR (buf = %p, size = %" PRIu64
")",
4655 static_cast<void *
>(buf),
static_cast<uint64_t
>(buf_size));
4656 if (bytes_available > buf_size) {
4659 bytes_available = buf_size;
4665 return bytes_available;
4671 process->
AppendSTDOUT(
static_cast<const char *
>(src), src_len);
4688 std::lock_guard<std::mutex> guard(
m_mutex);
4708 llvm::consumeError(terminal.
SetEcho(
false));
4711 const int pipe_read_fd =
m_pipe.GetReadFileDescriptor();
4715 std::lock_guard<std::mutex> guard(
m_mutex);
4732 if (
m_read_file.Read(&ch, n).Success() && n == 1) {
4741 if (llvm::Expected<size_t> bytes_read =
m_pipe.Read(&ch, 1)) {
4749 "Pipe read failed: {0}");
4758 std::lock_guard<std::mutex> guard(
m_mutex);
4773 if (llvm::Error err =
m_pipe.Write(&ch, 1).takeError()) {
4775 "Pipe write failed: {0}");
4788 return !errorToBool(
m_pipe.Write(&ch, 1).takeError());
4822 std::make_unique<ConnectionFileDescriptor>(fd,
true));
4833 std::make_shared<IOHandlerProcessSTDIO>(
this, fd);
4849 if (io_handler_sp) {
4851 LLDB_LOGF(log,
"Process::%s pushing IO handler", __FUNCTION__);
4853 io_handler_sp->SetIsDone(
false);
4858 bool cancel_top_handler = !
m_mod_id.IsRunningUtilityFunction();
4860 cancel_top_handler);
4886class RestorePlanState {
4889 : m_thread_plan_sp(thread_plan_sp) {
4890 if (m_thread_plan_sp) {
4891 m_private = m_thread_plan_sp->GetPrivate();
4892 m_is_controlling = m_thread_plan_sp->IsControllingPlan();
4893 m_okay_to_discard = m_thread_plan_sp->OkayToDiscard();
4897 ~RestorePlanState() { Clean(); }
4900 if (!m_already_reset && m_thread_plan_sp) {
4901 m_already_reset =
true;
4902 m_thread_plan_sp->SetPrivate(m_private);
4903 m_thread_plan_sp->SetIsControllingPlan(m_is_controlling);
4904 m_thread_plan_sp->SetOkayToDiscard(m_okay_to_discard);
4910 bool m_already_reset =
false;
4911 bool m_private =
false;
4912 bool m_is_controlling =
false;
4913 bool m_okay_to_discard =
false;
4919 const milliseconds default_one_thread_timeout(250);
4924 : default_one_thread_timeout;
4933 return std::min<microseconds>(default_one_thread_timeout,
4937static Timeout<std::micro>
4939 bool before_first_timeout) {
4945 if (before_first_timeout)
4949 return std::nullopt;
4954static std::optional<ExpressionResults>
4956 RestorePlanState &restorer,
const EventSP &event_sp,
4957 EventSP &event_to_broadcast_sp,
4959 bool handle_interrupts) {
4962 ThreadSP thread_sp = thread_plan_sp->GetTarget()
4965 .FindThreadByID(thread_id);
4968 "The thread on which we were running the "
4969 "expression: tid = {0}, exited while "
4970 "the expression was running.",
4976 if (plan == thread_plan_sp && plan->PlanSucceeded()) {
4977 LLDB_LOG(log,
"execution completed successfully");
4985 StopInfoSP stop_info_sp = thread_sp->GetStopInfo();
4987 stop_info_sp->ShouldNotify(event_sp.get())) {
4988 LLDB_LOG(log,
"stopped for breakpoint: {0}.", stop_info_sp->GetDescription());
4995 thread_plan_sp->SetPrivate(
false);
4996 event_to_broadcast_sp = event_sp;
5001 if (!handle_interrupts &&
5003 return std::nullopt;
5005 LLDB_LOG(log,
"thread plan did not successfully complete");
5007 event_to_broadcast_sp = event_sp;
5020 if (!thread_plan_sp) {
5026 if (!thread_plan_sp->ValidatePlan(
nullptr)) {
5029 "RunThreadPlan called with an invalid thread plan.");
5035 "RunThreadPlan called on wrong process.");
5040 if (thread ==
nullptr) {
5042 "RunThreadPlan called with invalid thread.");
5053 RestorePlanState thread_plan_restorer(thread_plan_sp);
5060 thread_plan_sp->SetPrivate(
false);
5066 thread_plan_sp->SetIsControllingPlan(
true);
5067 thread_plan_sp->SetOkayToDiscard(
false);
5077 "RunThreadPlan called while the private state was not stopped.");
5082 const uint32_t thread_idx_id = thread->GetIndexID();
5085 if (!selected_frame_sp) {
5086 thread->SetSelectedFrame(
nullptr);
5088 if (!selected_frame_sp) {
5089 diagnostic_manager.
Printf(
5091 "RunThreadPlan called without a selected frame on thread %d",
5102 "RunThreadPlan called with one thread "
5103 "timeout greater than total timeout");
5113 : selected_frame_sp->GetStackID();
5121 uint32_t selected_tid;
5123 if (selected_thread_sp) {
5124 selected_tid = selected_thread_sp->GetIndexID();
5143 LLDB_LOGF(log,
"Running thread plan on private state thread, spinning up "
5144 "another state thread to handle the events.");
5156 thread->QueueThreadPlan(stopper_base_plan_sp,
false);
5166 thread->QueueThreadPlan(
5167 thread_plan_sp,
false);
5200 "Process::RunThreadPlan(): Resuming thread %u - 0x%4.4" PRIx64
5201 " to run thread plan \"%s\".",
5202 thread_idx_id, expr_thread_id, s.
GetData());
5209 bool before_first_timeout =
true;
5211 bool do_resume =
true;
5212 bool handle_running_event =
true;
5215 uint32_t num_resumes = 0;
5221 before_first_timeout =
false;
5223 LLDB_LOGF(log,
"Stop others: %u, try all: %u, before_first: %u.\n",
5225 before_first_timeout);
5232 Event *other_events = listener_sp->PeekAtNextEvent();
5233 if (other_events !=
nullptr) {
5236 "RunThreadPlan called with pending events on the queue.");
5249#ifdef LLDB_RUN_THREAD_HALT_WITH_EVENT
5257 bool miss_first_event =
true;
5265 "Top of while loop: do_resume: %i handle_running_event: %i "
5266 "before_first_timeout: %i.",
5267 do_resume, handle_running_event, before_first_timeout);
5269 if (do_resume || handle_running_event) {
5276 if (!resume_error.
Success()) {
5277 diagnostic_manager.
Printf(
5279 "couldn't resume inferior the %d time: \"%s\".", num_resumes,
5290 "Process::RunThreadPlan(): didn't get any event after "
5291 "resume %" PRIu32
", exiting.",
5295 "didn't get any event after resume %" PRIu32
5306 bool restarted =
false;
5313 "Process::RunThreadPlan(): didn't get running event after "
5314 "resume %d, got %s instead (restarted: %i, do_resume: %i, "
5315 "handle_running_event: %i).",
5317 handle_running_event);
5324 const bool clear_thread_plans =
false;
5325 const bool use_run_lock =
false;
5326 Halt(clear_thread_plans, use_run_lock);
5329 diagnostic_manager.
Printf(
5331 "didn't get running event after initial resume, got %s instead.",
5338 log->
PutCString(
"Process::RunThreadPlan(): resuming succeeded.");
5346 log->
PutCString(
"Process::RunThreadPlan(): waiting for next event.");
5350 handle_running_event =
true;
5359 auto now = system_clock::now();
5361 "Process::RunThreadPlan(): about to wait - now is %s - "
5363 llvm::to_string(now).c_str(),
5364 llvm::to_string(now + *timeout).c_str());
5366 LLDB_LOGF(log,
"Process::RunThreadPlan(): about to wait forever.");
5370#ifdef LLDB_RUN_THREAD_HALT_WITH_EVENT
5372 if (miss_first_event) {
5373 std::this_thread::sleep_for(std::chrono::milliseconds(1));
5374 miss_first_event =
false;
5378 got_event = listener_sp->GetEvent(event_sp, timeout);
5382 bool keep_going =
false;
5384 const bool clear_thread_plans =
false;
5385 const bool use_run_lock =
false;
5386 Halt(clear_thread_plans, use_run_lock);
5389 "execution halted by user interrupt.");
5390 LLDB_LOGF(log,
"Process::RunThreadPlan(): Got interrupted by "
5391 "eBroadcastBitInterrupted, exiting.");
5397 "Process::RunThreadPlan(): in while loop, got event: %s.",
5400 switch (stop_state) {
5406 LLDB_LOGF(log,
"Process::RunThreadPlan(): Got a stop and "
5407 "restart, so we'll continue waiting.");
5410 handle_running_event =
true;
5412 const bool handle_interrupts =
true;
5414 expr_thread_id, thread_plan_sp, thread_plan_restorer,
5415 event_sp, event_to_broadcast_sp, options,
5428 handle_running_event =
false;
5433 "Process::RunThreadPlan(): execution stopped with "
5434 "unexpected state: %s.",
5438 event_to_broadcast_sp = event_sp;
5442 "execution stopped with unexpected state.");
5454 log->
PutCString(
"Process::RunThreadPlan(): got_event was true, but "
5455 "the event pointer was null. How odd...");
5467 if (before_first_timeout) {
5469 "Running function with one thread timeout timed out.");
5471 LLDB_LOG(log,
"Restarting function with all threads enabled and "
5472 "timeout: {0} timed out, abandoning execution.",
5475 LLDB_LOG(log,
"Running function with timeout: {0} timed out, "
5476 "abandoning execution.",
5489 bool back_to_top =
true;
5490 uint32_t try_halt_again = 0;
5491 bool do_halt =
true;
5492 const uint32_t num_retries = 5;
5493 while (try_halt_again < num_retries) {
5496 LLDB_LOGF(log,
"Process::RunThreadPlan(): Running Halt.");
5497 const bool clear_thread_plans =
false;
5498 const bool use_run_lock =
false;
5499 Halt(clear_thread_plans, use_run_lock);
5503 log->
PutCString(
"Process::RunThreadPlan(): Halt succeeded.");
5513 "Process::RunThreadPlan(): Stopped with event: %s",
5518 log->
PutCString(
" Event was the Halt interruption event.");
5525 log->
PutCString(
"Process::RunThreadPlan(): Went to halt "
5526 "but got a restarted event, there must be "
5527 "an un-restarted stopped event so try "
5529 "Exiting wait loop.");
5538 const bool handle_interrupts =
false;
5540 expr_thread_id, thread_plan_sp, thread_plan_restorer,
5541 event_sp, event_to_broadcast_sp, options,
5542 handle_interrupts)) {
5543 return_value = *result;
5544 back_to_top =
false;
5550 log->
PutCString(
"Process::RunThreadPlan(): try_all_threads "
5551 "was false, we stopped so now we're "
5554 back_to_top =
false;
5558 if (before_first_timeout) {
5561 before_first_timeout =
false;
5562 thread_plan_sp->SetStopOthers(
false);
5565 "Process::RunThreadPlan(): about to resume.");
5572 log->
PutCString(
"Process::RunThreadPlan(): running all "
5573 "threads timed out.");
5575 back_to_top =
false;
5581 log->
PutCString(
"Process::RunThreadPlan(): halt said it "
5582 "succeeded, but I got no event. "
5583 "I'm getting out of here passing Interrupted.");
5585 back_to_top =
false;
5594 if (!back_to_top || try_halt_again > num_retries)
5603 if (backup_private_state_thread.
IsJoinable()) {
5607 if (stopper_base_plan_sp) {
5608 thread->DiscardThreadPlansUpToPlan(stopper_base_plan_sp);
5618 return return_value;
5624 s.
PutCString(
"Thread state after unsuccessful completion: \n");
5639 thread_plan_sp->RestoreThreadState();
5650 log->
PutCString(
"Process::RunThreadPlan(): Stop event that "
5651 "interrupted us is NULL.");
5656 const char *event_explanation =
nullptr;
5660 event_explanation =
"<no event>";
5663 event_explanation =
"<user interrupt>";
5671 event_explanation =
"<no event data>";
5678 event_explanation =
"<no process>";
5684 uint32_t num_threads = thread_list.
GetSize();
5685 uint32_t thread_index;
5687 ts.
Printf(
"<%u threads> ", num_threads);
5689 for (thread_index = 0; thread_index < num_threads; ++thread_index) {
5697 ts.
Printf(
"<0x%4.4" PRIx64
" ", thread->GetID());
5699 thread->GetRegisterContext().get();
5701 if (register_context)
5702 ts.
Printf(
"[ip 0x%" PRIx64
"] ", register_context->
GetPC());
5704 ts.
Printf(
"[ip unknown] ");
5710 const char *stop_desc = stop_info_sp->GetDescription();
5717 event_explanation = ts.
GetData();
5721 if (event_explanation)
5723 "Process::RunThreadPlan(): execution interrupted: %s %s",
5724 s.
GetData(), event_explanation);
5726 LLDB_LOGF(log,
"Process::RunThreadPlan(): execution interrupted: %s",
5730 if (should_unwind) {
5732 "Process::RunThreadPlan: ExecutionInterrupted - "
5733 "discarding thread plans up to %p.",
5734 static_cast<void *
>(thread_plan_sp.get()));
5735 thread->DiscardThreadPlansUpToPlan(thread_plan_sp);
5738 "Process::RunThreadPlan: ExecutionInterrupted - for "
5739 "plan: %p not discarding.",
5740 static_cast<void *
>(thread_plan_sp.get()));
5744 log->
PutCString(
"Process::RunThreadPlan(): execution set up error.");
5747 thread->DiscardThreadPlansUpToPlan(thread_plan_sp);
5750 if (thread->IsThreadPlanDone(thread_plan_sp.get())) {
5752 log->
PutCString(
"Process::RunThreadPlan(): thread plan is done");
5754 }
else if (thread->WasThreadPlanDiscarded(thread_plan_sp.get())) {
5757 "Process::RunThreadPlan(): thread plan was discarded");
5762 "Process::RunThreadPlan(): thread plan stopped in mid course");
5765 log->
PutCString(
"Process::RunThreadPlan(): discarding thread plan "
5766 "'cause unwind_on_error is set.");
5767 thread->DiscardThreadPlansUpToPlan(thread_plan_sp);
5777 exe_ctx.
SetFrameSP(thread->GetFrameWithStackID(ctx_frame_id));
5784 if (
GetThreadList().SetSelectedThreadByIndexID(selected_tid) &&
5785 selected_stack_id.
IsValid()) {
5787 std::lock_guard<std::recursive_mutex> guard(
GetThreadList().GetMutex());
5793 old_frame_sp.get());
5800 if (event_to_broadcast_sp) {
5802 log->
PutCString(
"Process::RunThreadPlan(): rebroadcasting event.");
5806 return return_value;
5815 strm.
Printf(
"Process %" PRIu64
" exited with status = %i (0x%8.8x) %s\n",
5816 GetID(), exit_status, exit_status,
5817 exit_description ? exit_description :
"");
5820 strm.
Printf(
"Connected to remote target.\n");
5825 strm.
Printf(
"Process %" PRIu64
" is running.\n",
GetID());
5830 bool only_threads_with_stop_reason,
5831 uint32_t start_frame, uint32_t num_frames,
5832 uint32_t num_frames_with_source,
5834 size_t num_thread_infos_dumped = 0;
5841 uint32_t num_threads;
5842 std::vector<lldb::tid_t> thread_id_array;
5845 std::lock_guard<std::recursive_mutex> guard(
GetThreadList().GetMutex());
5847 num_threads = curr_thread_list.
GetSize();
5849 thread_id_array.resize(num_threads);
5850 for (idx = 0; idx < num_threads; ++idx)
5854 for (uint32_t i = 0; i < num_threads; i++) {
5857 if (only_threads_with_stop_reason) {
5858 StopInfoSP stop_info_sp = thread_sp->GetStopInfo();
5859 if (!stop_info_sp || !stop_info_sp->ShouldShow())
5862 thread_sp->GetStatus(strm, start_frame, num_frames,
5863 num_frames_with_source, stop_format,
5865 ++num_thread_infos_dumped;
5868 LLDB_LOGF(log,
"Process::GetThreadStatus - thread 0x" PRIu64
5869 " vanished while running Thread::GetStatus.");
5872 return num_thread_infos_dumped;
5896 result = this_result;
5974 "Setting Process code address mask to {0:x}", code_address_mask);
5980 "Setting Process data address mask to {0:x}", data_address_mask);
5986 "Setting Process highmem code address mask to {0:x}",
5993 "Setting Process highmem data address mask to {0:x}",
6000 addr = abi_sp->FixCodeAddress(addr);
6006 addr = abi_sp->FixDataAddress(addr);
6012 addr = abi_sp->FixAnyAddress(addr);
6018 LLDB_LOGF(log,
"Process::%s()", __FUNCTION__);
6053 if (address ==
nullptr) {
6061 std::map<addr_t, addr_t>::const_iterator iter =
6064 function_addr = (*iter).second;
6069 "Unable to call resolver for indirect function %s",
6074 function_addr = abi_sp->FixCodeAddress(function_addr);
6076 std::pair<addr_t, addr_t>(addr, function_addr));
6079 return function_addr;
6095 runtime.second->ModulesDidLoad(module_list);
6101 runtime->ModulesDidLoad(module_list);
6112 pair.second->ModulesDidLoad(*
this, module_list);
6136 if (plugins[language])
6138 sc.
module_sp->ReportWarningUnsupportedLanguage(
6149 return platform_sp->GetProcessInfo(
GetID(), info);
6162 if (!memory_history) {
6166 threads = std::make_shared<ThreadCollection>(
6167 memory_history->GetHistoryThreads(addr));
6174 InstrumentationRuntimeCollection::iterator pos;
6179 return (*pos).second;
6184 module_spec.
Clear();
6211 Address retval = default_stop_addr;
6215 if (!default_stop_addr.
IsValid())
6218 const char *plugin_name =
nullptr;
6219 const char *flavor =
nullptr;
6220 const char *cpu =
nullptr;
6221 const char *features =
nullptr;
6225 if (disassembler_sp)
6226 insn_list = &disassembler_sp->GetInstructionList();
6228 if (insn_list ==
nullptr) {
6232 size_t insn_offset =
6239 insn_offset,
false ,
nullptr);
6244 if (branch_index > insn_offset) {
6245 Address next_branch_insn_address =
6247 if (next_branch_insn_address.
IsValid() &&
6249 retval = next_branch_insn_address;
6259 load_addr = abi->FixAnyAddress(load_addr);
6274 region_list.clear();
6280 region_list.clear();
6291 region_list.push_back(std::move(region_info));
6299 !(abi && (abi->FixAnyAddress(range_end) != range_end)));
6318 if (supported_type_names.
GetSize() == 0) {
6319 LLDB_LOG(log,
"no structured data types supported");
6324 std::set<llvm::StringRef> type_names;
6327 "the process supports the following async structured data types:");
6336 const llvm::StringRef type_name =
object->GetStringValue();
6337 if (type_name.empty())
6340 type_names.insert(type_name);
6350 for (uint32_t plugin_index = 0; !type_names.empty(); plugin_index++) {
6351 auto create_instance =
6354 if (!create_instance)
6366 std::vector<llvm::StringRef> names_to_remove;
6367 for (llvm::StringRef type_name : type_names) {
6368 if (plugin_sp->SupportsStructuredDataType(type_name)) {
6370 std::make_pair(type_name, plugin_sp));
6371 names_to_remove.push_back(type_name);
6372 LLDB_LOG(log,
"using plugin {0} for type name {1}",
6373 plugin_sp->GetPluginName(), type_name);
6378 for (llvm::StringRef type_name : names_to_remove)
6379 type_names.erase(type_name);
6396 llvm::StringRef type_name;
6408 find_it->second->HandleArrivalOfStructuredData(*
this, type_name, object_sp);
6420 llvm::function_ref<std::unique_ptr<UtilityFunction>()> factory) {
6421 if (platform !=
GetTarget().GetPlatform().get())
6430 return llvm::createStringError(llvm::inconvertibleErrorCode(),
6431 "Can't trace a non-live process.");
6432 return llvm::make_error<UnimplementedError>();
6437 bool trap_exceptions) {
6439 if (thread ==
nullptr || address ==
nullptr)
6451 auto type_system_or_err =
6453 if (!type_system_or_err) {
6454 llvm::consumeError(type_system_or_err.takeError());
6457 auto ts = *type_system_or_err;
6463 *thread, *address, void_ptr_type, llvm::ArrayRef<addr_t>(), options));
6467 StackFrame *frame = thread->GetStackFrameAtIndex(0).get();
6475 call_plan_sp->GetReturnValueObject()->GetValueAsUnsigned(
6497 if (!arch || !tag_manager) {
6498 return llvm::createStringError(
6499 llvm::inconvertibleErrorCode(),
6500 "This architecture does not support memory tagging");
6504 return llvm::createStringError(llvm::inconvertibleErrorCode(),
6505 "Process does not support memory tagging");
6511llvm::Expected<std::vector<lldb::addr_t>>
6513 llvm::Expected<const MemoryTagManager *> tag_manager_or_err =
6515 if (!tag_manager_or_err)
6516 return tag_manager_or_err.takeError();
6519 llvm::Expected<std::vector<uint8_t>> tag_data =
6522 return tag_data.takeError();
6529 const std::vector<lldb::addr_t> &tags) {
6530 llvm::Expected<const MemoryTagManager *> tag_manager_or_err =
6532 if (!tag_manager_or_err)
6536 llvm::Expected<std::vector<uint8_t>> packed_tags =
6560 if (!dirty_page_list)
6566 llvm::AddressRange range(0, 0);
6567 for (
addr_t page_addr : *dirty_page_list) {
6568 if (range.empty()) {
6570 range = llvm::AddressRange(page_addr, page_addr + page_size);
6572 if (range.end() == page_addr) {
6574 range = llvm::AddressRange(range.start(), page_addr + page_size);
6578 ranges.
Append(range.start(), range.size(), {range, lldb_permissions});
6579 range = llvm::AddressRange(page_addr, page_addr + page_size);
6585 ranges.
Append(range.start(), range.size(), {range, lldb_permissions});
6615 std::set<addr_t> &stack_ends) {
6620 std::vector<MemoryRegionInfo> dynamic_loader_mem_regions;
6626 save_thread_predicate);
6627 for (
const auto ®ion : dynamic_loader_mem_regions) {
6630 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0)
6639 std::set<addr_t> &stack_ends) {
6640 const bool try_dirty_pages =
true;
6649 StackFrameSP frame_sp = thread_sp->GetStackFrameAtIndex(0);
6655 const addr_t sp = reg_ctx_sp->GetSP();
6656 const size_t red_zone = process.
GetABI()->GetRedZoneSize();
6659 const size_t stack_head = (
sp - red_zone);
6667 stack_ends.insert(range_end);
6671 AddRegion(sp_region, try_dirty_pages, ranges);
6682 std::set<addr_t> &stack_ends) {
6685 const bool try_dirty_pages =
false;
6686 for (
const auto ®ion : regions)
6687 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0)
6688 AddRegion(region, try_dirty_pages, ranges);
6698 std::set<addr_t> &stack_ends) {
6701 bool have_dirty_page_info =
false;
6702 for (
const auto ®ion : regions) {
6703 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0 &&
6705 have_dirty_page_info =
true;
6708 if (!have_dirty_page_info) {
6711 const bool try_dirty_pages =
false;
6712 for (
const auto ®ion : regions)
6713 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0 &&
6715 AddRegion(region, try_dirty_pages, ranges);
6730 std::set<addr_t> &stack_ends) {
6731 const bool try_dirty_pages =
true;
6735 for (
const auto ®ion : regions) {
6737 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0 &&
6739 AddRegion(region, try_dirty_pages, ranges);
6760 if (option_ranges.IsEmpty())
6763 for (
const auto &range : regions) {
6764 auto *entry = option_ranges.FindEntryThatIntersects(range.GetRange());
6766 if (*entry != range.GetRange()) {
6783 if (regions.empty())
6785 "failed to get any valid memory regions from the process");
6788 "callers must set the core_style to something other than "
6789 "eSaveCoreUnspecified");
6793 std::set<addr_t> stack_ends;
6805 switch (core_style) {
6828 "no valid address ranges found for core style");
6833std::vector<ThreadSP>
6835 std::vector<ThreadSP> thread_list;
6838 thread_list.push_back(thread_sp);
6849 if (low_memory_addr_bits == 0 && high_memory_addr_bits == 0)
6852 if (low_memory_addr_bits != 0) {
6859 if (high_memory_addr_bits != 0) {
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_LOGF(log,...)
#define LLDB_LOG_ERROR(log, error,...)
static void GetCoreFileSaveRangesFull(Process &process, const MemoryRegionInfos ®ions, CoreFileMemoryRanges &ranges, std::set< addr_t > &stack_ends)
static std::optional< ExpressionResults > HandleStoppedEvent(lldb::tid_t thread_id, const ThreadPlanSP &thread_plan_sp, RestorePlanState &restorer, const EventSP &event_sp, EventSP &event_to_broadcast_sp, const EvaluateExpressionOptions &options, bool handle_interrupts)
static void AddRegion(const MemoryRegionInfo ®ion, bool try_dirty_pages, CoreFileMemoryRanges &ranges)
static void SaveDynamicLoaderSections(Process &process, const SaveCoreOptions &options, CoreFileMemoryRanges &ranges, std::set< addr_t > &stack_ends)
static bool AddDirtyPages(const MemoryRegionInfo ®ion, CoreFileMemoryRanges &ranges)
static MemoryRegionInfo Intersect(const MemoryRegionInfo &lhs, const MemoryRegionInfo::RangeType &rhs)
static constexpr OptionEnumValueElement g_follow_fork_mode_values[]
static void GetUserSpecifiedCoreFileSaveRanges(Process &process, const MemoryRegionInfos ®ions, const SaveCoreOptions &options, CoreFileMemoryRanges &ranges)
static void GetCoreFileSaveRangesDirtyOnly(Process &process, const MemoryRegionInfos ®ions, CoreFileMemoryRanges &ranges, std::set< addr_t > &stack_ends)
static Timeout< std::micro > GetExpressionTimeout(const EvaluateExpressionOptions &options, bool before_first_timeout)
static microseconds GetOneThreadExpressionTimeout(const EvaluateExpressionOptions &options)
static CoreFileMemoryRange CreateCoreFileMemoryRange(const MemoryRegionInfo ®ion)
static void SaveOffRegionsWithStackPointers(Process &process, const SaveCoreOptions &core_options, const MemoryRegionInfos ®ions, CoreFileMemoryRanges &ranges, std::set< addr_t > &stack_ends)
static void GetCoreFileSaveRangesStackOnly(Process &process, const MemoryRegionInfos ®ions, CoreFileMemoryRanges &ranges, std::set< addr_t > &stack_ends)
#define LLDB_SCOPED_TIMER()
void SetIsRunning(bool running)
~IOHandlerProcessSTDIO() override=default
bool Interrupt() override
IOHandlerProcessSTDIO(Process *process, int write_fd)
ProcessExperimentalOptionValueProperties()
const Property * GetPropertyAtIndex(size_t idx, const ExecutionContext *exe_ctx) const override
ProcessOptionValueProperties(llvm::StringRef name)
lldb_private::Status Select()
void FDSetRead(lldb::socket_t fd)
bool FDIsSetRead(lldb::socket_t fd) const
static lldb::ABISP FindPlugin(lldb::ProcessSP process_sp, const ArchSpec &arch)
A section + offset based address range class.
Address & GetBaseAddress()
Get accessor for the base address of the range.
bool ContainsFileAddress(const Address &so_addr) const
Check if a section offset address is contained in this range.
lldb::addr_t GetByteSize() const
Get accessor for the byte size of this range.
A section + offset based address class.
lldb::addr_t GetLoadAddress(Target *target) const
Get the load address.
lldb::addr_t GetOpcodeLoadAddress(Target *target, AddressClass addr_class=AddressClass::eInvalid) const
Get the load address as an opcode load address.
bool IsValid() const
Check if the object state is valid.
Symbol * CalculateSymbolContextSymbol() const
A class which holds the metadata from a remote stub/corefile note about how many bits are used for ad...
uint32_t GetHighmemAddressableBits() const
static lldb::addr_t AddressableBitToMask(uint32_t addressable_bits)
uint32_t GetLowmemAddressableBits() const
An architecture specification class.
uint32_t GetAddressByteSize() const
Returns the size in bytes of an address of the current architecture.
bool IsValid() const
Tests if this ArchSpec is valid.
llvm::Triple & GetTriple()
Architecture triple accessor.
bool IsCompatibleMatch(const ArchSpec &rhs) const
Shorthand for IsMatch(rhs, CompatibleMatch).
bool IsExactMatch(const ArchSpec &rhs) const
Shorthand for IsMatch(rhs, ExactMatch).
lldb::ByteOrder GetByteOrder() const
Returns the byte order for the architecture specification.
virtual const MemoryTagManager * GetMemoryTagManager() const
A command line argument class.
Class that manages the actual breakpoint that will be inserted into the running program.
BreakpointSite::Type GetType() const
void SetType(BreakpointSite::Type type)
bool IntersectsRange(lldb::addr_t addr, size_t size, lldb::addr_t *intersect_addr, size_t *intersect_size, size_t *opcode_offset) const
Says whether addr and size size intersects with the address intersect_addr.
uint8_t * GetTrapOpcodeBytes()
Returns the Opcode Bytes for this breakpoint.
uint8_t * GetSavedOpcodeBytes()
Gets the original instruction bytes that were overwritten by the trap.
bool IsHardware() const override
bool IsEnabled() const
Tells whether the current breakpoint site is enabled or not.
void SetEnabled(bool enabled)
Sets whether the current breakpoint site is enabled or not.
Broadcaster(lldb::BroadcasterManagerSP manager_sp, std::string name)
Construct with a broadcaster with a name.
lldb::ListenerSP GetPrimaryListener()
void RestoreBroadcaster()
Restore the state of the Broadcaster from a previous hijack attempt.
void SetEventName(uint32_t event_mask, const char *name)
Set the name for an event bit.
bool HijackBroadcaster(const lldb::ListenerSP &listener_sp, uint32_t event_mask=UINT32_MAX)
Provides a simple mechanism to temporarily redirect events from broadcaster.
void BroadcastEventIfUnique(lldb::EventSP &event_sp)
void SetPrimaryListener(lldb::ListenerSP listener_sp)
const char * GetHijackingListenerName()
void BroadcastEvent(lldb::EventSP &event_sp)
Broadcast an event which has no associated data.
bool IsHijackedForEvent(uint32_t event_mask)
void CheckInWithManager()
A class that implements CRTP-based "virtual constructor" idiom.
Generic representation of a type in a programming language.
CompilerType GetBasicTypeFromAST(lldb::BasicType basic_type) const
Create related types using the current type's AST.
CompilerType GetPointerType() const
Return a new CompilerType that is a pointer to this type.
std::string GetString() const
Get the string value as a std::string.
const char * AsCString(const char *value_if_empty=nullptr) const
Get the string value as a C string.
Status FinalizeCoreFileSaveRanges()
Finalize and merge all overlapping ranges in this collection.
A subclass of DataBuffer that stores a data buffer on the heap.
lldb::offset_t SetByteSize(lldb::offset_t byte_size)
Set the number of bytes in the data buffer.
A class to manage flag bits.
static lldb::TargetSP FindTargetWithProcessID(lldb::pid_t pid)
lldb::StreamUP GetAsyncErrorStream()
TargetList & GetTargetList()
Get accessor for the target list.
bool IsTopIOHandler(const lldb::IOHandlerSP &reader_sp)
bool RemoveIOHandler(const lldb::IOHandlerSP &reader_sp)
Remove the given IO handler if it's currently active.
void RunIOHandlerAsync(const lldb::IOHandlerSP &reader_sp, bool cancel_top_handler=true)
Run the given IO handler and return immediately.
PlatformList & GetPlatformList()
lldb::ListenerSP GetListener()
size_t void PutString(lldb::Severity severity, llvm::StringRef str)
size_t Printf(lldb::Severity severity, const char *format,...) __attribute__((format(printf
static lldb::DisassemblerSP DisassembleRange(const ArchSpec &arch, const char *plugin_name, const char *flavor, const char *cpu, const char *features, Target &target, llvm::ArrayRef< AddressRange > disasm_ranges, bool force_live_memory=false)
Encapsulates dynamic check functions used by expressions.
A plug-in interface definition class for dynamic loaders.
virtual void DidAttach()=0
Called after attaching a process.
virtual void CalculateDynamicSaveCoreRanges(lldb_private::Process &process, std::vector< lldb_private::MemoryRegionInfo > &ranges, llvm::function_ref< bool(const lldb_private::Thread &)> save_thread_predicate)
Returns a list of memory ranges that should be saved in the core file, specific for this dynamic load...
virtual void DidLaunch()=0
Called after launching a process.
static DynamicLoader * FindPlugin(Process *process, llvm::StringRef plugin_name)
Find a dynamic loader plugin for a given process.
void SetUnwindOnError(bool unwind=false)
bool GetStopOthers() const
bool DoesIgnoreBreakpoints() const
bool IsForUtilityExpr() const
bool GetTryAllThreads() const
void SetTrapExceptions(bool b)
void SetTryAllThreads(bool try_others=true)
void SetTimeout(const Timeout< std::micro > &timeout)
void SetStopOthers(bool stop_others=true)
bool DoesUnwindOnError() const
const Timeout< std::micro > & GetTimeout() const
void SetIgnoreBreakpoints(bool ignore=false)
const Timeout< std::micro > & GetOneThreadTimeout() const
virtual llvm::StringRef GetFlavor() const =0
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
void SetFrameSP(const lldb::StackFrameSP &frame_sp)
Set accessor to set only the frame shared pointer.
void SetProcessPtr(Process *process)
Set accessor to set only the process shared pointer from a process pointer.
void SetThreadPtr(Thread *thread)
Set accessor to set only the thread shared pointer from a thread pointer.
void SetTargetPtr(Target *target)
Set accessor to set only the target shared pointer from a target pointer.
StackFrame & GetFrameRef() const
Returns a reference to the thread object.
bool HasFrameScope() const
Returns true the ExecutionContext object contains a valid target, process, thread and frame.
void SetFramePtr(StackFrame *frame)
Set accessor to set only the frame shared pointer from a frame pointer.
Process * GetProcessPtr() const
Returns a pointer to the process object.
Thread * GetThreadPtr() const
Returns a pointer to the thread object.
const ConstString & GetFilename() const
Filename string const get accessor.
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
static FileSystem & Instance()
An abstract base class for files.
bool Test(ValueType bit) const
Test a single flag bit.
bool GetIsOptimized()
Get whether compiler optimizations were enabled for this function.
static lldb::thread_t GetCurrentThread()
Get the thread token (the one returned by ThreadCreate when the thread was created) for the calling t...
IOHandler(Debugger &debugger, IOHandler::Type type)
uint32_t GetIndexOfInstructionAtAddress(const Address &addr)
lldb::InstructionSP GetInstructionAtIndex(size_t idx) const
uint32_t GetIndexOfNextBranchInstruction(uint32_t start, bool ignore_calls, bool *found_calls) const
Get the index of the next branch instruction.
static void ModulesDidLoad(lldb_private::ModuleList &module_list, Process *process, InstrumentationRuntimeCollection &runtimes)
Class used by the Process to hold a list of its JITLoaders.
void ModulesDidLoad(ModuleList &module_list)
static void LoadPlugins(Process *process, lldb_private::JITLoaderList &list)
Find a JIT loader plugin for a given process.
virtual lldb::LanguageType GetLanguageType() const =0
static LanguageRuntime * FindPlugin(Process *process, lldb::LanguageType language)
virtual bool CouldHaveDynamicValue(ValueObject &in_value)=0
static lldb::LanguageType GetPrimaryLanguage(lldb::LanguageType language)
static std::set< lldb::LanguageType > GetSupportedLanguages()
static lldb::ListenerSP MakeListener(const char *name)
void PutCString(const char *cstr)
void PutString(llvm::StringRef str)
static lldb::MemoryHistorySP FindPlugin(const lldb::ProcessSP process)
OptionalBool GetWritable() const
OptionalBool GetMapped() const
int GetPageSize() const
Get the target system's VM page size in bytes.
uint32_t GetLLDBPermissions() const
Range< lldb::addr_t, lldb::addr_t > RangeType
const std::optional< std::vector< lldb::addr_t > > & GetDirtyPageList() const
Get a vector of target VM pages that are dirty – that have been modified – within this memory region.
OptionalBool GetReadable() const
OptionalBool GetExecutable() const
void SetLLDBPermissions(uint32_t permissions)
virtual llvm::Expected< std::vector< lldb::addr_t > > UnpackTagsData(const std::vector< uint8_t > &tags, size_t granules=0) const =0
virtual lldb::addr_t GetGranuleSize() const =0
virtual llvm::Expected< std::vector< uint8_t > > PackTags(const std::vector< lldb::addr_t > &tags) const =0
virtual int32_t GetAllocationTagType() const =0
A collection class for Module objects.
A class that describes an executable image and its associated object and symbol files.
const FileSpec & GetFileSpec() const
Get const accessor for the module file specification.
A plug-in interface definition class for object file parsers.
A plug-in interface definition class for halted OS helpers.
virtual lldb::ThreadSP CreateThread(lldb::tid_t tid, lldb::addr_t context)
static OperatingSystem * FindPlugin(Process *process, const char *plugin_name)
Find a halted OS plugin for a given process.
virtual bool UpdateThreadList(ThreadList &old_thread_list, ThreadList &real_thread_list, ThreadList &new_thread_list)=0
virtual bool DoesPluginReportAllThreads()=0
auto GetPropertyAtIndexAs(size_t idx, const ExecutionContext *exe_ctx=nullptr) const
Property * ProtectedGetPropertyAtIndex(size_t idx)
bool SetPropertyAtIndex(size_t idx, T t, const ExecutionContext *exe_ctx=nullptr) const
static lldb::OptionValuePropertiesSP CreateLocalCopy(const Properties &global_properties)
virtual llvm::StringRef GetPluginName()=0
static ProcessCreateInstance GetProcessCreateCallbackAtIndex(uint32_t idx)
static ProcessCreateInstance GetProcessCreateCallbackForPluginName(llvm::StringRef name)
static StructuredDataPluginCreateInstance GetStructuredDataPluginCreateCallbackAtIndex(uint32_t idx)
static LanguageSet GetAllTypeSystemSupportedLanguagesForTypes()
uint32_t GetResumeCount() const
lldb::ListenerSP GetListenerForProcess(Debugger &debugger)
bool GetWaitForLaunch() const
ProcessExperimentalProperties()
lldb::pid_t GetProcessID() const
lldb::ListenerSP m_listener_sp
FileSpec & GetExecutableFile()
bool IsScriptedProcess() const
ArchSpec & GetArchitecture()
void SetNameMatchType(NameMatch name_match_type)
ProcessInstanceInfo & GetProcessInfo()
static void DumpTableHeader(Stream &s, bool show_args, bool verbose)
bool GetDetachKeepsStopped() const
bool TrackMemoryCacheChanges() const
bool GetSteppingRunsAllThreads() const
void SetStopOnSharedLibraryEvents(bool stop)
Args GetExtraStartupCommands() const
std::unique_ptr< ProcessExperimentalProperties > m_experimental_properties_up
FollowForkMode GetFollowForkMode() const
uint32_t GetVirtualAddressableBits() const
~ProcessProperties() override
void SetIgnoreBreakpointsInExpressions(bool ignore)
bool GetUnwindOnErrorInExpressions() const
std::chrono::seconds GetInterruptTimeout() const
bool GetDisableLangRuntimeUnwindPlans() const
void SetDetachKeepsStopped(bool keep_stopped)
void SetDisableLangRuntimeUnwindPlans(bool disable)
std::chrono::seconds GetUtilityExpressionTimeout() const
void SetVirtualAddressableBits(uint32_t bits)
bool GetStopOnSharedLibraryEvents() const
void SetHighmemVirtualAddressableBits(uint32_t bits)
void SetOSPluginReportsAllThreads(bool does_report)
bool GetWarningsOptimization() const
void DisableLanguageRuntimeUnwindPlansCallback()
void SetUnwindOnErrorInExpressions(bool ignore)
bool GetDisableMemoryCache() const
FileSpec GetPythonOSPluginPath() const
bool GetStopOnExec() const
void SetPythonOSPluginPath(const FileSpec &file)
void SetExtraStartupCommands(const Args &args)
bool GetOSPluginReportsAllThreads() const
bool GetWarningsUnsupportedLanguage() const
uint32_t GetHighmemVirtualAddressableBits() const
bool GetIgnoreBreakpointsInExpressions() const
uint64_t GetMemoryCacheLineSize() const
ProcessProperties(lldb_private::Process *process)
A class used to prevent the process from starting while other threads are accessing its data,...
EventActionResult HandleBeingInterrupted() override
const char * GetExitString() override
EventActionResult PerformAction(lldb::EventSP &event_sp) override
AttachCompletionHandler(Process *process, uint32_t exec_count)
std::string m_exit_string
NextEventAction(Process *process)
lldb::ProcessWP m_process_wp
static bool GetRestartedFromEvent(const Event *event_ptr)
virtual bool ShouldStop(Event *event_ptr, bool &found_valid_stopinfo)
void SetUpdateStateOnRemoval()
static void AddRestartedReason(Event *event_ptr, const char *reason)
void SetInterrupted(bool new_value)
lldb::ProcessSP GetProcessSP() const
void SetRestarted(bool new_value)
static void SetRestartedInEvent(Event *event_ptr, bool new_value)
static lldb::ProcessSP GetProcessFromEvent(const Event *event_ptr)
static void SetInterruptedInEvent(Event *event_ptr, bool new_value)
bool ForwardEventToPendingListeners(Event *event_ptr) override
This will be queried for a Broadcaster with a primary and some secondary listeners after the primary ...
llvm::StringRef GetFlavor() const override
~ProcessEventData() override
bool GetInterrupted() const
bool GetRestarted() const
size_t GetNumRestartedReasons()
static bool GetInterruptedFromEvent(const Event *event_ptr)
const char * GetRestartedReasonAtIndex(size_t idx)
static bool SetUpdateStateOnRemoval(Event *event_ptr)
static lldb::StateType GetStateFromEvent(const Event *event_ptr)
lldb::StateType GetState() const
static const Process::ProcessEventData * GetEventDataFromEvent(const Event *event_ptr)
static llvm::StringRef GetFlavorString()
void DoOnRemoval(Event *event_ptr) override
void Dump(Stream *s) const override
A plug-in interface definition class for debugging a process.
virtual Status EnableBreakpointSite(BreakpointSite *bp_site)
Status WillAttachToProcessWithName(const char *process_name, bool wait_for_launch)
Called before attaching to a process.
virtual llvm::Expected< TraceSupportedResponse > TraceSupported()
Get the processor tracing type supported for this process.
lldb::IOHandlerSP m_process_input_reader
friend class ProcessProperties
UtilityFunction * GetLoadImageUtilityFunction(Platform *platform, llvm::function_ref< std::unique_ptr< UtilityFunction >()> factory)
Get the cached UtilityFunction that assists in loading binary images into the process.
virtual Status DoSignal(int signal)
Sends a process a UNIX signal signal.
virtual Status WillResume()
Called before resuming to a process.
std::mutex m_process_input_reader_mutex
lldb::addr_t m_code_address_mask
Mask for code an data addresses.
StopPointSiteList< lldb_private::BreakpointSite > & GetBreakpointSiteList()
std::vector< lldb::addr_t > m_image_tokens
bool PrivateStateThreadIsValid() const
virtual Status DoHalt(bool &caused_stop)
Halts a running process.
virtual void DidLaunch()
Called after launching a process.
virtual Status DisableSoftwareBreakpoint(BreakpointSite *bp_site)
lldb::pid_t GetID() const
Returns the pid of the process or LLDB_INVALID_PROCESS_ID if there is no known pid.
lldb::break_id_t CreateBreakpointSite(const lldb::BreakpointLocationSP &owner, bool use_hardware)
virtual Status WillSignal()
Called before sending a signal to a process.
void ResetImageToken(size_t token)
lldb::JITLoaderListUP m_jit_loaders_up
lldb::addr_t CallocateMemory(size_t size, uint32_t permissions, Status &error)
The public interface to allocating memory in the process, this also clears the allocated memory.
void SetNextEventAction(Process::NextEventAction *next_event_action)
Status Destroy(bool force_kill)
Kills the process and shuts down all threads that were spawned to track and monitor the process.
virtual Status WillDetach()
Called before detaching from a process.
virtual Status DoLaunch(Module *exe_module, ProcessLaunchInfo &launch_info)
Launch a new process.
StopPointSiteList< lldb_private::BreakpointSite > m_breakpoint_site_list
This is the list of breakpoint locations we intend to insert in the target.
void ControlPrivateStateThread(uint32_t signal)
ThreadList & GetThreadList()
void SetAddressableBitMasks(AddressableBits bit_masks)
void ClearPreResumeActions()
virtual DataExtractor GetAuxvData()
Process(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp)
Construct with a shared pointer to a target, and the Process listener.
lldb::ExpressionResults RunThreadPlan(ExecutionContext &exe_ctx, lldb::ThreadPlanSP &thread_plan_sp, const EvaluateExpressionOptions &options, DiagnosticManager &diagnostic_manager)
void PrintWarningUnsupportedLanguage(const SymbolContext &sc)
Print a user-visible warning about a function written in a language that this version of LLDB doesn't...
lldb::StateType GetPrivateState()
Status LaunchPrivate(ProcessLaunchInfo &launch_info, lldb::StateType &state, lldb::EventSP &event_sp)
std::vector< std::string > m_profile_data
bool m_can_interpret_function_calls
Status Resume()
Resumes all of a process's threads as configured using the Thread run control functions.
void PruneThreadPlans()
Prune ThreadPlanStacks for all unreported threads.
void SetUnixSignals(lldb::UnixSignalsSP &&signals_sp)
std::string m_stdout_data
Remember if stdin must be forwarded to remote debug server.
bool RemoveInvalidMemoryRange(const LoadRange ®ion)
uint32_t GetNextThreadIndexID(uint64_t thread_id)
Status PrivateResume()
The "private" side of resuming a process.
void SetDynamicCheckers(DynamicCheckerFunctions *dynamic_checkers)
void SendAsyncInterrupt(Thread *thread=nullptr)
Send an async interrupt request.
void AddInvalidMemoryRegion(const LoadRange ®ion)
virtual void ModulesDidLoad(ModuleList &module_list)
InstrumentationRuntimeCollection m_instrumentation_runtimes
std::atomic< bool > m_destructing
virtual Status DoGetMemoryRegionInfo(lldb::addr_t load_addr, MemoryRegionInfo &range_info)
DoGetMemoryRegionInfo is called by GetMemoryRegionInfo after it has removed non address bits from loa...
@ eBroadcastInternalStateControlResume
@ eBroadcastInternalStateControlStop
@ eBroadcastInternalStateControlPause
int GetExitStatus()
Get the exit status for a process.
OperatingSystem * GetOperatingSystem()
Status WillAttachToProcessWithID(lldb::pid_t pid)
Called before attaching to a process.
virtual Status DoDetach(bool keep_stopped)
Detaches from a running or stopped process.
std::unique_ptr< UtilityFunction > m_dlopen_utility_func_up
void SetRunningUtilityFunction(bool on)
void DisableAllBreakpointSites()
uint32_t m_process_unique_id
Each lldb_private::Process class that is created gets a unique integer ID that increments with each n...
int64_t ReadSignedIntegerFromMemory(lldb::addr_t load_addr, size_t byte_size, int64_t fail_value, Status &error)
Address AdvanceAddressToNextBranchInstruction(Address default_stop_addr, AddressRange range_bounds)
Find the next branch instruction to set a breakpoint on.
virtual bool GetLoadAddressPermissions(lldb::addr_t load_addr, uint32_t &permissions)
Attempt to get the attributes for a region of memory in the process.
static bool HandleProcessStateChangedEvent(const lldb::EventSP &event_sp, Stream *stream, SelectMostRelevant select_most_relevant, bool &pop_process_io_handler)
Centralize the code that handles and prints descriptions for process state changes.
virtual size_t GetAsyncProfileData(char *buf, size_t buf_size, Status &error)
Get any available profile data.
lldb::addr_t FixDataAddress(lldb::addr_t pc)
lldb::addr_t AllocateMemory(size_t size, uint32_t permissions, Status &error)
The public interface to allocating memory in the process.
std::unique_ptr< NextEventAction > m_next_event_action_up
void SetHighmemDataAddressMask(lldb::addr_t data_address_mask)
bool PruneThreadPlansForTID(lldb::tid_t tid)
Prune ThreadPlanStacks for unreported threads.
virtual void DidDetach()
Called after detaching from a process.
std::function< IterationAction(lldb_private::Status &error, lldb::addr_t bytes_addr, const void *bytes, lldb::offset_t bytes_size)> ReadMemoryChunkCallback
void PausePrivateStateThread()
HostThread m_private_state_thread
Thread ID for the thread that watches internal state events.
Status EnableBreakpointSiteByID(lldb::user_id_t break_id)
ProcessModID GetModID() const
Get the Modification ID of the process.
size_t ReadMemoryFromInferior(lldb::addr_t vm_addr, void *buf, size_t size, Status &error)
Read of memory from a process.
size_t ReadScalarIntegerFromMemory(lldb::addr_t addr, uint32_t byte_size, bool is_signed, Scalar &scalar, Status &error)
virtual Status Launch(ProcessLaunchInfo &launch_info)
Launch a new process.
std::mutex m_run_thread_plan_lock
static void SettingsInitialize()
void BroadcastStructuredData(const StructuredData::ObjectSP &object_sp, const lldb::StructuredDataPluginSP &plugin_sp)
Broadcasts the given structured data object from the given plugin.
void Flush()
Flush all data in the process.
bool m_clear_thread_plans_on_stop
ProcessRunLock m_public_run_lock
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 ResumePrivateStateThread()
void MapSupportedStructuredDataPlugins(const StructuredData::Array &supported_type_names)
Loads any plugins associated with asynchronous structured data and maps the relevant supported type n...
bool GetEventsPrivate(lldb::EventSP &event_sp, const Timeout< std::micro > &timeout, bool control_only)
lldb::ABISP m_abi_sp
This is the current signal set for this process.
virtual void DidSignal()
Called after sending a signal to a process.
virtual SystemRuntime * GetSystemRuntime()
Get the system runtime plug-in for this process.
std::map< uint64_t, uint32_t > m_thread_id_to_index_id_map
bool DumpThreadPlansForTID(Stream &strm, lldb::tid_t tid, lldb::DescriptionLevel desc_level, bool internal, bool condense_trivial, bool skip_unreported_plans)
Dump the thread plans associated with thread with tid.
lldb::ListenerSP m_private_state_listener_sp
uint32_t m_extended_thread_stop_id
The natural stop id when extended_thread_list was last updated.
bool PreResumeActionCallback(void *)
lldb::RunDirection m_base_direction
ThreadPlanBase run direction.
Range< lldb::addr_t, lldb::addr_t > LoadRange
static constexpr llvm::StringRef ResumeSynchronousHijackListenerName
bool WritePointerToMemory(lldb::addr_t vm_addr, lldb::addr_t ptr_value, Status &error)
QueueList m_queue_list
The list of libdispatch queues at a given stop point.
void ClearPreResumeAction(PreResumeActionCallback callback, void *baton)
virtual Status WillDestroy()
lldb::ThreadSP CreateOSPluginThread(lldb::tid_t tid, lldb::addr_t context)
std::vector< PreResumeCallbackAndBaton > m_pre_resume_actions
void SetCanJIT(bool can_jit)
Sets whether executing JIT-compiled code in this process is possible.
lldb::StateType GetStateChangedEventsPrivate(lldb::EventSP &event_sp, const Timeout< std::micro > &timeout)
void LoadOperatingSystemPlugin(bool flush)
lldb::StructuredDataPluginSP GetStructuredDataPlugin(llvm::StringRef type_name) const
Returns the StructuredDataPlugin associated with a given type name, if there is one.
lldb::DynamicLoaderUP m_dyld_up
friend class ProcessEventData
void ResetExtendedCrashInfoDict()
AddressRanges FindRangesInMemory(const uint8_t *buf, uint64_t size, const AddressRanges &ranges, size_t alignment, size_t max_matches, Status &error)
virtual bool GetModuleSpec(const FileSpec &module_file_spec, const ArchSpec &arch, ModuleSpec &module_spec)
Try to fetch the module specification for a module with the given file name and architecture.
virtual size_t DoWriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size, Status &error)
Actually do the writing of memory to a process.
virtual Status WriteObjectFile(std::vector< ObjectFile::LoadableData > entries)
std::recursive_mutex m_stdio_communication_mutex
static lldb::ProcessSP FindPlugin(lldb::TargetSP target_sp, llvm::StringRef plugin_name, lldb::ListenerSP listener_sp, const FileSpec *crash_file_path, bool can_connect)
Find a Process plug-in that can debug module using the currently selected architecture.
StopPointSiteList< lldb_private::WatchpointResource > m_watchpoint_resource_list
Watchpoint resources currently in use.
Status DisableBreakpointSiteByID(lldb::user_id_t break_id)
llvm::Expected< const MemoryTagManager * > GetMemoryTagManager()
If this architecture and process supports memory tagging, return a tag manager that can be used to ma...
~Process() override
Destructor.
virtual Status DoWriteMemoryTags(lldb::addr_t addr, size_t len, int32_t type, const std::vector< uint8_t > &tags)
Does the final operation to write memory tags.
std::recursive_mutex m_profile_data_comm_mutex
lldb::InstrumentationRuntimeSP GetInstrumentationRuntime(lldb::InstrumentationRuntimeType type)
Status ResumeSynchronous(Stream *stream)
Resume a process, and wait for it to stop.
lldb::addr_t FixAnyAddress(lldb::addr_t pc)
Use this method when you do not know, or do not care what kind of address you are fixing.
lldb::thread_result_t RunPrivateStateThread(bool is_secondary_thread)
virtual Status DoWillLaunch(Module *module)
Called before launching to a process.
virtual Status ConnectRemote(llvm::StringRef remote_url)
Attach to a remote system via a URL.
void AppendSTDOUT(const char *s, size_t len)
llvm::StringMap< lldb::StructuredDataPluginSP > m_structured_data_plugin_map
virtual Status DisableBreakpointSite(BreakpointSite *bp_site)
size_t GetThreadStatus(Stream &ostrm, bool only_threads_with_stop_reason, uint32_t start_frame, uint32_t num_frames, uint32_t num_frames_with_source, bool stop_format)
void CalculateExecutionContext(ExecutionContext &exe_ctx) override
Reconstruct the object's execution context into sc.
virtual size_t ReadMemory(lldb::addr_t vm_addr, void *buf, size_t size, Status &error)
Read of memory from a process.
Event * PeekAtStateChangedEvents()
std::vector< Notifications > m_notifications
The list of notifications that this process can deliver.
bool HasAssignedIndexIDToThread(uint64_t sb_thread_id)
ThreadSafeValue< lldb::StateType > m_private_state
void StopPrivateStateThread()
size_t AddImageToken(lldb::addr_t image_ptr)
virtual void DoFindInMemory(lldb::addr_t start_addr, lldb::addr_t end_addr, const uint8_t *buf, size_t size, AddressRanges &matches, size_t alignment, size_t max_matches)
virtual bool DestroyRequiresHalt()
lldb::EventSP CreateEventFromProcessState(uint32_t event_type)
StructuredData::DictionarySP m_crash_info_dict_sp
A repository for extra crash information, consulted in GetExtendedCrashInformation.
Status CalculateCoreFileSaveRanges(const SaveCoreOptions &core_options, CoreFileMemoryRanges &ranges)
Helper function for Process::SaveCore(...) that calculates the address ranges that should be saved.
lldb::TargetSP CalculateTarget() override
void SetHighmemCodeAddressMask(lldb::addr_t code_address_mask)
lldb::ByteOrder GetByteOrder() const
Status Detach(bool keep_stopped)
Detaches from a running or stopped process.
void UpdateThreadListIfNeeded()
virtual llvm::Expected< std::vector< lldb::addr_t > > ReadMemoryTags(lldb::addr_t addr, size_t len)
Read memory tags for the range addr to addr+len.
virtual void DidResume()
Called after resuming a process.
virtual void DidExec()
Called after a process re-execs itself.
void SetCodeAddressMask(lldb::addr_t code_address_mask)
AllocatedMemoryCache m_allocated_memory_cache
virtual Status LoadCore()
std::mutex m_exit_status_mutex
Mutex so m_exit_status m_exit_string can be safely accessed from multiple threads.
Status Signal(int signal)
Sends a process a UNIX signal signal.
void SetDynamicLoader(lldb::DynamicLoaderUP dyld)
ThreadPlanStackMap m_thread_plans
This is the list of thread plans for threads in m_thread_list, as well as threads we knew existed,...
std::recursive_mutex m_thread_mutex
virtual Status ConfigureStructuredData(llvm::StringRef type_name, const StructuredData::ObjectSP &config_sp)
Configure asynchronous structured data feature.
virtual Status DoWillAttachToProcessWithName(const char *process_name, bool wait_for_launch)
Called before attaching to a process.
bool m_currently_handling_do_on_removals
bool StartPrivateStateThread(bool is_secondary_thread=false)
void HandlePrivateEvent(lldb::EventSP &event_sp)
void BroadcastAsyncProfileData(const std::string &one_profile_data)
lldb::StateType GetState()
Get accessor for the current process state.
virtual Status DoWillAttachToProcessWithID(lldb::pid_t pid)
Called before attaching to a process.
ProcessRunLock & GetRunLock()
virtual Status DoLoadCore()
Predicate< uint32_t > m_iohandler_sync
LanguageRuntimeCollection m_language_runtimes
Should we detach if the process object goes away with an explicit call to Kill or Detach?
virtual Status GetMemoryRegions(lldb_private::MemoryRegionInfos ®ion_list)
Obtain all the mapped memory regions within this process.
size_t WriteMemoryPrivate(lldb::addr_t addr, const void *buf, size_t size, Status &error)
void GetStatus(Stream &ostrm)
void SetRunningUserExpression(bool on)
enum lldb_private::Process::@120260360120067272255351105340035202127223005263 m_can_jit
bool IsPossibleDynamicValue(ValueObject &in_value)
bool CurrentThreadPosesAsPrivateStateThread()
static bool SetProcessExitStatus(lldb::pid_t pid, bool exited, int signo, int status)
Static function that can be used with the host function Host::StartMonitoringChildProcess ().
void RemoveConstituentFromBreakpointSite(lldb::user_id_t site_id, lldb::user_id_t constituent_id, lldb::BreakpointSiteSP &bp_site_sp)
lldb::addr_t FindInMemory(lldb::addr_t low, lldb::addr_t high, const uint8_t *buf, size_t size)
Find a pattern within a memory region.
lldb::OperatingSystemUP m_os_up
uint32_t GetLastNaturalStopID() const
lldb::StateType WaitForProcessToStop(const Timeout< std::micro > &timeout, lldb::EventSP *event_sp_ptr=nullptr, bool wait_always=true, lldb::ListenerSP hijack_listener=lldb::ListenerSP(), Stream *stream=nullptr, bool use_run_lock=true, SelectMostRelevant select_most_relevant=DoNoSelectMostRelevantFrame)
lldb::UnixSignalsSP m_unix_signals_sp
bool StateChangedIsHijackedForSynchronousResume()
const char * GetExitDescription()
Get a textual description of what the process exited.
void SetPublicState(lldb::StateType new_state, bool restarted)
lldb::tid_t m_interrupt_tid
void SetDataAddressMask(lldb::addr_t data_address_mask)
virtual Status DoConnectRemote(llvm::StringRef remote_url)
Attach to a remote system via a URL.
uint64_t ReadUnsignedIntegerFromMemory(lldb::addr_t load_addr, size_t byte_size, uint64_t fail_value, Status &error)
Reads an unsigned integer of the specified byte size from process memory.
llvm::once_flag m_dlopen_utility_func_flag_once
virtual void UpdateQueueListIfNeeded()
virtual Status UpdateAutomaticSignalFiltering()
virtual lldb::addr_t GetImageInfoAddress()
Get the image information address for the current process.
std::map< lldb::addr_t, lldb::addr_t > m_resolved_indirect_addresses
This helps with the Public event coalescing in ShouldBroadcastEvent.
virtual Status DoAttachToProcessWithID(lldb::pid_t pid, const ProcessAttachInfo &attach_info)
Attach to an existing process using a process ID.
void SetCanRunCode(bool can_run_code)
Sets whether executing code in this process is possible.
Status ClearBreakpointSiteByID(lldb::user_id_t break_id)
virtual Status EnableSoftwareBreakpoint(BreakpointSite *bp_site)
void AppendSTDERR(const char *s, size_t len)
bool GetShouldDetach() const
static llvm::StringRef GetStaticBroadcasterClass()
uint32_t m_thread_index_id
Each thread is created with a 1 based index that won't get re-used.
bool ProcessIOHandlerExists() const
virtual Status DoResume(lldb::RunDirection direction)
Resumes all of a process's threads as configured using the Thread run control functions.
bool RouteAsyncStructuredData(const StructuredData::ObjectSP object_sp)
Route the incoming structured data dictionary to the right plugin.
virtual void DidDestroy()
lldb::offset_t ReadMemoryInChunks(lldb::addr_t vm_addr, void *buf, lldb::addr_t chunk_size, lldb::offset_t total_size, ReadMemoryChunkCallback callback)
Read of memory from a process in discrete chunks, terminating either when all bytes are read,...
lldb::addr_t ReadPointerFromMemory(lldb::addr_t vm_addr, Status &error)
Broadcaster m_private_state_control_broadcaster
lldb::addr_t GetHighmemCodeAddressMask()
The highmem masks are for targets where we may have different masks for low memory versus high memory...
bool PushProcessIOHandler()
size_t RemoveBreakpointOpcodesFromBuffer(lldb::addr_t addr, size_t size, uint8_t *buf) const
Broadcaster m_private_state_broadcaster
virtual bool DetachRequiresHalt()
virtual bool IsAlive()
Check if a process is still alive.
bool m_destroy_in_process
ThreadList m_thread_list_real
The threads for this process as are known to the protocol we are debugging with.
ThreadSafeValue< lldb::StateType > m_public_state
lldb::addr_t m_data_address_mask
virtual ArchSpec GetSystemArchitecture()
Get the system architecture for this process.
Status DeallocateMemory(lldb::addr_t ptr)
The public interface to deallocating memory in the process.
virtual Status DisableWatchpoint(lldb::WatchpointSP wp_sp, bool notify=true)
void RegisterNotificationCallbacks(const Process::Notifications &callbacks)
Register for process and thread notifications.
virtual void DidAttach(ArchSpec &process_arch)
Called after attaching a process.
virtual lldb::addr_t ResolveIndirectFunction(const Address *address, Status &error)
Resolve dynamically loaded indirect functions.
lldb::StateType m_last_broadcast_state
LanguageRuntime * GetLanguageRuntime(lldb::LanguageType language)
ProcessModID m_mod_id
Tracks the state of the process over stops and other alterations.
void SetID(lldb::pid_t new_pid)
Sets the stored pid.
virtual JITLoaderList & GetJITLoaders()
uint32_t AssignIndexIDToThread(uint64_t thread_id)
virtual bool SetExitStatus(int exit_status, llvm::StringRef exit_string)
Set accessor for the process exit status (return code).
uint32_t m_queue_list_stop_id
The natural stop id when queue list was last fetched.
void PrintWarningOptimization(const SymbolContext &sc)
Print a user-visible warning about a module being built with optimization.
@ eBroadcastBitStructuredData
@ eBroadcastBitStateChanged
@ eBroadcastBitProfileData
ProcessRunLock m_private_run_lock
virtual std::optional< bool > DoGetWatchpointReportedAfter()
Provide an override value in the subclass for lldb's CPU-based logic for whether watchpoint exception...
static ProcessProperties & GetGlobalProperties()
lldb::addr_t m_highmem_code_address_mask
lldb::addr_t GetImagePtrFromToken(size_t token) const
int m_exit_status
The exit status of the process, or -1 if not set.
std::vector< LanguageRuntime * > GetLanguageRuntimes()
void SetShouldDetach(bool b)
MemoryCache m_memory_cache
static void STDIOReadThreadBytesReceived(void *baton, const void *src, size_t src_len)
virtual bool GetProcessInfo(ProcessInstanceInfo &info)
virtual void DidHalt()
Called after halting a process.
lldb::addr_t FixCodeAddress(lldb::addr_t pc)
Some targets might use bits in a code address to indicate a mode switch, ARM uses bit zero to signify...
lldb::StateType WaitForProcessStopPrivate(lldb::EventSP &event_sp, const Timeout< std::micro > &timeout)
void RestoreProcessEvents()
Restores the process event broadcasting to its normal state.
virtual bool SupportsMemoryTagging()
Check whether the process supports memory tagging.
void DumpThreadPlans(Stream &strm, lldb::DescriptionLevel desc_level, bool internal, bool condense_trivial, bool skip_unreported_plans)
Dump all the thread plans for this process.
uint32_t GetAddressByteSize() const
uint32_t GetStopID() const
void SetPrivateState(lldb::StateType state)
lldb::addr_t m_highmem_data_address_mask
virtual Status DoDestroy()=0
Status StopForDestroyOrDetach(lldb::EventSP &exit_event_sp)
bool GetWatchpointReportedAfter()
Whether lldb will be notified about watchpoints after the instruction has completed executing,...
lldb::StateType GetNextEvent(lldb::EventSP &event_sp)
virtual bool DoUpdateThreadList(ThreadList &old_thread_list, ThreadList &new_thread_list)=0
Update the thread list following process plug-in's specific logic.
virtual llvm::Expected< std::vector< uint8_t > > DoReadMemoryTags(lldb::addr_t addr, size_t len, int32_t type)
Does the final operation to read memory tags.
bool StateChangedIsExternallyHijacked()
bool RunPreResumeActions()
bool PopProcessIOHandler()
virtual size_t GetSTDERR(char *buf, size_t buf_size, Status &error)
Get any available STDERR.
size_t WriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size, Status &error)
Write memory to a process.
virtual llvm::Expected< bool > SaveCore(llvm::StringRef outfile)
Save core dump into the specified file.
bool ProcessIOHandlerIsActive()
Status DestroyImpl(bool force_kill)
bool m_force_next_event_delivery
lldb::SystemRuntimeUP m_system_runtime_up
virtual Status WillHalt()
Called before halting to a process.
bool ShouldBroadcastEvent(Event *event_ptr)
This is the part of the event handling that for a process event.
virtual DynamicLoader * GetDynamicLoader()
Get the dynamic loader plug-in for this process.
std::string m_exit_string
A textual description of why a process exited.
lldb::DynamicCheckerFunctionsUP m_dynamic_checkers_up
The functions used by the expression parser to validate data that expressions use.
void SyncIOHandler(uint32_t iohandler_id, const Timeout< std::micro > &timeout)
Waits for the process state to be running within a given msec timeout.
void ForceNextEventDelivery()
ThreadPlanStack * FindThreadPlans(lldb::tid_t tid)
Find the thread plan stack associated with thread with tid.
void SetSTDIOFileDescriptor(int file_descriptor)
virtual Status Attach(ProcessAttachInfo &attach_info)
Attach to an existing process using the process attach info.
virtual void Finalize(bool destructing)
This object is about to be destroyed, do any necessary cleanup.
lldb::addr_t GetDataAddressMask()
void SynchronouslyNotifyStateChanged(lldb::StateType state)
bool CanJIT()
Determines whether executing JIT-compiled code in this process is possible.
virtual lldb_private::UUID FindModuleUUID(const llvm::StringRef path)
virtual Status DoAttachToProcessWithName(const char *process_name, const ProcessAttachInfo &attach_info)
Attach to an existing process using a partial process name.
ThreadList m_thread_list
The threads for this process as the user will see them.
bool UpdateThreadList(ThreadList &old_thread_list, ThreadList &new_thread_list)
Update the thread list.
const lldb::UnixSignalsSP & GetUnixSignals()
void SetBaseDirection(lldb::RunDirection direction)
Set the base run direction for the process.
Status WriteMemoryTags(lldb::addr_t addr, size_t len, const std::vector< lldb::addr_t > &tags)
Write memory tags for a range of memory.
virtual size_t DoReadMemory(lldb::addr_t vm_addr, void *buf, size_t size, Status &error)=0
Actually do the reading of memory from a process.
virtual bool IsLiveDebugSession() const
Check if a process is a live debug session, or a corefile/post-mortem.
std::weak_ptr< Target > m_target_wp
The target that owns this process.
virtual void DoDidExec()
Subclasses of Process should implement this function if they need to do anything after a process exec...
virtual void RefreshStateAfterStop()=0
Currently called as part of ShouldStop.
virtual llvm::SmallVector< llvm::MutableArrayRef< uint8_t > > ReadMemoryRanges(llvm::ArrayRef< Range< lldb::addr_t, size_t > > ranges, llvm::MutableArrayRef< uint8_t > buffer)
Read from multiple memory ranges and write the results into buffer.
lldb::addr_t GetCodeAddressMask()
Get the current address mask in the Process.
bool UnregisterNotificationCallbacks(const Process::Notifications &callbacks)
Unregister for process and thread notifications.
bool HijackProcessEvents(lldb::ListenerSP listener_sp)
If you need to ensure that you and only you will hear about some public event, then make a new listen...
Status GetMemoryRegionInfo(lldb::addr_t load_addr, MemoryRegionInfo &range_info)
Locate the memory region that contains load_addr.
friend class DynamicLoader
static void SettingsTerminate()
lldb::addr_t GetHighmemDataAddressMask()
ThreadList m_extended_thread_list
Constituent for extended threads that may be generated, cleared on natural stops.
bool CallVoidArgVoidPtrReturn(const Address *address, lldb::addr_t &returned_func, bool trap_exceptions=false)
bool CurrentThreadIsPrivateStateThread()
void AddPreResumeAction(PreResumeActionCallback callback, void *baton)
size_t GetSoftwareBreakpointTrapOpcode(BreakpointSite *bp_site)
Status Halt(bool clear_thread_plans=false, bool use_run_lock=true)
Halts a running process.
const lldb::ABISP & GetABI()
Status WillLaunch(Module *module)
Called before launching to a process.
lldb::ModuleSP ReadModuleFromMemory(const FileSpec &file_spec, lldb::addr_t header_addr, size_t size_to_read=512)
std::vector< lldb::ThreadSP > CalculateCoreFileThreadList(const SaveCoreOptions &core_options)
Helper function for Process::SaveCore(...) that calculates the thread list based upon options set wit...
size_t WriteScalarToMemory(lldb::addr_t vm_addr, const Scalar &scalar, size_t size, Status &error)
Write all or part of a scalar value to memory.
virtual size_t GetSTDOUT(char *buf, size_t buf_size, Status &error)
Get any available STDOUT.
lldb::ThreadCollectionSP GetHistoryThreads(lldb::addr_t addr)
lldb::StateType GetStateChangedEvents(lldb::EventSP &event_sp, const Timeout< std::micro > &timeout, lldb::ListenerSP hijack_listener)
ThreadedCommunication m_stdio_communication
std::atomic< bool > m_finalizing
The tid of the thread that issued the async interrupt, used by thread plan timeout.
std::recursive_mutex m_language_runtimes_mutex
std::string m_stderr_data
Target & GetTarget()
Get the target object pointer for this module.
virtual Status EnableWatchpoint(lldb::WatchpointSP wp_sp, bool notify=true)
lldb::OptionValuePropertiesSP m_collection_sp
T GetPropertyAtIndexAs(uint32_t idx, T default_value, const ExecutionContext *exe_ctx=nullptr) const
static llvm::StringRef GetExperimentalSettingsName()
bool SetPropertyAtIndex(uint32_t idx, T t, const ExecutionContext *exe_ctx=nullptr) const
lldb::OptionValuePropertiesSP GetValueProperties() const
const lldb::OptionValueSP & GetValue() const
void Append(const Entry &entry)
uint64_t GetPC(uint64_t fail_value=LLDB_INVALID_ADDRESS)
lldb::SaveCoreStyle GetStyle() const
bool HasSpecifiedThreads() const
const MemoryRanges & GetCoreFileMemoryRanges() const
bool ShouldThreadBeSaved(lldb::tid_t tid) const
size_t GetByteSize() const
bool SignExtend(uint32_t bit_pos)
unsigned long long ULongLong(unsigned long long fail_value=0) const
size_t GetAsMemoryData(void *dst, size_t dst_len, lldb::ByteOrder dst_byte_order, Status &error) const
long long SLongLong(long long fail_value=0) const
This base class provides an interface to stack frames.
void CalculateExecutionContext(ExecutionContext &exe_ctx) override
Reconstruct the object's execution context into sc.
void Clear()
Clear the object state.
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
bool Fail() const
Test for error condition.
const char * AsCString(const char *default_error_str="unknown error") const
Get the error string associated with the current error.
static Status FromError(llvm::Error error)
Avoid using this in new code. Migrate APIs to llvm::Expected instead.
bool Success() const
Test for success condition.
static lldb::ValueObjectSP GetCrashingDereference(lldb::StopInfoSP &stop_info_sp, lldb::addr_t *crashing_address=nullptr)
void ForEach(std::function< void(StopPointSite *)> const &callback)
lldb::break_id_t GetID() const
virtual lldb::addr_t GetLoadAddress() const
uint32_t GetByteSize() const
const char * GetData() const
llvm::StringRef GetString() const
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.
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
bool ForEach(std::function< bool(Object *object)> const &foreach_callback) const
bool GetValueForKeyAsString(llvm::StringRef key, llvm::StringRef &result) const
Dictionary * GetAsDictionary()
A class which can hold structured data.
std::shared_ptr< Object > ObjectSP
Defines a symbol context baton that can be handed other debug core functions.
lldb::LanguageType GetLanguage() const
Function * function
The Function for a given query.
lldb::ModuleSP module_sp
The Module for a given query.
lldb::addr_t GetLoadAddress(Target *target) const
ConstString GetName() const
Address GetAddress() const
A plug-in interface definition class for system runtimes.
virtual void DidAttach()
Called after attaching to a process.
void ModulesDidLoad(const ModuleList &module_list) override
Called when modules have been loaded in the process.
virtual void DidLaunch()
Called after launching a process.
static SystemRuntime * FindPlugin(Process *process)
Find a system runtime plugin for a given process.
uint32_t GetIndexOfTarget(lldb::TargetSP target_sp) const
lldb::TargetSP GetSelectedTarget()
bool SetPreferDynamicValue(lldb::DynamicValueType d)
bool GetUseFastStepping() const
lldb::DynamicValueType GetPreferDynamicValue() const
void SetFirstPrivateStopTime()
void SetFirstPublicStopTime()
Module * GetExecutableModulePointer()
Debugger & GetDebugger() const
void UpdateSignalsFromDummy(lldb::UnixSignalsSP signals_sp, lldb::StreamSP warning_stream_sp)
Updates the signals in signals_sp using the stored dummy signals.
void ClearAllLoadedSections()
void ClearModules(bool delete_locations)
Architecture * GetArchitecturePlugin() const
TargetStats & GetStatistics()
bool SetArchitecture(const ArchSpec &arch_spec, bool set_platform=false, bool merge=true)
Set the architecture for this target.
llvm::Expected< lldb::TypeSystemSP > GetScratchTypeSystemForLanguage(lldb::LanguageType language, bool create_on_demand=true)
lldb::ModuleSP GetExecutableModule()
Gets the module for the main executable.
void DidExec()
Called as the last function in Process::DidExec().
bool RunStopHooks(bool at_initial_stop=false)
Status Install(ProcessLaunchInfo *launch_info)
lldb::PlatformSP GetPlatform()
const ArchSpec & GetArchitecture() const
void SetExecutableModule(lldb::ModuleSP &module_sp, LoadDependentFiles load_dependent_files=eLoadDependentsDefault)
Set the main executable module.
void SetPlatform(const lldb::PlatformSP &platform_sp)
A RAII-friendly terminal state saving/restoring class.
llvm::Error SetEcho(bool enabled)
llvm::Error SetCanonical(bool enabled)
virtual ThreadIterable Threads()
static llvm::Expected< HostThread > LaunchThread(llvm::StringRef name, std::function< lldb::thread_result_t()> thread_function, size_t min_stack_byte_size=0)
lldb::ThreadSP GetSelectedThread()
uint32_t GetSize(bool can_update=true)
bool SetSelectedThreadByID(lldb::tid_t tid, bool notify=false)
lldb::ThreadSP FindThreadByIndexID(uint32_t index_id, bool can_update=true)
lldb::ThreadSP GetThreadAtIndex(uint32_t idx, bool can_update=true)
std::recursive_mutex & GetMutex() const override
lldb::ThreadSP GetExpressionExecutionThread()
static void SettingsInitialize()
static void SettingsTerminate()
static ThreadProperties & GetGlobalProperties()
Represents UUID's of various sizes.
RAII guard that should be acquired when an utility function is called within a given process.
"lldb/Expression/UtilityFunction.h" Encapsulates a bit of source code that provides a function that i...
lldb::LanguageType GetObjectRuntimeLanguage()
uint8_t * GetBytes()
Get a pointer to the data.
#define LLDB_INVALID_BREAK_ID
#define LLDB_INVALID_ADDRESS_MASK
Address Mask Bits not used for addressing are set to 1 in the mask; all mask bits set is an invalid v...
#define LLDB_INVALID_THREAD_ID
#define UNUSED_IF_ASSERT_DISABLED(x)
#define LLDB_INVALID_IMAGE_TOKEN
#define LLDB_INVALID_ADDRESS
#define LLDB_INVALID_PROCESS_ID
@ DoNoSelectMostRelevantFrame
@ SelectMostRelevantFrame
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.
bool StateIsStoppedState(lldb::StateType state, bool must_exist)
Check if a state represents a state where the process or thread is stopped.
void RegisterAssertFrameRecognizer(Process *process)
Registers the assert stack frame recognizer.
bool StateIsRunningState(lldb::StateType state)
Check if a state represents a state where the process or thread is running.
lldb::ProcessSP(* ProcessCreateInstance)(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, const FileSpec *crash_file_path, bool can_connect)
@ eBroadcastAlways
Always send a broadcast when the value is modified.
const char * StateAsCString(lldb::StateType state)
Converts a StateType to a C string.
std::vector< ProcessInstanceInfo > ProcessInstanceInfoList
static uint32_t bits(const uint32_t val, const uint32_t msbit, const uint32_t lsbit)
std::shared_ptr< lldb_private::OptionValueProperties > OptionValuePropertiesSP
std::shared_ptr< lldb_private::ThreadPlan > ThreadPlanSP
std::shared_ptr< lldb_private::ABI > ABISP
std::shared_ptr< lldb_private::StackFrame > StackFrameSP
std::shared_ptr< lldb_private::BreakpointSite > BreakpointSiteSP
std::shared_ptr< lldb_private::BreakpointLocation > BreakpointLocationSP
DescriptionLevel
Description levels for "void GetDescription(Stream *, DescriptionLevel)" calls.
@ eDescriptionLevelVerbose
RunDirection
Execution directions.
std::shared_ptr< lldb_private::IOHandler > IOHandlerSP
std::shared_ptr< lldb_private::Thread > ThreadSP
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
std::shared_ptr< lldb_private::UnixSignals > UnixSignalsSP
std::shared_ptr< lldb_private::Platform > PlatformSP
StateType
Process and Thread States.
@ eStateUnloaded
Process is object is valid, but not currently loaded.
@ eStateConnected
Process is connected to remote debug services, but not launched or attached to anything yet.
@ eStateDetached
Process has been detached and can't be examined.
@ eStateStopped
Process or thread is stopped and can be examined.
@ eStateSuspended
Process or thread is in a suspended state as far as the debugger is concerned while other processes o...
@ eStateRunning
Process or thread is running and can't be examined.
@ eStateLaunching
Process is in the process of launching.
@ eStateAttaching
Process is currently trying to attach.
@ eStateExited
Process has exited and can't be examined.
@ eStateStepping
Process or thread is in the process of stepping and can not be examined.
@ eStateCrashed
Process or thread has crashed and can be examined.
LanguageType
Programming language type.
@ eLanguageTypeMipsAssembler
Mips_Assembler.
@ eLanguageTypeUnknown
Unknown or invalid language value.
@ eLanguageTypeC
Non-standardized C, such as K&R.
std::shared_ptr< lldb_private::MemoryHistory > MemoryHistorySP
ExpressionResults
The results of expression evaluation.
@ eExpressionHitBreakpoint
@ eExpressionStoppedForDebug
@ eExpressionThreadVanished
std::shared_ptr< lldb_private::StructuredDataPlugin > StructuredDataPluginSP
std::shared_ptr< lldb_private::Process > ProcessSP
InstrumentationRuntimeType
std::shared_ptr< lldb_private::Disassembler > DisassemblerSP
std::shared_ptr< lldb_private::LanguageRuntime > LanguageRuntimeSP
std::shared_ptr< lldb_private::Event > EventSP
std::unique_ptr< lldb_private::DynamicLoader > DynamicLoaderUP
ByteOrder
Byte ordering definitions.
std::shared_ptr< lldb_private::Watchpoint > WatchpointSP
std::shared_ptr< lldb_private::Listener > ListenerSP
std::shared_ptr< lldb_private::StopInfo > StopInfoSP
StopReason
Thread stop reasons.
@ eStopReasonPlanComplete
std::shared_ptr< lldb_private::Target > TargetSP
std::shared_ptr< lldb_private::RegisterContext > RegisterContextSP
std::shared_ptr< lldb_private::InstrumentationRuntime > InstrumentationRuntimeSP
std::shared_ptr< lldb_private::Module > ModuleSP
std::shared_ptr< lldb_private::OptionValue > OptionValueSP
std::shared_ptr< lldb_private::ThreadCollection > ThreadCollectionSP
A SmallBitVector that represents a set of source languages (lldb::LanguageType).
A notification structure that can be used by clients to listen for changes in a process's lifetime.
void(* process_state_changed)(void *baton, Process *process, lldb::StateType state)
void(* initialize)(void *baton, Process *process)
bool Contains(BaseType r) const
BaseType GetRangeBase() const
SizeType GetByteSize() const
void SetRangeBase(BaseType b)
Set the start value for the range, and keep the same size.
BaseType GetRangeEnd() const
Range Intersect(const Range &rhs) const
void SetByteSize(SizeType s)
std::optional< ExitDescription > exit_desc
Helper RAII class for collecting telemetry.
void DispatchOnExit(llvm::unique_function< void(Info *info)> final_callback)
void DispatchNow(llvm::unique_function< void(Info *info)> populate_fields_cb)
void SetDebugger(Debugger *debugger)