14#include "llvm/ADT/ScopeExit.h"
15#include "llvm/Support/ScopedPrinter.h"
16#include "llvm/Support/Threading.h"
80using namespace std::chrono;
84#define ENABLE_MEMORY_CACHING
86#ifdef ENABLE_MEMORY_CACHING
87#define DISABLE_MEM_CACHE_DEFAULT false
89#define DISABLE_MEM_CACHE_DEFAULT true
93 :
public Cloneable<ProcessOptionValueProperties, OptionValueProperties> {
109 if (
this != instance_properties)
148 "Continue tracing the parent process and detach the child.",
153 "Trace the child process and detach the parent.",
157#define LLDB_PROPERTIES_process
158#include "TargetProperties.inc"
161#define LLDB_PROPERTIES_process
162#include "TargetPropertiesEnum.inc"
166#define LLDB_PROPERTIES_process_experimental
167#include "TargetProperties.inc"
170#define LLDB_PROPERTIES_process_experimental
171#include "TargetPropertiesEnum.inc"
175 :
public Cloneable<ProcessExperimentalOptionValueProperties,
176 OptionValueProperties> {
192 if (process ==
nullptr) {
194 m_collection_sp = std::make_shared<ProcessOptionValueProperties>(
"process");
197 "thread",
"Settings specific to threads.",
true,
203 ePropertyPythonOSPluginPath,
208 std::make_unique<ProcessExperimentalProperties>();
211 "Experimental settings - setting these won't produce "
212 "errors if the setting is not present.",
219 const uint32_t idx = ePropertyDisableMemCache;
220 return GetPropertyAtIndexAs<bool>(
221 idx, g_process_properties[idx].default_uint_value != 0);
225 const uint32_t idx = ePropertyMemCacheLineSize;
226 return GetPropertyAtIndexAs<uint64_t>(
227 idx, g_process_properties[idx].default_uint_value);
232 const uint32_t idx = ePropertyExtraStartCommand;
238 const uint32_t idx = ePropertyExtraStartCommand;
243 const uint32_t idx = ePropertyPythonOSPluginPath;
244 return GetPropertyAtIndexAs<FileSpec>(idx, {});
248 const uint32_t idx = ePropertyVirtualAddressableBits;
249 return GetPropertyAtIndexAs<uint64_t>(
250 idx, g_process_properties[idx].default_uint_value);
254 const uint32_t idx = ePropertyVirtualAddressableBits;
259 const uint32_t idx = ePropertyHighmemVirtualAddressableBits;
260 return GetPropertyAtIndexAs<uint64_t>(
261 idx, g_process_properties[idx].default_uint_value);
265 const uint32_t idx = ePropertyHighmemVirtualAddressableBits;
270 const uint32_t idx = ePropertyPythonOSPluginPath;
275 const uint32_t idx = ePropertyIgnoreBreakpointsInExpressions;
276 return GetPropertyAtIndexAs<bool>(
277 idx, g_process_properties[idx].default_uint_value != 0);
281 const uint32_t idx = ePropertyIgnoreBreakpointsInExpressions;
286 const uint32_t idx = ePropertyUnwindOnErrorInExpressions;
287 return GetPropertyAtIndexAs<bool>(
288 idx, g_process_properties[idx].default_uint_value != 0);
292 const uint32_t idx = ePropertyUnwindOnErrorInExpressions;
297 const uint32_t idx = ePropertyStopOnSharedLibraryEvents;
298 return GetPropertyAtIndexAs<bool>(
299 idx, g_process_properties[idx].default_uint_value != 0);
303 const uint32_t idx = ePropertyStopOnSharedLibraryEvents;
308 const uint32_t idx = ePropertyDisableLangRuntimeUnwindPlans;
309 return GetPropertyAtIndexAs<bool>(
310 idx, g_process_properties[idx].default_uint_value != 0);
314 const uint32_t idx = ePropertyDisableLangRuntimeUnwindPlans;
320 const uint32_t idx = ePropertyDetachKeepsStopped;
321 return GetPropertyAtIndexAs<bool>(
322 idx, g_process_properties[idx].default_uint_value != 0);
326 const uint32_t idx = ePropertyDetachKeepsStopped;
331 const uint32_t idx = ePropertyWarningOptimization;
332 return GetPropertyAtIndexAs<bool>(
333 idx, g_process_properties[idx].default_uint_value != 0);
337 const uint32_t idx = ePropertyWarningUnsupportedLanguage;
338 return GetPropertyAtIndexAs<bool>(
339 idx, g_process_properties[idx].default_uint_value != 0);
343 const uint32_t idx = ePropertyStopOnExec;
344 return GetPropertyAtIndexAs<bool>(
345 idx, g_process_properties[idx].default_uint_value != 0);
349 const uint32_t idx = ePropertyUtilityExpressionTimeout;
350 uint64_t value = GetPropertyAtIndexAs<uint64_t>(
351 idx, g_process_properties[idx].default_uint_value);
352 return std::chrono::seconds(value);
356 const uint32_t idx = ePropertyInterruptTimeout;
357 uint64_t value = GetPropertyAtIndexAs<uint64_t>(
358 idx, g_process_properties[idx].default_uint_value);
359 return std::chrono::seconds(value);
363 const uint32_t idx = ePropertySteppingRunsAllThreads;
364 return GetPropertyAtIndexAs<bool>(
365 idx, g_process_properties[idx].default_uint_value != 0);
369 const bool fail_value =
true;
373 exp_property->
GetValue()->GetAsProperties();
379 .value_or(fail_value);
386 exp_property->
GetValue()->GetAsProperties();
393 const uint32_t idx = ePropertyFollowForkMode;
394 return GetPropertyAtIndexAs<FollowForkMode>(
396 g_process_properties[idx].default_uint_value));
400 llvm::StringRef plugin_name,
404 static uint32_t g_process_unique_id = 0;
408 if (!plugin_name.empty()) {
411 if (create_callback) {
412 process_sp = create_callback(target_sp, listener_sp, crash_file_path,
415 if (process_sp->CanDebug(target_sp,
true)) {
416 process_sp->m_process_unique_id = ++g_process_unique_id;
422 for (uint32_t idx = 0;
426 process_sp = create_callback(target_sp, listener_sp, crash_file_path,
429 if (process_sp->CanDebug(target_sp,
false)) {
430 process_sp->m_process_unique_id = ++g_process_unique_id;
441 static constexpr llvm::StringLiteral class_name(
"lldb.process");
454 Broadcaster((target_sp->GetDebugger().GetBroadcasterManager()),
455 Process::GetStaticBroadcasterClass().str()),
458 m_private_state_broadcaster(nullptr,
459 "lldb.process.internal_state_broadcaster"),
460 m_private_state_control_broadcaster(
461 nullptr,
"lldb.process.internal_state_control_broadcaster"),
462 m_private_state_listener_sp(
463 Listener::MakeListener(
"lldb.process.internal_state_listener")),
464 m_mod_id(), m_process_unique_id(0), m_thread_index_id(0),
465 m_thread_id_to_index_id_map(), m_exit_status(-1),
466 m_thread_list_real(*this), m_thread_list(*this), m_thread_plans(*this),
467 m_extended_thread_list(*this), m_extended_thread_stop_id(0),
468 m_queue_list(this), m_queue_list_stop_id(0),
469 m_unix_signals_sp(unix_signals_sp), m_abi_sp(), m_process_input_reader(),
470 m_stdio_communication(
"process.stdio"), m_stdio_communication_mutex(),
471 m_stdin_forward(false), m_stdout_data(), m_stderr_data(),
472 m_profile_data_comm_mutex(), m_profile_data(), m_iohandler_sync(0),
473 m_memory_cache(*this), m_allocated_memory_cache(*this),
474 m_should_detach(false), m_next_event_action_up(), m_public_run_lock(),
475 m_private_run_lock(), m_currently_handling_do_on_removals(false),
477 m_finalizing(false), m_destructing(false),
478 m_clear_thread_plans_on_stop(false), m_force_next_event_delivery(false),
479 m_last_broadcast_state(
eStateInvalid), m_destroy_in_process(false),
480 m_can_interpret_function_calls(false), m_run_thread_plan_lock(),
481 m_can_jit(eCanJITDontKnow),
486 LLDB_LOGF(log,
"%p Process::Process()",
static_cast<void *
>(
this));
524 uint64_t platform_cache_line_size =
525 target_sp->GetPlatform()->GetDefaultMemoryCacheLineSize();
526 if (!value_sp->OptionWasSet() && platform_cache_line_size != 0)
527 value_sp->SetValueAs(platform_cache_line_size);
538 LLDB_LOGF(log,
"%p Process::~Process()",
static_cast<void *
>(
this));
552 return *g_settings_ptr;
587 std::vector<Notifications> empty_notifications;
621 if (pos->baton == callbacks.
baton &&
632 std::vector<Notifications>::iterator notification_pos,
635 notification_pos != notification_end; ++notification_pos) {
636 if (notification_pos->process_state_changed)
637 notification_pos->process_state_changed(notification_pos->baton,
this,
656 std::chrono::seconds(0)) &&
676 "waited from m_iohandler_sync to change from {0}. New value is {1}.",
677 iohandler_id, *Result);
679 LLDB_LOG(log,
"timed out waiting for m_iohandler_sync to change from {0}.",
692 event_sp_ptr->reset();
700 LLDB_LOG(log,
"timeout = {0}", timeout);
705 "Process::%s returning without waiting for events; process "
706 "private and public states are already 'stopped'.",
710 if (hijack_listener_sp && use_run_lock)
718 if (event_sp_ptr && event_sp)
719 *event_sp_ptr = event_sp;
721 bool pop_process_io_handler = (hijack_listener_sp.get() !=
nullptr);
723 event_sp, stream, select_most_relevant, pop_process_io_handler);
732 if (hijack_listener_sp && use_run_lock)
741 if (hijack_listener_sp && use_run_lock)
755 bool &pop_process_io_handler) {
756 const bool handle_pop = pop_process_io_handler;
758 pop_process_io_handler =
false;
770 switch (event_state) {
778 stream->
Printf(
"Process %" PRIu64
" %s\n", process_sp->GetID(),
781 pop_process_io_handler =
true;
791 process_sp->GetStatus(*stream);
792 pop_process_io_handler =
true;
803 if (num_reasons > 0) {
806 if (num_reasons == 1) {
810 stream->
Printf(
"Process %" PRIu64
" stopped and restarted: %s\n",
812 reason ? reason :
"<UNKNOWN REASON>");
814 stream->
Printf(
"Process %" PRIu64
815 " stopped and restarted, reasons:\n",
816 process_sp->GetID());
818 for (
size_t i = 0; i < num_reasons; i++) {
822 stream->
Printf(
"\t%s\n", reason ? reason :
"<UNKNOWN REASON>");
832 ThreadList &thread_list = process_sp->GetThreadList();
833 std::lock_guard<std::recursive_mutex> guard(thread_list.
GetMutex());
838 bool prefer_curr_thread =
false;
839 if (curr_thread && curr_thread->IsValid()) {
840 curr_thread_stop_reason = curr_thread->GetStopReason();
841 switch (curr_thread_stop_reason) {
850 uint64_t signo = curr_thread->GetStopInfo()->GetValue();
851 if (process_sp->GetUnixSignals()->GetShouldStop(signo))
852 prefer_curr_thread =
true;
855 prefer_curr_thread =
true;
858 curr_thread_stop_info_sp = curr_thread->GetStopInfo();
861 if (!prefer_curr_thread) {
867 const size_t num_threads = thread_list.
GetSize();
869 for (i = 0; i < num_threads; ++i) {
871 StopReason thread_stop_reason = thread->GetStopReason();
872 switch (thread_stop_reason) {
881 uint64_t signo = thread->GetStopInfo()->GetValue();
882 if (process_sp->GetUnixSignals()->GetShouldStop(signo)) {
884 other_thread = thread;
901 other_thread = thread;
905 plan_thread = thread;
911 else if (other_thread)
914 if (curr_thread && curr_thread->IsValid())
915 thread = curr_thread;
929 Debugger &debugger = process_sp->GetTarget().GetDebugger();
931 &process_sp->GetTarget()) {
932 ThreadSP thread_sp = process_sp->GetThreadList().GetSelectedThread();
934 if (!thread_sp || !thread_sp->IsValid())
937 const bool only_threads_with_stop_reason =
true;
938 const uint32_t start_frame =
939 thread_sp->GetSelectedFrameIndex(select_most_relevant);
940 const uint32_t num_frames = 1;
941 const uint32_t num_frames_with_source = 1;
942 const bool stop_format =
true;
944 process_sp->GetStatus(*stream);
945 process_sp->GetThreadStatus(*stream, only_threads_with_stop_reason,
946 start_frame, num_frames,
947 num_frames_with_source,
949 if (curr_thread_stop_info_sp) {
952 curr_thread_stop_info_sp, &crashing_address);
958 valobj_sp->GetExpressionPath(*stream, format);
959 stream->
Printf(
" accessed 0x%" PRIx64
"\n", crashing_address);
964 process_sp->GetTarget().shared_from_this());
966 stream->
Printf(
"Target %d: (", target_idx);
968 stream->
Printf(
"Target <unknown index>: (");
970 stream->
Printf(
") stopped.\n");
975 pop_process_io_handler =
true;
980 if (handle_pop && pop_process_io_handler)
981 process_sp->PopProcessIOHandler();
1000 LLDB_LOG(log,
"timeout = {0}, event_sp)...", timeout);
1007 if (listener_sp->GetEventForBroadcasterWithType(
1013 LLDB_LOG(log,
"got no event or was interrupted.");
1016 LLDB_LOG(log,
"timeout = {0}, event_sp) => {1}", timeout, state);
1023 LLDB_LOGF(log,
"Process::%s...", __FUNCTION__);
1030 LLDB_LOGF(log,
"Process::%s (event_ptr) => %s", __FUNCTION__,
1033 LLDB_LOGF(log,
"Process::%s no events found", __FUNCTION__);
1043 LLDB_LOG(log,
"timeout = {0}, event_sp)...", timeout);
1053 LLDB_LOG(log,
"timeout = {0}, event_sp) => {1}", timeout,
1060 bool control_only) {
1062 LLDB_LOG(log,
"timeout = {0}, event_sp)...", timeout);
1096 LLDB_LOG(log,
"(plugin = {0} status = {1} ({1:x8}), description=\"{2}\")",
1103 "(plugin = {0}) ignoring exit status because state was already set "
1110 if (!exit_string.empty())
1154 "Process::SetProcessExitStatus (pid=%" PRIu64
1155 ", exited=%i, signal=%i, exit_status=%i)\n",
1156 pid, exited, signo, exit_status);
1161 ProcessSP process_sp(target_sp->GetProcessSP());
1163 llvm::StringRef signal_str =
1164 process_sp->GetUnixSignals()->GetSignalAsStringRef(signo);
1165 process_sp->SetExitStatus(exit_status, signal_str);
1183 bool clear_unused_threads =
true;
1206 size_t num_old_threads = old_thread_list.
GetSize(
false);
1207 for (
size_t i = 0; i < num_old_threads; ++i)
1240 new_thread_list = real_thread_list;
1280 bool internal,
bool condense_trivial,
1281 bool skip_unreported_plans) {
1283 strm, tid, desc_level, internal, condense_trivial, skip_unreported_plans);
1286 bool internal,
bool condense_trivial,
1287 bool skip_unreported_plans) {
1289 skip_unreported_plans);
1322 uint32_t result = 0;
1323 std::map<uint64_t, uint32_t>::iterator iterator =
1329 result = iterator->second;
1344 if (new_state_is_stopped) {
1355 LLDB_LOGF(log,
"(plugin = %s, state = %s, restarted = %i)",
1366 "(plugin = %s, state = %s) -- unlocking run lock for detach",
1371 if ((old_state_is_stopped != new_state_is_stopped)) {
1372 if (new_state_is_stopped && !restarted) {
1373 LLDB_LOGF(log,
"(plugin = %s, state = %s) -- unlocking run lock",
1386 Status error(
"Resume request failed - process still running.");
1387 LLDB_LOGF(log,
"(plugin = %s) -- TrySetRunning failed, not resuming.",
1392 if (!
error.Success()) {
1401 LLDB_LOGF(log,
"Process::ResumeSynchronous -- locking run lock");
1403 Status error(
"Resume request failed - process still running.");
1404 LLDB_LOGF(log,
"Process::Resume: -- TrySetRunning failed, not resuming.");
1413 if (
error.Success()) {
1417 const bool must_be_alive =
1420 error.SetErrorStringWithFormat(
1421 "process not in stopped state after synchronous resume: %s",
1437 if (!hijacking_name.starts_with(
"lldb.internal"))
1465 bool state_changed =
false;
1474 state_changed = old_state != new_state;
1478 if (old_state_is_stopped != new_state_is_stopped) {
1479 if (new_state_is_stopped)
1485 if (state_changed) {
1509 LLDB_LOGF(log,
"(plugin = %s, state = %s, stop_id = %u",
1516 LLDB_LOGF(log,
"(plugin = %s, state = %s) state didn't change. Ignoring...",
1538 std::vector<LanguageRuntime *> language_runtimes;
1541 return language_runtimes;
1551 language_runtimes.emplace_back(runtime);
1554 return language_runtimes;
1564 LanguageRuntimeCollection::iterator pos;
1571 runtime = runtime_sp.get();
1573 runtime = pos->second.get();
1599 if (runtime->CouldHaveDynamicValue(in_value))
1629 if (
error.Success())
1639 if (bp_site_sp->IsEnabled())
1642 error.SetErrorStringWithFormat(
"invalid breakpoint site ID: %" PRIu64,
1653 if (!bp_site_sp->IsEnabled())
1656 error.SetErrorStringWithFormat(
"invalid breakpoint site ID: %" PRIu64,
1664 bool use_hardware) {
1667 bool show_error =
true;
1690 constituent->SetIsIndirect(
false);
1692 if (constituent->ShouldResolveIndirectFunctions()) {
1698 if (!
error.Success() && show_error) {
1700 "warning: failed to resolve indirect function at 0x%" PRIx64
1701 " for breakpoint %i.%i: %s\n",
1703 constituent->GetBreakpoint().GetID(), constituent->GetID(),
1704 error.AsCString() ?
error.AsCString() :
"unknown error");
1707 Address resolved_address(load_addr);
1709 constituent->SetIsIndirect(
true);
1711 load_addr = constituent->GetAddress().GetOpcodeLoadAddress(&
GetTarget());
1713 load_addr = constituent->GetAddress().GetOpcodeLoadAddress(&
GetTarget());
1724 bp_site_sp->AddConstituent(constituent);
1725 constituent->SetBreakpointSite(bp_site_sp);
1726 return bp_site_sp->GetID();
1732 if (
error.Success()) {
1733 constituent->SetBreakpointSite(bp_site_sp);
1736 if (show_error || use_hardware) {
1739 "warning: failed to set breakpoint site at 0x%" PRIx64
1740 " for breakpoint %i.%i: %s\n",
1741 load_addr, constituent->GetBreakpoint().GetID(),
1742 constituent->GetID(),
1743 error.AsCString() ?
error.AsCString() :
"unknown error");
1756 uint32_t num_constituents =
1757 bp_site_sp->RemoveConstituent(constituent_id, constituent_loc_id);
1758 if (num_constituents == 0) {
1767 uint8_t *buf)
const {
1768 size_t bytes_removed = 0;
1772 bp_sites_in_range)) {
1773 bp_sites_in_range.
ForEach([bp_addr, size,
1776 addr_t intersect_addr;
1777 size_t intersect_size;
1778 size_t opcode_offset;
1779 if (bp_site->IntersectsRange(bp_addr, size, &intersect_addr,
1780 &intersect_size, &opcode_offset)) {
1781 assert(bp_addr <= intersect_addr && intersect_addr < bp_addr + size);
1782 assert(bp_addr < intersect_addr + intersect_size &&
1783 intersect_addr + intersect_size <= bp_addr + size);
1784 assert(opcode_offset + intersect_size <= bp_site->GetByteSize());
1785 size_t buf_offset = intersect_addr - bp_addr;
1786 ::memcpy(buf + buf_offset,
1787 bp_site->GetSavedOpcodeBytes() + opcode_offset,
1793 return bytes_removed;
1799 return platform_sp->GetSoftwareBreakpointTrapOpcode(
GetTarget(), bp_site);
1805 assert(bp_site !=
nullptr);
1809 log,
"Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64,
1810 bp_site->
GetID(), (uint64_t)bp_addr);
1814 "Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64
1815 " -- already enabled",
1816 bp_site->
GetID(), (uint64_t)bp_addr);
1821 error.SetErrorString(
"BreakpointSite contains an invalid load address.");
1828 if (bp_opcode_size == 0) {
1829 error.SetErrorStringWithFormat(
"Process::GetSoftwareBreakpointTrapOpcode() "
1830 "returned zero, unable to get breakpoint "
1831 "trap for address 0x%" PRIx64,
1836 if (bp_opcode_bytes ==
nullptr) {
1837 error.SetErrorString(
1838 "BreakpointSite doesn't contain a valid breakpoint trap opcode.");
1844 error) == bp_opcode_size) {
1848 uint8_t verify_bp_opcode_bytes[64];
1849 if (
DoReadMemory(bp_addr, verify_bp_opcode_bytes, bp_opcode_size,
1850 error) == bp_opcode_size) {
1851 if (::memcmp(bp_opcode_bytes, verify_bp_opcode_bytes,
1852 bp_opcode_size) == 0) {
1856 "Process::EnableSoftwareBreakpoint (site_id = %d) "
1857 "addr = 0x%" PRIx64
" -- SUCCESS",
1858 bp_site->
GetID(), (uint64_t)bp_addr);
1860 error.SetErrorString(
1861 "failed to verify the breakpoint trap in memory.");
1863 error.SetErrorString(
1864 "Unable to read memory to verify breakpoint trap.");
1866 error.SetErrorString(
"Unable to write breakpoint trap to memory.");
1868 error.SetErrorString(
"Unable to read memory at breakpoint address.");
1870 if (log &&
error.Fail())
1873 "Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64
1875 bp_site->
GetID(), (uint64_t)bp_addr,
error.AsCString());
1881 assert(bp_site !=
nullptr);
1886 "Process::DisableSoftwareBreakpoint (breakID = %" PRIu64
1887 ") addr = 0x%" PRIx64,
1888 breakID, (uint64_t)bp_addr);
1891 error.SetErrorString(
"Breakpoint site is a hardware breakpoint.");
1893 const size_t break_op_size = bp_site->
GetByteSize();
1895 if (break_op_size > 0) {
1897 uint8_t curr_break_op[8];
1898 assert(break_op_size <=
sizeof(curr_break_op));
1899 bool break_op_found =
false;
1904 bool verify =
false;
1906 if (::memcmp(curr_break_op, break_op, break_op_size) == 0) {
1907 break_op_found =
true;
1911 break_op_size,
error) == break_op_size) {
1914 error.SetErrorString(
1915 "Memory write failed when restoring original opcode.");
1917 error.SetErrorString(
1918 "Original breakpoint trap is no longer in memory.");
1925 uint8_t verify_opcode[8];
1926 assert(break_op_size <
sizeof(verify_opcode));
1932 break_op_size) == 0) {
1936 "Process::DisableSoftwareBreakpoint (site_id = %d) "
1937 "addr = 0x%" PRIx64
" -- SUCCESS",
1938 bp_site->
GetID(), (uint64_t)bp_addr);
1942 error.SetErrorString(
"Failed to restore original opcode.");
1945 error.SetErrorString(
"Failed to read memory to verify that "
1946 "breakpoint trap was restored.");
1949 error.SetErrorString(
1950 "Unable to read memory that should contain the breakpoint trap.");
1955 "Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64
1956 " -- already disabled",
1957 bp_site->
GetID(), (uint64_t)bp_addr);
1963 "Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64
1965 bp_site->
GetID(), (uint64_t)bp_addr,
error.AsCString());
1975 addr = abi_sp->FixAnyAddress(addr);
1979#if defined(VERIFY_MEMORY_READS)
1991 std::string verify_buf(size,
'\0');
1992 assert(verify_buf.size() == size);
1993 const size_t cache_bytes_read =
1996 const size_t verify_bytes_read =
1998 verify_buf.size(), verify_error);
1999 assert(cache_bytes_read == verify_bytes_read);
2000 assert(memcmp(buf, verify_buf.data(), verify_buf.size()) == 0);
2002 return cache_bytes_read;
2018 const uint8_t *buf,
size_t size,
2020 size_t max_matches) {
2022 assert(buf !=
nullptr);
2024 assert(alignment > 0);
2025 assert(max_matches > 0);
2028 assert(start_addr < end_addr);
2030 lldb::addr_t start = llvm::alignTo(start_addr, alignment);
2031 while (matches.size() < max_matches && (start + size) < end_addr) {
2036 if (found_addr % alignment) {
2039 start = llvm::alignTo(start + 1, alignment);
2043 matches.emplace_back(found_addr, size);
2044 start = found_addr + alignment;
2050 size_t alignment,
size_t max_matches,
2053 if (buf ==
nullptr) {
2054 error.SetErrorString(
"buffer is null");
2058 error.SetErrorString(
"buffer size is zero");
2061 if (ranges.empty()) {
2062 error.SetErrorString(
"empty ranges");
2065 if (alignment == 0) {
2066 error.SetErrorString(
"alignment must be greater than zero");
2069 if (max_matches == 0) {
2070 error.SetErrorString(
"max_matches must be greater than zero");
2074 int resolved_ranges = 0;
2076 for (
size_t i = 0; i < ranges.size(); ++i) {
2077 if (matches.size() >= max_matches)
2090 DoFindInMemory(start_addr, end_addr, buf, size, matches, alignment,
2094 if (resolved_ranges > 0)
2097 error.SetErrorString(
"unable to resolve any ranges");
2105 if (buf ==
nullptr) {
2106 error.SetErrorString(
"buffer is null");
2110 error.SetErrorString(
"buffer size is zero");
2114 error.SetErrorString(
"range is invalid");
2117 if (alignment == 0) {
2118 error.SetErrorString(
"alignment must be greater than zero");
2126 error.SetErrorString(
"range load address is invalid");
2132 DoFindInMemory(start_addr, end_addr, buf, size, matches, alignment, 1);
2133 if (matches.empty())
2137 return matches[0].GetBaseAddress().GetLoadAddress(&target);
2149 out_str.append(buf, length);
2152 if (length ==
sizeof(buf) - 1)
2153 curr_addr += length;
2157 return out_str.size();
2165 size_t total_cstr_len = 0;
2166 if (dst && dst_max_len) {
2167 result_error.
Clear();
2169 memset(dst, 0, dst_max_len);
2173 size_t bytes_left = dst_max_len - 1;
2174 char *curr_dst = dst;
2176 while (bytes_left > 0) {
2177 addr_t cache_line_bytes_left =
2178 cache_line_size - (curr_addr % cache_line_size);
2180 std::min<addr_t>(bytes_left, cache_line_bytes_left);
2181 size_t bytes_read =
ReadMemory(curr_addr, curr_dst, bytes_to_read,
error);
2183 if (bytes_read == 0) {
2184 result_error =
error;
2185 dst[total_cstr_len] =
'\0';
2188 const size_t len = strlen(curr_dst);
2190 total_cstr_len += len;
2192 if (len < bytes_to_read)
2195 curr_dst += bytes_read;
2196 curr_addr += bytes_read;
2197 bytes_left -= bytes_read;
2203 result_error.
Clear();
2205 return total_cstr_len;
2213 addr = abi_sp->FixAnyAddress(addr);
2215 if (buf ==
nullptr || size == 0)
2218 size_t bytes_read = 0;
2219 uint8_t *bytes = (uint8_t *)buf;
2221 while (bytes_read < size) {
2222 const size_t curr_size = size - bytes_read;
2223 const size_t curr_bytes_read =
2225 bytes_read += curr_bytes_read;
2226 if (curr_bytes_read == curr_size || curr_bytes_read == 0)
2238 size_t integer_byte_size,
2239 uint64_t fail_value,
2249 size_t integer_byte_size,
2271 if (addr_byte_size <= 4)
2272 scalar = (uint32_t)ptr_value;
2281 size_t bytes_written = 0;
2282 const uint8_t *bytes = (
const uint8_t *)buf;
2284 while (bytes_written < size) {
2285 const size_t curr_size = size - bytes_written;
2287 addr + bytes_written, bytes + bytes_written, curr_size,
error);
2288 bytes_written += curr_bytes_written;
2289 if (curr_bytes_written == curr_size || curr_bytes_written == 0)
2292 return bytes_written;
2298 addr = abi_sp->FixAnyAddress(addr);
2300#if defined(ENABLE_MEMORY_CACHING)
2304 if (buf ==
nullptr || size == 0)
2318 if (bp_sites_in_range.
IsEmpty())
2321 const uint8_t *ubuf = (
const uint8_t *)buf;
2322 uint64_t bytes_written = 0;
2324 bp_sites_in_range.
ForEach([
this, addr, size, &bytes_written, &ubuf,
2333 size_t intersect_size;
2334 size_t opcode_offset;
2336 addr, size, &intersect_addr, &intersect_size, &opcode_offset);
2339 assert(addr <= intersect_addr && intersect_addr < addr + size);
2340 assert(addr < intersect_addr + intersect_size &&
2341 intersect_addr + intersect_size <= addr + size);
2342 assert(opcode_offset + intersect_size <= bp->GetByteSize());
2345 const addr_t curr_addr = addr + bytes_written;
2346 if (intersect_addr > curr_addr) {
2349 size_t curr_size = intersect_addr - curr_addr;
2350 size_t curr_bytes_written =
2352 bytes_written += curr_bytes_written;
2353 if (curr_bytes_written != curr_size) {
2357 if (
error.Success())
2358 error.SetErrorToGenericError();
2365 bytes_written += intersect_size;
2369 if (bytes_written < size)
2372 size - bytes_written,
error);
2374 return bytes_written;
2381 if (byte_size > 0) {
2383 const size_t mem_size =
2388 error.SetErrorString(
"failed to get scalar as memory data");
2390 error.SetErrorString(
"invalid scalar value");
2396 bool is_signed,
Scalar &scalar,
2399 if (byte_size == 0) {
2400 error.SetErrorString(
"byte size is zero");
2401 }
else if (byte_size & (byte_size - 1)) {
2402 error.SetErrorStringWithFormat(
"byte size %u is not a power of 2",
2404 }
else if (byte_size <=
sizeof(uval)) {
2406 if (bytes_read == byte_size) {
2411 scalar = data.
GetMaxU32(&offset, byte_size);
2413 scalar = data.
GetMaxU64(&offset, byte_size);
2419 error.SetErrorStringWithFormat(
2420 "byte size of %u is too large for integer scalar type", byte_size);
2427 for (
const auto &
Entry : entries) {
2430 if (!
error.Success())
2436#define USE_ALLOCATE_MEMORY_CACHE 1
2440 error.SetErrorToGenericError();
2444#if defined(USE_ALLOCATE_MEMORY_CACHE)
2450 "Process::AllocateMemory(size=%" PRIu64
2451 ", permissions=%s) => 0x%16.16" PRIx64
2452 " (m_stop_id = %u m_memory_id = %u)",
2456 return allocated_addr;
2463 if (
error.Success()) {
2464 std::string buffer(size, 0);
2476 8, ePermissionsReadable | ePermissionsWritable | ePermissionsExecutable,
2482 "Process::%s pid %" PRIu64
2483 " allocation test passed, CanJIT () is true",
2484 __FUNCTION__,
GetID());
2488 "Process::%s pid %" PRIu64
2489 " allocation test failed, CanJIT () is false: %s",
2510#if defined(USE_ALLOCATE_MEMORY_CACHE)
2512 error.SetErrorStringWithFormat(
2513 "deallocation of memory at 0x%" PRIx64
" failed.", (uint64_t)ptr);
2520 "Process::DeallocateMemory(addr=0x%16.16" PRIx64
2521 ") => err = %s (m_stop_id = %u, m_memory_id = %u)",
2530 return *subclass_override;
2532 bool reported_after =
true;
2535 return reported_after;
2538 if (triple.isMIPS() || triple.isPPC64() || triple.isRISCV() ||
2539 triple.isAArch64() || triple.isArmMClass() || triple.isARM())
2540 reported_after =
false;
2542 return reported_after;
2547 size_t size_to_read) {
2551 "Process::ReadModuleFromMemory reading %s binary from memory",
2557 std::unique_ptr<Progress> progress_up;
2562 progress_up = std::make_unique<Progress>(
2565 ObjectFile *objfile = module_sp->GetMemoryObjectFile(
2566 shared_from_this(), header_addr,
error, size_to_read);
2574 uint32_t &permissions) {
2578 if (!
error.Success())
2591 error.SetErrorString(
"watchpoints are not supported");
2597 error.SetErrorString(
"watchpoints are not supported");
2636 LaunchPrivate(launch_info, state_after_launch, first_stop_event_sp);
2658 if (launch_info.
GetFlags().
Test(eLaunchFlagStopAtEntry))
2690 error.SetErrorString(
"executable module does not exist");
2716 std::string local_exec_file_path = exe_spec_to_use.
GetPath();
2717 return Status(
"file doesn't exist: '%s'", local_exec_file_path.c_str());
2720 const bool restarted =
false;
2729 error.SetErrorString(
"failed to acquire process run lock");
2735 const char *error_string =
error.AsCString();
2736 if (error_string ==
nullptr)
2737 error_string =
"launch failed";
2750 error.SetErrorString(
"failed to catch stop after launch");
2792 return Status(
"Unexpected process state after the launch: %s, expected %s, "
2801 if (
error.Success()) {
2836 LLDB_LOGF(log,
"Process::Halt() failed to stop, state is: %s",
2838 error.SetErrorString(
2839 "Did not get stopped event after loading the core file.");
2877 uint32_t exec_count)
2882 "Process::AttachCompletionHandler::%s process=%p, exec_count=%" PRIu32,
2883 __FUNCTION__,
static_cast<void *
>(process), exec_count);
2892 "Process::AttachCompletionHandler::%s called with state %s (%d)",
2897 return eEventActionSuccess;
2901 return eEventActionRetry;
2912 if (m_exec_count > 0) {
2916 "Process::AttachCompletionHandler::%s state %s: reduced "
2917 "remaining exec count to %" PRIu32
", requesting resume",
2921 return eEventActionRetry;
2924 "Process::AttachCompletionHandler::%s state %s: no more "
2925 "execs expected to start, continuing with attach",
2929 return eEventActionSuccess;
2940 return eEventActionExit;
2945 return eEventActionSuccess;
2954 return m_listener_sp;
2968 bool wait_for_launch) {
2989 sizeof(process_name))) {
2992 if (wait_for_launch) {
2994 if (
error.Success()) {
2997 const bool restarted =
false;
3003 error.SetErrorString(
"failed to acquire process run lock");
3009 if (
error.AsCString() ==
nullptr)
3010 error.SetErrorString(
"attach failed");
3029 platform_sp->FindProcesses(match_info, process_infos);
3030 const uint32_t num_matches = process_infos.size();
3031 if (num_matches == 1) {
3032 attach_pid = process_infos[0].GetProcessID();
3036 process_name,
sizeof(process_name));
3037 if (num_matches > 1) {
3040 for (
size_t i = 0; i < num_matches; i++) {
3041 process_infos[i].DumpAsTableRow(
3042 s, platform_sp->GetUserIDResolver(),
true,
false);
3044 error.SetErrorStringWithFormat(
3045 "more than one process named %s:\n%s", process_name,
3048 error.SetErrorStringWithFormat(
3049 "could not find a process named %s", process_name);
3052 error.SetErrorString(
3053 "invalid platform, can't find processes by name");
3058 error.SetErrorString(
"invalid process name");
3064 if (
error.Success()) {
3069 const bool restarted =
false;
3074 error.SetErrorString(
"failed to acquire process run lock");
3077 if (
error.Success()) {
3085 const char *error_string =
error.AsCString();
3086 if (error_string ==
nullptr)
3087 error_string =
"attach failed";
3098 LLDB_LOGF(log,
"Process::%s()", __FUNCTION__);
3107 "Process::{0} replacing process architecture with DidAttach() "
3108 "architecture: \"{1}\"",
3109 __FUNCTION__, process_arch.
GetTriple().getTriple());
3117 assert(platform_sp);
3121 if (target_arch.
IsValid() && !platform_sp->IsCompatibleArchitecture(
3122 target_arch, process_host_arch,
3126 target_arch, process_host_arch, &platform_arch);
3131 "switching platform to {0} and architecture to {1} based on "
3133 platform_sp->GetName(), platform_arch.
GetTriple().getTriple());
3135 }
else if (!process_arch.
IsValid()) {
3145 "Process::%s switching architecture to %s based on info "
3146 "the platform retrieved for pid %" PRIu64,
3147 __FUNCTION__, process_arch.
GetTriple().getTriple().c_str(),
3167 "after DynamicLoader::DidAttach(), target "
3168 "executable is {0} (using {1} plugin)",
3169 exe_module_sp ? exe_module_sp->GetFileSpec() :
FileSpec(),
3177 if (system_runtime) {
3182 "after SystemRuntime::DidAttach(), target "
3183 "executable is {0} (using {1} plugin)",
3184 exe_module_sp ? exe_module_sp->GetFileSpec() :
FileSpec(),
3202 if (module_sp && module_sp->IsExecutable()) {
3203 if (
GetTarget().GetExecutableModulePointer() != module_sp.get())
3204 new_executable_module_sp = module_sp;
3208 if (new_executable_module_sp) {
3215 "Process::%s after looping through modules, target executable is %s",
3217 exe_module_sp ? exe_module_sp->GetFileSpec().GetPath().c_str()
3234 if (
error.Success()) {
3261 "Process::PrivateResume() m_stop_id = %u, public state: %s "
3262 "private state: %s",
3271 if (!
GetModID().IsLastResumeForUserExpression())
3276 if (
error.Success()) {
3287 error.SetErrorString(
3288 "Process::PrivateResume PreResumeActions failed, not resuming.");
3292 if (
error.Success()) {
3295 LLDB_LOGF(log,
"Process thinks the process has resumed.");
3297 LLDB_LOGF(log,
"Process::PrivateResume() DoResume failed.");
3307 "Process::PrivateResume() asked to simulate a start & stop.");
3313 LLDB_LOGF(log,
"Process::PrivateResume() got an error \"%s\".",
3314 error.AsCString(
"<unknown error>"));
3320 return Status(
"Process is not running.");
3349 halt_listener_sp,
nullptr,
3350 use_run_lock, select_most_relevant);
3364 const uint8_t *buf,
size_t size) {
3365 const size_t region_size = high - low;
3367 if (region_size < size)
3370 std::vector<size_t> bad_char_heuristic(256, size);
3373 for (
size_t idx = 0; idx < size - 1; idx++) {
3374 decltype(bad_char_heuristic)::size_type bcu_idx = buf[idx];
3375 bad_char_heuristic[bcu_idx] = size - idx - 1;
3377 for (
size_t s = 0; s <= (region_size - size);) {
3378 int64_t j = size - 1;
3379 while (j >= 0 && buf[j] == iterator[s + j])
3384 s += bad_char_heuristic[iterator[s + size - 1]];
3399 LLDB_LOGF(log,
"Process::%s() About to stop.", __FUNCTION__);
3409 &exit_event_sp,
true, listener_sp);
3419 LLDB_LOGF(log,
"Process::%s() Process exited while waiting to stop.",
3423 exit_event_sp.reset();
3426 LLDB_LOGF(log,
"Process::%s() failed to stop, state is: %s", __FUNCTION__,
3434 "Attempt to stop the target in order to detach timed out. "
3450 if (
error.Success()) {
3453 if (!
error.Success()) {
3456 }
else if (exit_event_sp) {
3469 if (
error.Success()) {
3480 if (exit_event_sp) {
3515 bool keep_stopped =
false;
3522 if (
error.Success()) {
3539 if (
error.Success()) {
3558 if (exit_event_sp) {
3578 if (
error.Success()) {
3580 if (
error.Success())
3587 assert(signals_sp &&
"null signals_sp");
3607 bool return_value =
true;
3625 return_value =
true;
3629 return_value =
false;
3641 return_value =
true;
3647 return_value =
false;
3660 return_value =
true;
3663 return_value =
false;
3682 "Process::ShouldBroadcastEvent (%p) stopped due to an "
3683 "interrupt, state: %s",
3688 return_value =
true;
3691 bool should_resume =
false;
3703 "Process::ShouldBroadcastEvent: should_resume: %i state: "
3704 "%s was_restarted: %i report_stop_vote: %d.",
3708 switch (report_stop_vote) {
3710 return_value =
true;
3714 return_value =
false;
3718 if (!was_restarted) {
3720 "Process::ShouldBroadcastEvent (%p) Restarting process "
3727 return_value =
true;
3750 "Process::ShouldBroadcastEvent (%p) => new state: %s, last "
3751 "broadcast state: %s - %s",
3754 return_value ?
"YES" :
"NO");
3755 return return_value;
3762 LLDB_LOGF(log,
"Process::%s()%s ", __FUNCTION__,
3763 already_running ?
" already running"
3764 :
" starting private state thread");
3766 if (!is_secondary_thread && already_running)
3771 char thread_name[1024];
3772 uint32_t max_len = llvm::get_max_thread_name_length();
3773 if (max_len > 0 && max_len <= 30) {
3776 if (already_running)
3777 snprintf(thread_name,
sizeof(thread_name),
"intern-state-OV");
3779 snprintf(thread_name,
sizeof(thread_name),
"intern-state");
3781 if (already_running)
3782 snprintf(thread_name,
sizeof(thread_name),
3783 "<lldb.process.internal-state-override(pid=%" PRIu64
")>",
3786 snprintf(thread_name,
sizeof(thread_name),
3787 "<lldb.process.internal-state(pid=%" PRIu64
")>",
GetID());
3790 llvm::Expected<HostThread> private_state_thread =
3793 [
this, is_secondary_thread] {
3797 if (!private_state_thread) {
3799 "failed to launch host thread: {0}");
3803 assert(private_state_thread->IsJoinable());
3824 "Went to stop the private state thread, but it was already invalid.");
3835 LLDB_LOGF(log,
"Process::%s (signal = %d)", __FUNCTION__, signal);
3844 LLDB_LOGF(log,
"Sending control event of type: %d.", signal);
3845 std::shared_ptr<EventDataReceipt> event_receipt_sp(
new EventDataReceipt());
3850 bool receipt_received =
false;
3852 while (!receipt_received) {
3857 if (!receipt_received) {
3874 "Private state thread already dead, no need to signal it to stop.");
3879 if (thread !=
nullptr)
3901 LLDB_LOGF(log,
"Ran next event action, result was %d.", action_result);
3903 switch (action_result) {
3929 if (should_broadcast) {
3933 "Process::%s (pid = %" PRIu64
3934 ") broadcasting new state %s (old state %s) to %s",
3937 is_hijacked ?
"hijacked" :
"public");
3944 if (!
GetTarget().GetDebugger().IsForwardingEvents() &&
3949 LLDB_LOGF(log,
"Process::%s updated m_iohandler_sync to %d",
3983 if (is_hijacked || !
GetTarget().GetDebugger().IsHandlingEvents())
3993 "Process::%s (pid = %" PRIu64
3994 ") suppressing state %s (old state %s): should_broadcast == false",
4016 bool control_only =
true;
4019 LLDB_LOGF(log,
"Process::%s (arg = %p, pid = %" PRIu64
") thread starting...",
4020 __FUNCTION__,
static_cast<void *
>(
this),
GetID());
4022 bool exit_now =
false;
4023 bool interrupt_requested =
false;
4029 "Process::%s (arg = %p, pid = %" PRIu64
4030 ") got a control event: %d",
4031 __FUNCTION__,
static_cast<void *
>(
this),
GetID(),
4032 event_sp->GetType());
4034 switch (event_sp->GetType()) {
4040 control_only =
true;
4044 control_only =
false;
4052 "Process::%s (arg = %p, pid = %" PRIu64
4053 ") woke up with an interrupt while attaching - "
4054 "forwarding interrupt.",
4055 __FUNCTION__,
static_cast<void *
>(
this),
GetID());
4066 "Process::%s (arg = %p, pid = %" PRIu64
4067 ") woke up with an interrupt - Halting.",
4068 __FUNCTION__,
static_cast<void *
>(
this),
GetID());
4070 if (
error.Fail() && log)
4072 "Process::%s (arg = %p, pid = %" PRIu64
4073 ") failed to halt the process: %s",
4074 __FUNCTION__,
static_cast<void *
>(
this),
GetID(),
4081 interrupt_requested =
true;
4090 "Process::%s ignoring interrupt as we have already stopped.",
4106 if (interrupt_requested) {
4116 interrupt_requested =
false;
4119 "Process::%s interrupt_requested, but a non-stopped "
4120 "state '%s' received.",
4131 "Process::%s (arg = %p, pid = %" PRIu64
4132 ") about to exit with internal state %s...",
4133 __FUNCTION__,
static_cast<void *
>(
this),
GetID(),
4141 LLDB_LOGF(log,
"Process::%s (arg = %p, pid = %" PRIu64
") thread exiting...",
4142 __FUNCTION__,
static_cast<void *
>(
this),
GetID());
4147 if (!is_secondary_thread)
4158 :
EventData(), m_process_wp(), m_state(state) {
4166 return "Process::ProcessEventData";
4174 bool &found_valid_stopinfo) {
4175 found_valid_stopinfo =
false;
4177 ProcessSP process_sp(m_process_wp.lock());
4181 ThreadList &curr_thread_list = process_sp->GetThreadList();
4182 uint32_t num_threads = curr_thread_list.
GetSize();
4194 std::vector<std::pair<ThreadSP, size_t>> not_suspended_threads;
4195 for (uint32_t idx = 0; idx < num_threads; ++idx) {
4203 not_suspended_threads.emplace_back(thread_sp, thread_sp->GetIndexID());
4211 bool still_should_stop =
false;
4219 for (
auto [thread_sp, thread_index] : not_suspended_threads) {
4220 if (curr_thread_list.
GetSize() != num_threads) {
4224 "Number of threads changed from %u to %u while processing event.",
4225 num_threads, curr_thread_list.
GetSize());
4229 if (thread_sp->GetIndexID() != thread_index) {
4232 "The thread {0} changed from {1} to {2} while processing event.",
4233 thread_sp.get(), thread_index, thread_sp->GetIndexID());
4237 StopInfoSP stop_info_sp = thread_sp->GetStopInfo();
4238 if (stop_info_sp && stop_info_sp->IsValid()) {
4239 found_valid_stopinfo =
true;
4240 bool this_thread_wants_to_stop;
4241 if (stop_info_sp->GetOverrideShouldStop()) {
4242 this_thread_wants_to_stop =
4243 stop_info_sp->GetOverriddenShouldStopValue();
4245 stop_info_sp->PerformAction(event_ptr);
4253 if (stop_info_sp->HasTargetRunSinceMe()) {
4258 this_thread_wants_to_stop = stop_info_sp->ShouldStop(event_ptr);
4261 if (!still_should_stop)
4262 still_should_stop = this_thread_wants_to_stop;
4266 return still_should_stop;
4277 return m_update_state == 1;
4285 ProcessSP process_sp(m_process_wp.lock());
4298 if (m_update_state != 1)
4301 process_sp->SetPublicState(
4308 process_sp->WillPublicStop();
4323 bool does_anybody_have_an_opinion =
false;
4324 bool still_should_stop = ShouldStop(event_ptr, does_anybody_have_an_opinion);
4326 if (GetRestarted()) {
4330 if (!still_should_stop && does_anybody_have_an_opinion) {
4335 process_sp->PrivateResume();
4338 !process_sp->StateChangedIsHijackedForSynchronousResume();
4346 if (process_sp->GetTarget().RunStopHooks())
4353 ProcessSP process_sp(m_process_wp.lock());
4356 s->
Printf(
" process = %p (pid = %" PRIu64
"), ",
4357 static_cast<void *
>(process_sp.get()), process_sp->GetID());
4386 if (data ==
nullptr)
4394 if (data ==
nullptr)
4404 if (data !=
nullptr)
4412 if (data !=
nullptr)
4423 if (data !=
nullptr)
4430 const char *reason) {
4433 if (data !=
nullptr)
4438 const Event *event_ptr) {
4440 if (data ==
nullptr)
4450 if (data !=
nullptr)
4493 auto event_data_sp =
4494 std::make_shared<ProcessEventData>(shared_from_this(),
GetState());
4495 return std::make_shared<Event>(event_type, event_data_sp);
4521 auto data_sp = std::make_shared<EventDataStructuredData>(
4522 shared_from_this(), object_sp, plugin_sp);
4530 return find_it->second;
4541 size_t bytes_available = one_profile_data.size();
4542 if (bytes_available > 0) {
4544 LLDB_LOGF(log,
"Process::GetProfileData (buf = %p, size = %" PRIu64
")",
4545 static_cast<void *
>(buf),
static_cast<uint64_t
>(buf_size));
4546 if (bytes_available > buf_size) {
4547 memcpy(buf, one_profile_data.c_str(), buf_size);
4548 one_profile_data.erase(0, buf_size);
4549 bytes_available = buf_size;
4551 memcpy(buf, one_profile_data.c_str(), bytes_available);
4555 return bytes_available;
4563 if (bytes_available > 0) {
4565 LLDB_LOGF(log,
"Process::GetSTDOUT (buf = %p, size = %" PRIu64
")",
4566 static_cast<void *
>(buf),
static_cast<uint64_t
>(buf_size));
4567 if (bytes_available > buf_size) {
4570 bytes_available = buf_size;
4576 return bytes_available;
4582 if (bytes_available > 0) {
4584 LLDB_LOGF(log,
"Process::GetSTDERR (buf = %p, size = %" PRIu64
")",
4585 static_cast<void *
>(buf),
static_cast<uint64_t
>(buf_size));
4586 if (bytes_available > buf_size) {
4589 bytes_available = buf_size;
4595 return bytes_available;
4601 process->
AppendSTDOUT(
static_cast<const char *
>(src), src_len);
4607 :
IOHandler(process->GetTarget().GetDebugger(),
4610 m_read_file(GetInputFD(),
File::eOpenOptionReadOnly, false),
4611 m_write_file(write_fd,
File::eOpenOptionWriteOnly, false) {
4612 m_pipe.CreateNew(
false);
4618 std::lock_guard<std::mutex> guard(m_mutex);
4619 SetIsDone(!running);
4620 m_is_running = running;
4626 if (!m_read_file.IsValid() || !m_write_file.IsValid() ||
4627 !m_pipe.CanRead() || !m_pipe.CanWrite()) {
4633 const int read_fd = m_read_file.GetDescriptor();
4638 llvm::consumeError(terminal.
SetEcho(
false));
4641 const int pipe_read_fd = m_pipe.GetReadFileDescriptor();
4645 std::lock_guard<std::mutex> guard(m_mutex);
4662 if (m_read_file.Read(&ch, n).Success() && n == 1) {
4663 if (m_write_file.Write(&ch, n).Fail() || n != 1)
4673 if (
error.Success()) {
4678 m_process->SendAsyncInterrupt();
4682 SetIsRunning(
false);
4687 std::lock_guard<std::mutex> guard(m_mutex);
4702 size_t bytes_written = 0;
4703 m_pipe.Write(&ch, 1, bytes_written);
4715 size_t bytes_written = 0;
4716 Status result = m_pipe.Write(&ch, 1, bytes_written);
4729 m_process->SendAsyncInterrupt();
4745 bool m_is_running =
false;
4751 std::make_unique<ConnectionFileDescriptor>(fd,
true));
4762 std::make_shared<IOHandlerProcessSTDIO>(
this, fd);
4778 if (io_handler_sp) {
4780 LLDB_LOGF(log,
"Process::%s pushing IO handler", __FUNCTION__);
4782 io_handler_sp->SetIsDone(
false);
4789 cancel_top_handler);
4815class RestorePlanState {
4818 : m_thread_plan_sp(thread_plan_sp) {
4819 if (m_thread_plan_sp) {
4820 m_private = m_thread_plan_sp->GetPrivate();
4821 m_is_controlling = m_thread_plan_sp->IsControllingPlan();
4822 m_okay_to_discard = m_thread_plan_sp->OkayToDiscard();
4826 ~RestorePlanState() { Clean(); }
4829 if (!m_already_reset && m_thread_plan_sp) {
4830 m_already_reset =
true;
4831 m_thread_plan_sp->SetPrivate(m_private);
4832 m_thread_plan_sp->SetIsControllingPlan(m_is_controlling);
4833 m_thread_plan_sp->SetOkayToDiscard(m_okay_to_discard);
4839 bool m_already_reset =
false;
4840 bool m_private =
false;
4841 bool m_is_controlling =
false;
4842 bool m_okay_to_discard =
false;
4848 const milliseconds default_one_thread_timeout(250);
4853 : default_one_thread_timeout;
4862 return std::min<microseconds>(default_one_thread_timeout,
4868 bool before_first_timeout) {
4874 if (before_first_timeout)
4878 return std::nullopt;
4883static std::optional<ExpressionResults>
4885 RestorePlanState &restorer,
const EventSP &event_sp,
4886 EventSP &event_to_broadcast_sp,
4888 bool handle_interrupts) {
4891 ThreadSP thread_sp = thread_plan_sp->GetTarget()
4894 .FindThreadByID(thread_id);
4897 "The thread on which we were running the "
4898 "expression: tid = {0}, exited while "
4899 "the expression was running.",
4905 if (plan == thread_plan_sp && plan->PlanSucceeded()) {
4906 LLDB_LOG(log,
"execution completed successfully");
4914 StopInfoSP stop_info_sp = thread_sp->GetStopInfo();
4916 stop_info_sp->ShouldNotify(event_sp.get())) {
4917 LLDB_LOG(log,
"stopped for breakpoint: {0}.", stop_info_sp->GetDescription());
4924 thread_plan_sp->SetPrivate(
false);
4925 event_to_broadcast_sp = event_sp;
4930 if (!handle_interrupts &&
4932 return std::nullopt;
4934 LLDB_LOG(log,
"thread plan did not successfully complete");
4936 event_to_broadcast_sp = event_sp;
4949 if (!thread_plan_sp) {
4955 if (!thread_plan_sp->ValidatePlan(
nullptr)) {
4958 "RunThreadPlan called with an invalid thread plan.");
4964 "RunThreadPlan called on wrong process.");
4969 if (thread ==
nullptr) {
4971 "RunThreadPlan called with invalid thread.");
4982 RestorePlanState thread_plan_restorer(thread_plan_sp);
4989 thread_plan_sp->SetPrivate(
false);
4995 thread_plan_sp->SetIsControllingPlan(
true);
4996 thread_plan_sp->SetOkayToDiscard(
false);
5006 "RunThreadPlan called while the private state was not stopped.");
5011 const uint32_t thread_idx_id = thread->
GetIndexID();
5014 if (!selected_frame_sp) {
5017 if (!selected_frame_sp) {
5018 diagnostic_manager.
Printf(
5020 "RunThreadPlan called without a selected frame on thread %d",
5031 "RunThreadPlan called with one thread "
5032 "timeout greater than total timeout");
5036 StackID ctx_frame_id = selected_frame_sp->GetStackID();
5044 uint32_t selected_tid;
5046 if (selected_thread_sp) {
5047 selected_tid = selected_thread_sp->GetIndexID();
5066 LLDB_LOGF(log,
"Running thread plan on private state thread, spinning up "
5067 "another state thread to handle the events.");
5090 thread_plan_sp,
false);
5123 "Process::RunThreadPlan(): Resuming thread %u - 0x%4.4" PRIx64
5124 " to run thread plan \"%s\".",
5125 thread_idx_id, expr_thread_id, s.
GetData());
5132 bool before_first_timeout =
true;
5134 bool do_resume =
true;
5135 bool handle_running_event =
true;
5138 uint32_t num_resumes = 0;
5144 before_first_timeout =
false;
5146 LLDB_LOGF(log,
"Stop others: %u, try all: %u, before_first: %u.\n",
5148 before_first_timeout);
5155 Event *other_events = listener_sp->PeekAtNextEvent();
5156 if (other_events !=
nullptr) {
5159 "RunThreadPlan called with pending events on the queue.");
5172#ifdef LLDB_RUN_THREAD_HALT_WITH_EVENT
5180 bool miss_first_event =
true;
5188 "Top of while loop: do_resume: %i handle_running_event: %i "
5189 "before_first_timeout: %i.",
5190 do_resume, handle_running_event, before_first_timeout);
5192 if (do_resume || handle_running_event) {
5199 if (!resume_error.
Success()) {
5200 diagnostic_manager.
Printf(
5202 "couldn't resume inferior the %d time: \"%s\".", num_resumes,
5213 "Process::RunThreadPlan(): didn't get any event after "
5214 "resume %" PRIu32
", exiting.",
5218 "didn't get any event after resume %" PRIu32
5229 bool restarted =
false;
5236 "Process::RunThreadPlan(): didn't get running event after "
5237 "resume %d, got %s instead (restarted: %i, do_resume: %i, "
5238 "handle_running_event: %i).",
5240 handle_running_event);
5247 const bool clear_thread_plans =
false;
5248 const bool use_run_lock =
false;
5249 Halt(clear_thread_plans, use_run_lock);
5252 diagnostic_manager.
Printf(
5254 "didn't get running event after initial resume, got %s instead.",
5261 log->
PutCString(
"Process::RunThreadPlan(): resuming succeeded.");
5269 log->
PutCString(
"Process::RunThreadPlan(): waiting for next event.");
5273 handle_running_event =
true;
5282 auto now = system_clock::now();
5284 "Process::RunThreadPlan(): about to wait - now is %s - "
5286 llvm::to_string(now).c_str(),
5287 llvm::to_string(now + *timeout).c_str());
5289 LLDB_LOGF(log,
"Process::RunThreadPlan(): about to wait forever.");
5293#ifdef LLDB_RUN_THREAD_HALT_WITH_EVENT
5295 if (miss_first_event) {
5296 std::this_thread::sleep_for(std::chrono::milliseconds(1));
5297 miss_first_event =
false;
5301 got_event = listener_sp->GetEvent(event_sp, timeout);
5305 bool keep_going =
false;
5307 const bool clear_thread_plans =
false;
5308 const bool use_run_lock =
false;
5309 Halt(clear_thread_plans, use_run_lock);
5312 "execution halted by user interrupt.");
5313 LLDB_LOGF(log,
"Process::RunThreadPlan(): Got interrupted by "
5314 "eBroadcastBitInterrupted, exiting.");
5320 "Process::RunThreadPlan(): in while loop, got event: %s.",
5323 switch (stop_state) {
5329 LLDB_LOGF(log,
"Process::RunThreadPlan(): Got a stop and "
5330 "restart, so we'll continue waiting.");
5333 handle_running_event =
true;
5335 const bool handle_interrupts =
true;
5337 expr_thread_id, thread_plan_sp, thread_plan_restorer,
5338 event_sp, event_to_broadcast_sp, options,
5351 handle_running_event =
false;
5356 "Process::RunThreadPlan(): execution stopped with "
5357 "unexpected state: %s.",
5361 event_to_broadcast_sp = event_sp;
5365 "execution stopped with unexpected state.");
5377 log->
PutCString(
"Process::RunThreadPlan(): got_event was true, but "
5378 "the event pointer was null. How odd...");
5390 if (before_first_timeout) {
5392 "Running function with one thread timeout timed out.");
5394 LLDB_LOG(log,
"Restarting function with all threads enabled and "
5395 "timeout: {0} timed out, abandoning execution.",
5398 LLDB_LOG(log,
"Running function with timeout: {0} timed out, "
5399 "abandoning execution.",
5412 bool back_to_top =
true;
5413 uint32_t try_halt_again = 0;
5414 bool do_halt =
true;
5415 const uint32_t num_retries = 5;
5416 while (try_halt_again < num_retries) {
5419 LLDB_LOGF(log,
"Process::RunThreadPlan(): Running Halt.");
5420 const bool clear_thread_plans =
false;
5421 const bool use_run_lock =
false;
5422 Halt(clear_thread_plans, use_run_lock);
5426 log->
PutCString(
"Process::RunThreadPlan(): Halt succeeded.");
5436 "Process::RunThreadPlan(): Stopped with event: %s",
5441 log->
PutCString(
" Event was the Halt interruption event.");
5448 log->
PutCString(
"Process::RunThreadPlan(): Went to halt "
5449 "but got a restarted event, there must be "
5450 "an un-restarted stopped event so try "
5452 "Exiting wait loop.");
5461 const bool handle_interrupts =
false;
5463 expr_thread_id, thread_plan_sp, thread_plan_restorer,
5464 event_sp, event_to_broadcast_sp, options,
5465 handle_interrupts)) {
5466 return_value = *result;
5467 back_to_top =
false;
5473 log->
PutCString(
"Process::RunThreadPlan(): try_all_threads "
5474 "was false, we stopped so now we're "
5477 back_to_top =
false;
5481 if (before_first_timeout) {
5484 before_first_timeout =
false;
5485 thread_plan_sp->SetStopOthers(
false);
5488 "Process::RunThreadPlan(): about to resume.");
5495 log->
PutCString(
"Process::RunThreadPlan(): running all "
5496 "threads timed out.");
5498 back_to_top =
false;
5504 log->
PutCString(
"Process::RunThreadPlan(): halt said it "
5505 "succeeded, but I got no event. "
5506 "I'm getting out of here passing Interrupted.");
5508 back_to_top =
false;
5517 if (!back_to_top || try_halt_again > num_retries)
5526 if (backup_private_state_thread.
IsJoinable()) {
5530 if (stopper_base_plan_sp) {
5541 return return_value;
5547 s.
PutCString(
"Thread state after unsuccessful completion: \n");
5562 thread_plan_sp->RestoreThreadState();
5573 log->
PutCString(
"Process::RunThreadPlan(): Stop event that "
5574 "interrupted us is NULL.");
5579 const char *event_explanation =
nullptr;
5583 event_explanation =
"<no event>";
5586 event_explanation =
"<user interrupt>";
5594 event_explanation =
"<no event data>";
5601 event_explanation =
"<no process>";
5607 uint32_t num_threads = thread_list.
GetSize();
5608 uint32_t thread_index;
5610 ts.
Printf(
"<%u threads> ", num_threads);
5612 for (thread_index = 0; thread_index < num_threads; ++thread_index) {
5624 if (register_context)
5625 ts.
Printf(
"[ip 0x%" PRIx64
"] ", register_context->
GetPC());
5627 ts.
Printf(
"[ip unknown] ");
5633 const char *stop_desc = stop_info_sp->GetDescription();
5640 event_explanation = ts.
GetData();
5644 if (event_explanation)
5646 "Process::RunThreadPlan(): execution interrupted: %s %s",
5647 s.
GetData(), event_explanation);
5649 LLDB_LOGF(log,
"Process::RunThreadPlan(): execution interrupted: %s",
5653 if (should_unwind) {
5655 "Process::RunThreadPlan: ExecutionInterrupted - "
5656 "discarding thread plans up to %p.",
5657 static_cast<void *
>(thread_plan_sp.get()));
5661 "Process::RunThreadPlan: ExecutionInterrupted - for "
5662 "plan: %p not discarding.",
5663 static_cast<void *
>(thread_plan_sp.get()));
5667 log->
PutCString(
"Process::RunThreadPlan(): execution set up error.");
5675 log->
PutCString(
"Process::RunThreadPlan(): thread plan is done");
5680 "Process::RunThreadPlan(): thread plan was discarded");
5685 "Process::RunThreadPlan(): thread plan stopped in mid course");
5688 log->
PutCString(
"Process::RunThreadPlan(): discarding thread plan "
5689 "'cause unwind_on_error is set.");
5707 if (
GetThreadList().SetSelectedThreadByIndexID(selected_tid) &&
5708 selected_stack_id.
IsValid()) {
5710 std::lock_guard<std::recursive_mutex> guard(
GetThreadList().GetMutex());
5716 old_frame_sp.get());
5723 if (event_to_broadcast_sp) {
5725 log->
PutCString(
"Process::RunThreadPlan(): rebroadcasting event.");
5729 return return_value;
5733 const char *result_name =
"<unknown>";
5737 result_name =
"eExpressionCompleted";
5740 result_name =
"eExpressionDiscarded";
5743 result_name =
"eExpressionInterrupted";
5746 result_name =
"eExpressionHitBreakpoint";
5749 result_name =
"eExpressionSetupError";
5752 result_name =
"eExpressionParseError";
5755 result_name =
"eExpressionResultUnavailable";
5758 result_name =
"eExpressionTimedOut";
5761 result_name =
"eExpressionStoppedForDebug";
5764 result_name =
"eExpressionThreadVanished";
5775 strm.
Printf(
"Process %" PRIu64
" exited with status = %i (0x%8.8x) %s\n",
5776 GetID(), exit_status, exit_status,
5777 exit_description ? exit_description :
"");
5780 strm.
Printf(
"Connected to remote target.\n");
5785 strm.
Printf(
"Process %" PRIu64
" is running.\n",
GetID());
5790 bool only_threads_with_stop_reason,
5791 uint32_t start_frame, uint32_t num_frames,
5792 uint32_t num_frames_with_source,
5794 size_t num_thread_infos_dumped = 0;
5801 uint32_t num_threads;
5802 std::vector<lldb::tid_t> thread_id_array;
5805 std::lock_guard<std::recursive_mutex> guard(
GetThreadList().GetMutex());
5807 num_threads = curr_thread_list.
GetSize();
5809 thread_id_array.resize(num_threads);
5810 for (idx = 0; idx < num_threads; ++idx)
5814 for (uint32_t i = 0; i < num_threads; i++) {
5817 if (only_threads_with_stop_reason) {
5818 StopInfoSP stop_info_sp = thread_sp->GetStopInfo();
5819 if (!stop_info_sp || !stop_info_sp->IsValid())
5822 thread_sp->GetStatus(strm, start_frame, num_frames,
5823 num_frames_with_source, stop_format,
5825 ++num_thread_infos_dumped;
5828 LLDB_LOGF(log,
"Process::GetThreadStatus - thread 0x" PRIu64
5829 " vanished while running Thread::GetStatus.");
5832 return num_thread_infos_dumped;
5856 result = this_result;
5928 "Setting Process code address mask to {0:x}", code_address_mask);
5934 "Setting Process data address mask to {0:x}", data_address_mask);
5940 "Setting Process highmem code address mask to {0:x}",
5947 "Setting Process highmem data address mask to {0:x}",
5954 addr = abi_sp->FixCodeAddress(addr);
5960 addr = abi_sp->FixDataAddress(addr);
5966 addr = abi_sp->FixAnyAddress(addr);
5972 LLDB_LOGF(log,
"Process::%s()", __FUNCTION__);
6007 if (address ==
nullptr) {
6008 error.SetErrorString(
"Invalid address argument");
6015 std::map<addr_t, addr_t>::const_iterator iter =
6018 function_addr = (*iter).second;
6022 error.SetErrorStringWithFormat(
6023 "Unable to call resolver for indirect function %s",
6028 function_addr = abi_sp->FixCodeAddress(function_addr);
6030 std::pair<addr_t, addr_t>(addr, function_addr));
6033 return function_addr;
6049 runtime.second->ModulesDidLoad(module_list);
6055 runtime->ModulesDidLoad(module_list);
6066 pair.second->ModulesDidLoad(*
this, module_list);
6090 if (plugins[language])
6092 sc.
module_sp->ReportWarningUnsupportedLanguage(
6103 return platform_sp->GetProcessInfo(
GetID(), info);
6112 if (!memory_history) {
6116 threads = std::make_shared<ThreadCollection>(
6117 memory_history->GetHistoryThreads(addr));
6124 InstrumentationRuntimeCollection::iterator pos;
6129 return (*pos).second;
6134 module_spec.
Clear();
6161 Address retval = default_stop_addr;
6165 if (!default_stop_addr.
IsValid())
6168 const char *plugin_name =
nullptr;
6169 const char *flavor =
nullptr;
6172 if (disassembler_sp)
6173 insn_list = &disassembler_sp->GetInstructionList();
6175 if (insn_list ==
nullptr) {
6179 size_t insn_offset =
6186 insn_offset,
false ,
nullptr);
6191 if (branch_index > insn_offset) {
6192 Address next_branch_insn_address =
6194 if (next_branch_insn_address.
IsValid() &&
6196 retval = next_branch_insn_address;
6206 load_addr = abi->FixAnyAddress(load_addr);
6216 region_list.clear();
6222 region_list.clear();
6233 region_list.push_back(std::move(region_info));
6241 !(abi && (abi->FixAnyAddress(range_end) != range_end)));
6252 return Status(
"unimplemented");
6260 if (supported_type_names.
GetSize() == 0) {
6261 LLDB_LOG(log,
"no structured data types supported");
6266 std::set<llvm::StringRef> type_names;
6269 "the process supports the following async structured data types:");
6278 const llvm::StringRef type_name =
object->GetStringValue();
6279 if (type_name.empty())
6282 type_names.insert(type_name);
6292 for (uint32_t plugin_index = 0; !type_names.empty(); plugin_index++) {
6293 auto create_instance =
6296 if (!create_instance)
6308 std::vector<llvm::StringRef> names_to_remove;
6309 for (llvm::StringRef type_name : type_names) {
6310 if (plugin_sp->SupportsStructuredDataType(type_name)) {
6312 std::make_pair(type_name, plugin_sp));
6313 names_to_remove.push_back(type_name);
6314 LLDB_LOG(log,
"using plugin {0} for type name {1}",
6315 plugin_sp->GetPluginName(), type_name);
6320 for (llvm::StringRef type_name : names_to_remove)
6321 type_names.erase(type_name);
6338 llvm::StringRef type_name;
6350 find_it->second->HandleArrivalOfStructuredData(*
this, type_name, object_sp);
6362 llvm::function_ref<std::unique_ptr<UtilityFunction>()> factory) {
6363 if (platform !=
GetTarget().GetPlatform().get())
6372 return llvm::createStringError(llvm::inconvertibleErrorCode(),
6373 "Can't trace a non-live process.");
6374 return llvm::make_error<UnimplementedError>();
6379 bool trap_exceptions) {
6381 if (thread ==
nullptr || address ==
nullptr)
6393 auto type_system_or_err =
6395 if (!type_system_or_err) {
6396 llvm::consumeError(type_system_or_err.takeError());
6399 auto ts = *type_system_or_err;
6405 *thread, *address, void_ptr_type, llvm::ArrayRef<addr_t>(), options));
6417 call_plan_sp->GetReturnValueObject()->GetValueAsUnsigned(
6439 if (!arch || !tag_manager) {
6440 return llvm::createStringError(
6441 llvm::inconvertibleErrorCode(),
6442 "This architecture does not support memory tagging");
6446 return llvm::createStringError(llvm::inconvertibleErrorCode(),
6447 "Process does not support memory tagging");
6453llvm::Expected<std::vector<lldb::addr_t>>
6455 llvm::Expected<const MemoryTagManager *> tag_manager_or_err =
6457 if (!tag_manager_or_err)
6458 return tag_manager_or_err.takeError();
6461 llvm::Expected<std::vector<uint8_t>> tag_data =
6464 return tag_data.takeError();
6471 const std::vector<lldb::addr_t> &tags) {
6472 llvm::Expected<const MemoryTagManager *> tag_manager_or_err =
6474 if (!tag_manager_or_err)
6475 return Status(tag_manager_or_err.takeError());
6478 llvm::Expected<std::vector<uint8_t>> packed_tags =
6481 return Status(packed_tags.takeError());
6502 if (!dirty_page_list)
6508 llvm::AddressRange range(0, 0);
6509 for (
addr_t page_addr : *dirty_page_list) {
6510 if (range.empty()) {
6512 range = llvm::AddressRange(page_addr, page_addr + page_size);
6514 if (range.end() == page_addr) {
6516 range = llvm::AddressRange(range.start(), page_addr + page_size);
6520 ranges.push_back({range, lldb_permissions});
6521 range = llvm::AddressRange(page_addr, page_addr + page_size);
6527 ranges.push_back({range, lldb_permissions});
6554 std::set<addr_t> &stack_ends) {
6555 const bool try_dirty_pages =
true;
6564 StackFrameSP frame_sp = thread_sp->GetStackFrameAtIndex(0);
6570 const addr_t sp = reg_ctx_sp->GetSP();
6571 const size_t red_zone = process.
GetABI()->GetRedZoneSize();
6574 const size_t stack_head = (
sp - red_zone);
6585 AddRegion(sp_region, try_dirty_pages, ranges);
6595 std::set<addr_t> &stack_ends) {
6598const bool try_dirty_pages =
false;
6599 for (
const auto ®ion : regions)
6600 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0)
6601 AddRegion(region, try_dirty_pages, ranges);
6613 bool have_dirty_page_info =
false;
6614 for (
const auto ®ion : regions) {
6615 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0 &&
6617 have_dirty_page_info =
true;
6620 if (!have_dirty_page_info) {
6623 const bool try_dirty_pages =
false;
6624 for (
const auto ®ion : regions)
6625 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0 &&
6627 AddRegion(region, try_dirty_pages, ranges);
6642 const bool try_dirty_pages =
true;
6646 for (
const auto ®ion : regions) {
6648 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0 &&
6650 AddRegion(region, try_dirty_pages, ranges);
6661 if (regions.empty())
6662 return Status(
"failed to get any valid memory regions from the process");
6664 return Status(
"callers must set the core_style to something other than "
6665 "eSaveCoreUnspecified");
6667 std::set<addr_t> stack_ends;
6670 switch (core_style) {
6691 return Status(
"no valid address ranges found for core style");
6696std::vector<ThreadSP>
6698 std::vector<ThreadSP> thread_list;
6701 thread_list.push_back(thread_sp);
6712 if (low_memory_addr_bits == 0 && high_memory_addr_bits == 0)
6715 if (low_memory_addr_bits != 0) {
6722 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 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 GetCoreFileSaveRangesStackOnly(Process &process, const MemoryRegionInfos ®ions, Process::CoreFileMemoryRanges &ranges, std::set< addr_t > &stack_ends)
static constexpr OptionEnumValueElement g_follow_fork_mode_values[]
static void GetCoreFileSaveRangesFull(Process &process, const MemoryRegionInfos ®ions, Process::CoreFileMemoryRanges &ranges, std::set< addr_t > &stack_ends)
static void GetCoreFileSaveRangesDirtyOnly(Process &process, const MemoryRegionInfos ®ions, Process::CoreFileMemoryRanges &ranges, std::set< addr_t > &stack_ends)
static void SaveOffRegionsWithStackPointers(Process &process, const SaveCoreOptions &core_options, const MemoryRegionInfos ®ions, Process::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 Process::CoreFileMemoryRange CreateCoreFileMemoryRange(const MemoryRegionInfo ®ion)
static void AddRegion(const MemoryRegionInfo ®ion, bool try_dirty_pages, Process::CoreFileMemoryRanges &ranges)
static bool AddDirtyPages(const MemoryRegionInfo ®ion, Process::CoreFileMemoryRanges &ranges)
#define LLDB_SCOPED_TIMER()
void SetIsRunning(bool running)
~IOHandlerProcessSTDIO() override=default
bool Interrupt() override
IOHandlerProcessSTDIO(Process *process, int write_fd)
A windows-based implementation of Pipe, a class that abtracts unix style pipes.
ProcessExperimentalOptionValueProperties()
const lldb::addr_t m_base_addr
ProcessMemoryIterator(Process &process, lldb::addr_t base)
uint8_t operator[](lldb::addr_t offset)
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
lldb::addr_t AllocateMemory(size_t byte_size, uint32_t permissions, Status &error)
void Clear(bool deallocate_memory)
bool DeallocateMemory(lldb::addr_t ptr)
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.
An event broadcasting class.
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.
bool IsConnected() const
Check if the connection is valid.
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.
A class to manage flag bits.
static lldb::TargetSP FindTargetWithProcessID(lldb::pid_t pid)
StreamFile & GetErrorStream()
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.
lldb::StreamSP GetAsyncErrorStream()
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, Target &target, const AddressRange &disasm_range, 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 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.
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.
Status Join(lldb::thread_result_t *result)
bool EqualsThread(lldb::thread_t thread) const
static lldb::thread_t GetCurrentThread()
Get the thread token (the one returned by ThreadCreate when the thread was created) for the calling t...
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)
uint32_t GetMemoryCacheLineSize() const
bool RemoveInvalidRange(lldb::addr_t base_addr, lldb::addr_t byte_size)
void Flush(lldb::addr_t addr, size_t size)
void Clear(bool clear_invalid_ranges=false)
size_t Read(lldb::addr_t addr, void *dst, size_t dst_len, Status &error)
void AddInvalidRange(lldb::addr_t base_addr, lldb::addr_t byte_size)
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
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
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
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()
void SetValue(T value, PredicateBroadcastType broadcast_type)
Value set accessor.
T GetValue() const
Value get accessor.
std::optional< T > WaitForValueNotEqualTo(T value, const Timeout< std::micro > &timeout=std::nullopt)
Wait for m_value to not be equal to value.
uint32_t GetResumeCount() const
lldb::ListenerSP GetListenerForProcess(Debugger &debugger)
bool GetWaitForLaunch() const
ProcessExperimentalProperties()
lldb::pid_t GetProcessID() const
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)
void SetRunningUserExpression(bool on)
uint32_t GetMemoryID() const
void SetStopEventForLastNaturalStopID(lldb::EventSP event_sp)
uint32_t GetStopID() const
bool IsRunningUtilityFunction() const
bool IsLastResumeForUserExpression() const
void SetRunningUtilityFunction(bool on)
bool GetDetachKeepsStopped() 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 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)
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
@ eBroadcastBitStructuredData
@ eBroadcastBitStateChanged
@ eBroadcastBitProfileData
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()
enum lldb_private::Process::@31 m_can_jit
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...
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()
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.
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
virtual Status DoResume()
Resumes all of a process's threads as configured using the Thread run control functions.
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.
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
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)
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()
@ eBroadcastInternalStateControlResume
@ eBroadcastInternalStateControlStop
@ eBroadcastInternalStateControlPause
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 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)
bool IsPossibleDynamicValue(ValueObject &in_value)
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.
bool() PreResumeActionCallback(void *)
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
bool RouteAsyncStructuredData(const StructuredData::ObjectSP object_sp)
Route the incoming structured data dictionary to the right plugin.
virtual void DidDestroy()
lldb::addr_t ReadPointerFromMemory(lldb::addr_t vm_addr, Status &error)
static const char * ExecutionResultAsCString(lldb::ExpressionResults result)
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.
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()
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.
std::vector< CoreFileMemoryRange > CoreFileMemoryRanges
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 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()
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
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.
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...
virtual Status DoDeallocateMemory(lldb::addr_t ptr)
Actually deallocate memory in the process.
Status GetMemoryRegionInfo(lldb::addr_t load_addr, MemoryRegionInfo &range_info)
Locate the memory region that contains load_addr.
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
virtual lldb::addr_t DoAllocateMemory(size_t size, uint32_t permissions, Status &error)
Actually allocate memory in the process.
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
static llvm::StringRef GetExperimentalSettingsName()
bool SetPropertyAtIndex(uint32_t idx, T t, const ExecutionContext *exe_ctx=nullptr) const
virtual lldb::OptionValuePropertiesSP GetValueProperties() const
const lldb::OptionValueSP & GetValue() const
uint32_t GetSize()
Get the number of libdispatch queues that are available.
void Clear()
Clear out the list of queues from the QueueList.
uint64_t GetPC(uint64_t fail_value=LLDB_INVALID_ADDRESS)
lldb::SaveCoreStyle GetStyle() 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.
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.
void SetErrorString(llvm::StringRef err_str)
Set the current error string to err_str.
bool Success() const
Test for success condition.
static lldb::ValueObjectSP GetCrashingDereference(lldb::StopInfoSP &stop_info_sp, lldb::addr_t *crashing_address=nullptr)
StopPointSite::SiteID Add(const StopPointSiteSP &site_sp)
Add a site to the list.
void ForEach(std::function< void(StopPointSite *)> const &callback)
bool FindInRange(lldb::addr_t lower_bound, lldb::addr_t upper_bound, StopPointSiteList &bp_site_list) const
StopPointSiteSP FindByID(typename StopPointSite::SiteID site_id)
Returns a shared pointer to the site with id site_id.
bool Remove(typename StopPointSite::SiteID site_id)
Removes the site given by site_id from this list.
StopPointSiteSP FindByAddress(lldb::addr_t addr)
Returns a shared pointer to the site at address addr.
bool RemoveByAddress(lldb::addr_t addr)
Removes the site at address addr from this list.
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()
void UpdateSignalsFromDummy(lldb::UnixSignalsSP signals_sp, lldb::StreamSP warning_stream_sp)
Updates the signals in signals_sp using the stored dummy signals.
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().
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()
bool ShouldStop(Event *event_ptr)
Vote ShouldReportStop(Event *event_ptr)
uint32_t GetStopID() const
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)
Vote ShouldReportRun(Event *event_ptr)
void SetStopID(uint32_t stop_id)
lldb::ThreadSP GetThreadAtIndex(uint32_t idx, bool can_update=true)
std::recursive_mutex & GetMutex() const override
lldb::ThreadSP GetExpressionExecutionThread()
void DiscardThreadPlans()
void Update(ThreadList &rhs)
Precondition: both thread lists must be belong to the same process.
bool WillResume()
The thread list asks tells all the threads it is about to resume.
void SetShouldReportStop(Vote vote)
void ClearThreadCache()
Clear the Thread* cache that each ThreadPlan contains.
void DumpPlans(Stream &strm, lldb::DescriptionLevel desc_level, bool internal, bool ignore_boring, bool skip_unreported)
bool PrunePlansForTID(lldb::tid_t tid)
ThreadPlanStack * Find(lldb::tid_t tid)
void Update(ThreadList ¤t_threads, bool delete_missing, bool check_for_new=true)
bool DumpPlansForTID(Stream &strm, lldb::tid_t tid, lldb::DescriptionLevel desc_level, bool internal, bool ignore_boring, bool skip_unreported)
void SetValue(const T &value)
const T & GetValueNoLock() const
void SetValueNoLock(const T &value)
std::recursive_mutex & GetMutex()
bool IsThreadPlanDone(ThreadPlan *plan) const
Checks whether the given plan is in the completed plans for this stop.
virtual lldb::user_id_t GetProtocolID() const
virtual lldb::StackFrameSP GetStackFrameAtIndex(uint32_t idx)
Status QueueThreadPlan(lldb::ThreadPlanSP &plan_sp, bool abort_other_plans)
Queues a generic thread plan.
bool WasThreadPlanDiscarded(ThreadPlan *plan) const
Checks whether the given plan is in the discarded plans for this stop.
virtual lldb::RegisterContextSP GetRegisterContext()=0
static void SettingsInitialize()
virtual lldb::StopInfoSP GetPrivateStopInfo(bool calculate=true)
uint32_t GetIndexID() const
lldb::StackFrameSP GetSelectedFrame(SelectMostRelevant select_most_relevant)
size_t GetStackFrameStatus(Stream &strm, uint32_t first_frame, uint32_t num_frames, bool show_frame_info, uint32_t num_frames_with_source, bool show_hidden)
uint32_t SetSelectedFrame(lldb_private::StackFrame *frame, bool broadcast=false)
static void SettingsTerminate()
virtual lldb::StackFrameSP GetFrameWithStackID(const StackID &stack_id)
void DiscardThreadPlansUpToPlan(lldb::ThreadPlanSP &up_to_plan_sp)
Discards the plans queued on the plan stack of the current thread up to and including up_to_plan_sp.
static ThreadProperties & GetGlobalProperties()
void SetConnection(std::unique_ptr< Connection > connection) override
Sets the connection that it to be used by this class.
virtual bool StopReadThread(Status *error_ptr=nullptr)
Stops the read thread by cancelling it.
void SynchronizeWithReadThread()
Wait for the read thread to process all outstanding data.
lldb::ConnectionStatus Disconnect(Status *error_ptr=nullptr) override
Disconnect the communications connection if one is currently connected.
virtual bool StartReadThread(Status *error_ptr=nullptr)
Starts a read thread whose sole purpose it to read bytes from the current connection.
void SetReadThreadBytesReceivedCallback(ReadThreadBytesReceived callback, void *callback_baton)
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...
@ eGetExpressionPathFormatHonorPointers
lldb::LanguageType GetObjectRuntimeLanguage()
#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.
void RegisterVerboseTrapFrameRecognizer(Process &process)
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
const char * GetPermissionsAsCString(uint32_t permissions)
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
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
std::shared_ptr< lldb_private::Stream > StreamSP
ExpressionResults
The results of expression evaluation.
@ eExpressionHitBreakpoint
@ eExpressionStoppedForDebug
@ eExpressionResultUnavailable
@ 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.
@ eStopReasonInstrumentation
@ eStopReasonPlanComplete
@ eStopReasonExec
Program was re-exec'ed.
@ eStopReasonInterrupt
Thread requested interrupt.
@ eStopReasonProcessorTrace
@ eStopReasonThreadExiting
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)
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
void SetByteSize(SizeType s)
lldb::user_id_t GetID() const
Get accessor for the user ID.