14#include "llvm/ADT/ScopeExit.h"
15#include "llvm/Support/ScopedPrinter.h"
16#include "llvm/Support/Threading.h"
83using namespace std::chrono;
89 if (inserted || previous->second == action)
97 :
public Cloneable<ProcessOptionValueProperties, OptionValueProperties> {
113 if (
this != instance_properties)
125 "Continue tracing the parent process and detach the child.",
130 "Trace the child process and detach the parent.",
136#define LLDB_PROPERTIES_process
137#include "TargetProperties.inc"
140#define LLDB_PROPERTIES_process
141#include "TargetPropertiesEnum.inc"
145#define LLDB_PROPERTIES_process_experimental
146#include "TargetProperties.inc"
149#define LLDB_PROPERTIES_process_experimental
150#include "TargetPropertiesEnum.inc"
154 :
public Cloneable<ProcessExperimentalOptionValueProperties,
155 OptionValueProperties> {
171 if (process ==
nullptr) {
173 m_collection_sp = std::make_shared<ProcessOptionValueProperties>(
"process");
176 "thread",
"Settings specific to threads.",
true,
182 ePropertyPythonOSPluginPath,
183 [
this] {
m_process->LoadOperatingSystemPlugin(
true); });
185 ePropertyDisableLangRuntimeUnwindPlans,
190 std::make_unique<ProcessExperimentalProperties>();
193 "Experimental settings - setting these won't produce "
194 "errors if the setting is not present.",
201 const uint32_t idx = ePropertyDisableMemCache;
203 idx, g_process_properties[idx].default_uint_value != 0);
207 const uint32_t idx = ePropertyMemCacheLineSize;
209 idx, g_process_properties[idx].default_uint_value);
214 const uint32_t idx = ePropertyExtraStartCommand;
220 const uint32_t idx = ePropertyExtraStartCommand;
225 const uint32_t idx = ePropertyPythonOSPluginPath;
230 const uint32_t idx = ePropertyVirtualAddressableBits;
232 idx, g_process_properties[idx].default_uint_value);
236 const uint32_t idx = ePropertyVirtualAddressableBits;
241 const uint32_t idx = ePropertyHighmemVirtualAddressableBits;
243 idx, g_process_properties[idx].default_uint_value);
247 const uint32_t idx = ePropertyHighmemVirtualAddressableBits;
252 const uint32_t idx = ePropertyPythonOSPluginPath;
257 const uint32_t idx = ePropertyIgnoreBreakpointsInExpressions;
259 idx, g_process_properties[idx].default_uint_value != 0);
263 const uint32_t idx = ePropertyIgnoreBreakpointsInExpressions;
268 const uint32_t idx = ePropertyUnwindOnErrorInExpressions;
270 idx, g_process_properties[idx].default_uint_value != 0);
274 const uint32_t idx = ePropertyUnwindOnErrorInExpressions;
279 const uint32_t idx = ePropertyStopOnSharedLibraryEvents;
281 idx, g_process_properties[idx].default_uint_value != 0);
285 const uint32_t idx = ePropertyStopOnSharedLibraryEvents;
290 const uint32_t idx = ePropertyDisableLangRuntimeUnwindPlans;
292 idx, g_process_properties[idx].default_uint_value != 0);
296 const uint32_t idx = ePropertyDisableLangRuntimeUnwindPlans;
304 for (
auto thread_sp :
m_process->Threads()) {
305 thread_sp->ClearStackFrames();
306 thread_sp->DiscardThreadPlans(
true);
311 const uint32_t idx = ePropertyDetachKeepsStopped;
313 idx, g_process_properties[idx].default_uint_value != 0);
317 const uint32_t idx = ePropertyDetachKeepsStopped;
322 const uint32_t idx = ePropertyWarningOptimization;
324 idx, g_process_properties[idx].default_uint_value != 0);
328 const uint32_t idx = ePropertyWarningUnsupportedLanguage;
330 idx, g_process_properties[idx].default_uint_value != 0);
334 const uint32_t idx = ePropertyStopOnExec;
336 idx, g_process_properties[idx].default_uint_value != 0);
340 const uint32_t idx = ePropertyUseDelayedBreakpoints;
342 idx, g_process_properties[idx].default_uint_value != 0);
346 const uint32_t idx = ePropertyUtilityExpressionTimeout;
348 idx, g_process_properties[idx].default_uint_value);
349 return std::chrono::seconds(value);
353 const uint32_t idx = ePropertyInterruptTimeout;
355 idx, g_process_properties[idx].default_uint_value);
356 return std::chrono::seconds(value);
360 const uint32_t idx = ePropertySteppingRunsAllThreads;
362 idx, g_process_properties[idx].default_uint_value != 0);
367 const uint32_t idx = ePropertyAlwaysRunThreadNames;
373 const bool fail_value =
true;
377 exp_property->
GetValue()->GetAsProperties();
383 .value_or(fail_value);
390 exp_property->
GetValue()->GetAsProperties();
397 const uint32_t idx = ePropertyFollowForkMode;
400 g_process_properties[idx].default_uint_value));
404 const uint32_t idx = ePropertyTrackMemoryCacheChanges;
406 idx, g_process_properties[idx].default_uint_value != 0);
410 llvm::StringRef plugin_name,
414 static std::atomic<uint32_t> g_process_unique_id{0};
418 if (!plugin_name.empty()) {
421 if (create_callback) {
422 process_sp = create_callback(target_sp, listener_sp, crash_file_path,
425 if (process_sp->CanDebug(target_sp,
true)) {
426 process_sp->m_process_unique_id = ++g_process_unique_id;
433 process_sp = create_callback(target_sp, listener_sp, crash_file_path,
436 if (process_sp->CanDebug(target_sp,
false)) {
437 process_sp->m_process_unique_id = ++g_process_unique_id;
448 static constexpr llvm::StringLiteral class_name(
"lldb.process");
461 Broadcaster((target_sp->GetDebugger().GetBroadcasterManager()),
465 "lldb.process.internal_state_broadcaster"),
467 nullptr,
"lldb.process.internal_state_control_broadcaster"),
469 Listener::MakeListener(
"lldb.process.internal_state_listener")),
494 LLDB_LOGF(log,
"%p Process::Process()",
static_cast<void *
>(
this));
532 uint64_t platform_cache_line_size =
533 target_sp->GetPlatform()->GetDefaultMemoryCacheLineSize();
534 if (!value_sp->OptionWasSet() && platform_cache_line_size != 0)
535 value_sp->SetValueAs(platform_cache_line_size);
545 LLDB_LOGF(log,
"%p Process::~Process()",
static_cast<void *
>(
this));
559 return *g_settings_ptr;
594 std::vector<Notifications> empty_notifications;
626 if (pos->baton == callbacks.
baton &&
637 std::vector<Notifications>::iterator notification_pos,
640 notification_pos != notification_end; ++notification_pos) {
641 if (notification_pos->process_state_changed)
642 notification_pos->process_state_changed(notification_pos->baton,
this,
661 std::chrono::seconds(0)) &&
675 auto Result =
m_iohandler_sync.WaitForValueNotEqualTo(iohandler_id, timeout);
681 "waited from m_iohandler_sync to change from {0}. New value is {1}.",
682 iohandler_id, *Result);
684 LLDB_LOG(log,
"timed out waiting for m_iohandler_sync to change from {0}.",
697 event_sp_ptr->reset();
705 LLDB_LOG(log,
"timeout = {0}", timeout);
710 "Process::%s returning without waiting for events; process "
711 "private and public states are already 'stopped'.",
715 if (hijack_listener_sp && use_run_lock)
723 if (event_sp_ptr && event_sp)
724 *event_sp_ptr = event_sp;
726 bool pop_process_io_handler = (hijack_listener_sp.get() !=
nullptr);
728 event_sp, stream, select_most_relevant, pop_process_io_handler);
737 if (hijack_listener_sp && use_run_lock)
746 if (hijack_listener_sp && use_run_lock)
760 bool &pop_process_io_handler) {
761 const bool handle_pop = pop_process_io_handler;
763 pop_process_io_handler =
false;
775 switch (event_state) {
783 stream->
Printf(
"Process %" PRIu64
" %s\n", process_sp->GetID(),
786 pop_process_io_handler =
true;
796 process_sp->GetStatus(*stream);
797 pop_process_io_handler =
true;
808 if (num_reasons > 0) {
811 if (num_reasons == 1) {
815 stream->
Printf(
"Process %" PRIu64
" stopped and restarted: %s\n",
817 reason ? reason :
"<UNKNOWN REASON>");
819 stream->
Printf(
"Process %" PRIu64
820 " stopped and restarted, reasons:\n",
821 process_sp->GetID());
823 for (
size_t i = 0; i < num_reasons; i++) {
827 stream->
Printf(
"\t%s\n", reason ? reason :
"<UNKNOWN REASON>");
837 ThreadList &thread_list = process_sp->GetThreadList();
838 std::lock_guard<std::recursive_mutex> guard(thread_list.
GetMutex());
842 if (curr_thread && curr_thread->IsValid())
843 curr_thread_stop_info_sp = curr_thread->GetStopInfo();
844 bool prefer_curr_thread = curr_thread_stop_info_sp &&
845 curr_thread_stop_info_sp->ShouldSelect();
847 if (!prefer_curr_thread) {
855 if (!stop_info || !stop_info->ShouldSelect())
857 StopReason thread_stop_reason = stop_info->GetStopReason();
860 plan_thread = thread;
861 }
else if (!other_thread) {
862 other_thread = thread;
867 else if (other_thread)
871 if (curr_thread && curr_thread->IsValid())
872 thread = curr_thread;
886 Debugger &debugger = process_sp->GetTarget().GetDebugger();
888 &process_sp->GetTarget()) {
889 ThreadSP thread_sp = process_sp->GetThreadList().GetSelectedThread();
891 if (!thread_sp || !thread_sp->IsValid())
894 const bool only_threads_with_stop_reason =
true;
895 const uint32_t start_frame =
896 thread_sp->GetSelectedFrameIndex(select_most_relevant);
897 const uint32_t num_frames = 1;
898 const uint32_t num_frames_with_source = 1;
899 const bool stop_format =
true;
901 process_sp->GetStatus(*stream);
902 process_sp->GetThreadStatus(*stream, only_threads_with_stop_reason,
903 start_frame, num_frames,
904 num_frames_with_source,
906 if (curr_thread_stop_info_sp) {
909 curr_thread_stop_info_sp, &crashing_address);
912 ValueObject::GetExpressionPathFormat::
913 eGetExpressionPathFormatHonorPointers;
915 valobj_sp->GetExpressionPath(*stream, format);
916 stream->
Printf(
" accessed 0x%" PRIx64
"\n", crashing_address);
921 process_sp->GetTarget().shared_from_this());
923 stream->
Printf(
"Target %d: (", target_idx);
925 stream->
Printf(
"Target <unknown index>: (");
927 stream->
Printf(
") stopped.\n");
932 pop_process_io_handler =
true;
937 if (handle_pop && pop_process_io_handler)
938 process_sp->PopProcessIOHandler();
957 LLDB_LOG(log,
"timeout = {0}, event_sp)...", timeout);
964 if (listener_sp->GetEventForBroadcasterWithType(
970 LLDB_LOG(log,
"got no event or was interrupted.");
973 LLDB_LOG(log,
"timeout = {0}, event_sp) => {1}", timeout, state);
980 LLDB_LOGF(log,
"Process::%s...", __FUNCTION__);
986 LLDB_LOGF(log,
"Process::%s (event_ptr) => %s", __FUNCTION__,
989 LLDB_LOGF(log,
"Process::%s no events found", __FUNCTION__);
997 LLDB_LOG(log,
"timeout = {0}, event_sp)...", timeout);
1007 LLDB_LOG(log,
"timeout = {0}, event_sp) => {1}", timeout,
1014 bool control_only) {
1016 LLDB_LOG(log,
"timeout = {0}, event_sp)...", timeout);
1049 LLDB_LOG(log,
"(plugin = {0} status = {1} ({1:x8}), description=\"{2}\")",
1056 "(plugin = {0}) ignoring exit status because state was already set "
1068 if (
ModuleSP mod = target_sp->GetExecutableModule())
1069 module_uuid = mod->GetUUID();
1076 info->
exit_desc = {status, exit_string.str()};
1086 if (!exit_string.empty())
1132 bool clear_unused_threads =
true;
1135 std::lock_guard<std::recursive_mutex> guard(
m_thread_list.GetMutex());
1155 size_t num_old_threads = old_thread_list.
GetSize(
false);
1156 for (
size_t i = 0; i < num_old_threads; ++i)
1189 new_thread_list = real_thread_list;
1229 bool internal,
bool condense_trivial,
1230 bool skip_unreported_plans) {
1232 strm, tid, desc_level, internal, condense_trivial, skip_unreported_plans);
1235 bool internal,
bool condense_trivial,
1236 bool skip_unreported_plans) {
1237 m_thread_plans.DumpPlans(strm, desc_level, internal, condense_trivial,
1238 skip_unreported_plans);
1271 auto [iterator, inserted] =
1276 return iterator->second;
1295 if (new_state_is_stopped) {
1306 LLDB_LOGF(log,
"(plugin = %s, state = %s, restarted = %i)",
1317 "(plugin = %s, state = %s) -- unlocking run lock for detach",
1322 if ((old_state_is_stopped != new_state_is_stopped)) {
1323 if (new_state_is_stopped && !restarted) {
1324 LLDB_LOGF(log,
"(plugin = %s, state = %s) -- unlocking run lock",
1337 LLDB_LOGF(log,
"(plugin = %s) -- SetRunning failed, not resuming.",
1340 "resume request failed - process already running");
1343 if (!
error.Success()) {
1352 LLDB_LOGF(log,
"Process::ResumeSynchronous -- locking run lock");
1354 LLDB_LOGF(log,
"Process::Resume: -- SetRunning failed, not resuming.");
1356 "resume request failed: process already running");
1364 if (
error.Success()) {
1368 const bool must_be_alive =
1372 "process not in stopped state after synchronous resume: %s",
1388 if (!hijacking_name.starts_with(
"lldb.internal"))
1417 bool state_changed =
false;
1422 std::lock_guard<std::recursive_mutex> thread_guard(
m_thread_list.GetMutex());
1426 state_changed = old_state != new_state;
1430 if (old_state_is_stopped != new_state_is_stopped) {
1431 if (new_state_is_stopped)
1437 if (state_changed) {
1458 if (!
m_mod_id.IsLastResumeForUserExpression())
1459 m_mod_id.SetStopEventForLastNaturalStopID(event_sp);
1461 LLDB_LOGF(log,
"(plugin = %s, state = %s, stop_id = %u",
1468 LLDB_LOGF(log,
"(plugin = %s, state = %s) state didn't change. Ignoring...",
1474 m_mod_id.SetRunningUserExpression(on);
1478 m_mod_id.SetRunningUtilityFunction(on);
1490 std::vector<LanguageRuntime *> language_runtimes;
1493 return language_runtimes;
1503 language_runtimes.emplace_back(runtime);
1506 return language_runtimes;
1516 LanguageRuntimeCollection::iterator pos;
1523 runtime = runtime_sp.get();
1525 runtime = pos->second.get();
1551 if (runtime->CouldHaveDynamicValue(in_value))
1581 if (
error.Success())
1596 "invalid breakpoint site ID: %" PRIu64, break_id);
1604 bool forbid_delay) {
1612 "eager breakpoint requested, but failed to flush breakpoints: {0}");
1614 auto site_sp = site.shared_from_this();
1619 return llvm::Error::success();
1623 return llvm::Error::success();
1636 llvm_unreachable(
"Unhandled BreakpointAction");
1648 "invalid breakpoint site ID: %" PRIu64, break_id);
1688 llvm_unreachable(
"unhandled process state");
1714 "warning: failed to resolve indirect function at 0x%" PRIx64
1715 " for breakpoint %i.%i: %s\n",
1717 constituent.
GetID(),
1718 error.AsCString() ?
error.AsCString() :
"unknown error");
1724 Address resolved_address(load_addr);
1748 llvm::Error
error = llvm::Error::success();
1749 for (
auto [site, action] : site_to_action) {
1760 bool use_hardware) {
1770 bp_site_sp->AddConstituent(constituent);
1771 constituent->SetBreakpointSite(bp_site_sp);
1772 return bp_site_sp->GetID();
1778 bool bp_from_address =
1779 constituent->GetBreakpoint().GetResolver()->GetResolverTy() ==
1781 bool forbid_delay = use_hardware || bp_from_address;
1785 if (
error.Success()) {
1786 constituent->SetBreakpointSite(bp_site_sp);
1793 "warning: failed to set breakpoint site at 0x%" PRIx64
1794 " for breakpoint %i.%i: %s\n",
1795 load_addr, constituent->GetBreakpoint().GetID(), constituent->GetID(),
1796 error.AsCString() ?
error.AsCString() :
"unknown error");
1804 uint32_t num_constituents =
1805 bp_site_sp->RemoveConstituent(constituent_id, constituent_loc_id);
1806 if (num_constituents == 0) {
1816 uint8_t *buf)
const {
1817 size_t bytes_removed = 0;
1821 bp_sites_in_range)) {
1822 bp_sites_in_range.
ForEach([bp_addr, size,
1826 size_t intersect_size;
1827 size_t opcode_offset;
1829 &intersect_size, &opcode_offset)) {
1830 assert(bp_addr <= intersect_addr && intersect_addr < bp_addr + size);
1831 assert(bp_addr < intersect_addr + intersect_size &&
1832 intersect_addr + intersect_size <= bp_addr + size);
1833 assert(opcode_offset + intersect_size <= bp_site->GetByteSize());
1834 size_t buf_offset = intersect_addr - bp_addr;
1835 ::memcpy(buf + buf_offset,
1842 return bytes_removed;
1848 return platform_sp->GetSoftwareBreakpointTrapOpcode(
GetTarget(), bp_site);
1854 assert(bp_site !=
nullptr);
1858 log,
"Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64,
1859 bp_site->
GetID(), (uint64_t)bp_addr);
1863 "Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64
1864 " -- already enabled",
1865 bp_site->
GetID(), (uint64_t)bp_addr);
1871 "BreakpointSite contains an invalid load address.");
1878 if (bp_opcode_size == 0) {
1880 "Process::GetSoftwareBreakpointTrapOpcode() "
1881 "returned zero, unable to get breakpoint "
1882 "trap for address 0x%" PRIx64,
1887 if (bp_opcode_bytes ==
nullptr) {
1889 "BreakpointSite doesn't contain a valid breakpoint trap opcode.");
1895 error) == bp_opcode_size) {
1899 uint8_t verify_bp_opcode_bytes[64];
1900 if (
DoReadMemory(bp_addr, verify_bp_opcode_bytes, bp_opcode_size,
1901 error) == bp_opcode_size) {
1902 if (::memcmp(bp_opcode_bytes, verify_bp_opcode_bytes,
1903 bp_opcode_size) == 0) {
1907 "Process::EnableSoftwareBreakpoint (site_id = %d) "
1908 "addr = 0x%" PRIx64
" -- SUCCESS",
1909 bp_site->
GetID(), (uint64_t)bp_addr);
1912 "failed to verify the breakpoint trap in memory.");
1915 "Unable to read memory to verify breakpoint trap.");
1918 "Unable to write breakpoint trap to memory.");
1921 "Unable to read memory at breakpoint address.");
1923 if (log &&
error.Fail())
1926 "Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64
1928 bp_site->
GetID(), (uint64_t)bp_addr,
error.AsCString());
1934 assert(bp_site !=
nullptr);
1939 "Process::DisableSoftwareBreakpoint (breakID = %" PRIu64
1940 ") addr = 0x%" PRIx64,
1941 breakID, (uint64_t)bp_addr);
1947 const size_t break_op_size = bp_site->
GetByteSize();
1949 if (break_op_size > 0) {
1951 uint8_t curr_break_op[8];
1952 assert(break_op_size <=
sizeof(curr_break_op));
1953 bool break_op_found =
false;
1958 bool verify =
false;
1960 if (::memcmp(curr_break_op, break_op, break_op_size) == 0) {
1961 break_op_found =
true;
1965 break_op_size,
error) == break_op_size) {
1969 "Memory write failed when restoring original opcode.");
1972 "Original breakpoint trap is no longer in memory.");
1979 uint8_t verify_opcode[8];
1980 assert(break_op_size <
sizeof(verify_opcode));
1986 break_op_size) == 0) {
1990 "Process::DisableSoftwareBreakpoint (site_id = %d) "
1991 "addr = 0x%" PRIx64
" -- SUCCESS",
1992 bp_site->
GetID(), (uint64_t)bp_addr);
1997 "Failed to restore original opcode.");
2002 "breakpoint trap was restored.");
2006 "Unable to read memory that should contain the breakpoint trap.");
2011 "Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64
2012 " -- already disabled",
2013 bp_site->
GetID(), (uint64_t)bp_addr);
2019 "Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64
2021 bp_site->
GetID(), (uint64_t)bp_addr,
error.AsCString());
2031 addr = abi_sp->FixAnyAddress(addr);
2035#if defined(VERIFY_MEMORY_READS)
2047 std::string verify_buf(size,
'\0');
2048 assert(verify_buf.size() == size);
2049 const size_t cache_bytes_read =
2052 const size_t verify_bytes_read =
2054 verify_buf.size(), verify_error);
2055 assert(cache_bytes_read == verify_bytes_read);
2056 assert(memcmp(buf, verify_buf.data(), verify_buf.size()) == 0);
2058 return cache_bytes_read;
2073llvm::SmallVector<llvm::MutableArrayRef<uint8_t>>
2075 llvm::MutableArrayRef<uint8_t> buffer) {
2076 llvm::SmallVector<Range<lldb::addr_t, size_t>> fixed_ranges;
2077 fixed_ranges.reserve(ranges.size());
2079 fixed_ranges.emplace_back(
FixAnyAddress(range.GetRangeBase()),
2080 range.GetByteSize());
2086llvm::SmallVector<llvm::MutableArrayRef<uint8_t>>
2088 llvm::MutableArrayRef<uint8_t> buffer) {
2089 auto total_ranges_len = llvm::sum_of(
2090 llvm::map_range(ranges, [](
auto range) {
return range.size; }));
2094 assert(buffer.size() >= total_ranges_len &&
"provided buffer is too short");
2095 if (buffer.size() < total_ranges_len) {
2096 llvm::MutableArrayRef<uint8_t> empty;
2097 return {ranges.size(), empty};
2100 llvm::SmallVector<llvm::MutableArrayRef<uint8_t>> results;
2104 for (
auto [addr, range_len] : ranges) {
2106 size_t num_bytes_read =
2113 assert(num_bytes_read <= range_len &&
"read more than requested bytes");
2114 if (num_bytes_read > range_len) {
2117 results.emplace_back();
2121 results.push_back(buffer.take_front(num_bytes_read));
2123 buffer = buffer.drop_front(num_bytes_read);
2130 const uint8_t *buf,
size_t size,
2132 size_t max_matches) {
2134 assert(buf !=
nullptr);
2136 assert(alignment > 0);
2137 assert(max_matches > 0);
2140 assert(start_addr < end_addr);
2142 lldb::addr_t start = llvm::alignTo(start_addr, alignment);
2143 while (matches.size() < max_matches && (start + size) < end_addr) {
2148 if (found_addr % alignment) {
2151 start = llvm::alignTo(start + 1, alignment);
2155 matches.emplace_back(found_addr, size);
2156 start = found_addr + alignment;
2162 size_t alignment,
size_t max_matches,
2165 if (buf ==
nullptr) {
2173 if (ranges.empty()) {
2177 if (alignment == 0) {
2181 if (max_matches == 0) {
2186 int resolved_ranges = 0;
2188 for (
size_t i = 0; i < ranges.size(); ++i) {
2189 if (matches.size() >= max_matches)
2202 DoFindInMemory(start_addr, end_addr, buf, size, matches, alignment,
2206 if (resolved_ranges > 0)
2217 if (buf ==
nullptr) {
2229 if (alignment == 0) {
2244 DoFindInMemory(start_addr, end_addr, buf, size, matches, alignment, 1);
2245 if (matches.empty())
2249 return matches[0].GetBaseAddress().GetLoadAddress(&target);
2252llvm::SmallVector<std::optional<std::string>>
2254 llvm::SmallVector<std::optional<std::string>> output_strs(addresses.size(),
2256 llvm::SmallVector<Range<addr_t, size_t>> ranges{
2257 llvm::map_range(addresses, [=](
addr_t ptr) {
2262 uint64_t num_completed_strings = 0;
2264 while (num_completed_strings != addresses.size()) {
2265 llvm::SmallVector<llvm::MutableArrayRef<uint8_t>> read_results =
2271 for (
auto [range, read_result, output_str] :
2272 llvm::zip(ranges, read_results, output_strs)) {
2274 if (range.GetByteSize() == 0)
2278 if (read_result.empty()) {
2279 output_str = std::nullopt;
2280 range.SetByteSize(0);
2281 num_completed_strings++;
2286 auto read_result_str = llvm::toStringRef(read_result);
2288 const char *null_terminator_pos = llvm::find(read_result_str,
'\0');
2289 output_str->append(read_result_str.begin(), null_terminator_pos);
2292 if (null_terminator_pos != read_result_str.end()) {
2293 range.SetByteSize(0);
2294 num_completed_strings++;
2298 range.SetRangeBase(range.GetRangeBase() + read_result.size());
2315 out_str.append(buf, length);
2318 if (length ==
sizeof(buf) - 1)
2319 curr_addr += length;
2323 return out_str.size();
2331 size_t total_cstr_len = 0;
2332 if (dst && dst_max_len) {
2333 result_error.
Clear();
2335 memset(dst, 0, dst_max_len);
2337 const size_t cache_line_size =
m_memory_cache.GetMemoryCacheLineSize();
2338 size_t bytes_left = dst_max_len - 1;
2339 char *curr_dst = dst;
2341 while (bytes_left > 0) {
2342 addr_t cache_line_bytes_left =
2343 cache_line_size - (curr_addr % cache_line_size);
2345 std::min<addr_t>(bytes_left, cache_line_bytes_left);
2347 size_t bytes_read =
ReadMemory(curr_addr, curr_dst, bytes_to_read,
error);
2349 if (bytes_read == 0) {
2350 result_error = std::move(
error);
2351 dst[total_cstr_len] =
'\0';
2354 const size_t len = strlen(curr_dst);
2356 total_cstr_len += len;
2358 if (len < bytes_to_read)
2361 curr_dst += bytes_read;
2362 curr_addr += bytes_read;
2363 bytes_left -= bytes_read;
2369 result_error.
Clear();
2371 return total_cstr_len;
2379 addr = abi_sp->FixAnyAddress(addr);
2381 if (buf ==
nullptr || size == 0)
2384 size_t bytes_read = 0;
2385 uint8_t *bytes = (uint8_t *)buf;
2387 while (bytes_read < size) {
2388 const size_t curr_size = size - bytes_read;
2389 const size_t curr_bytes_read =
2391 bytes_read += curr_bytes_read;
2392 if (curr_bytes_read == curr_size || curr_bytes_read == 0)
2408 if (chunk_size == 0)
2420 uint64_t bytes_remaining = size;
2421 uint64_t bytes_read = 0;
2423 while (bytes_remaining > 0) {
2426 const lldb::addr_t bytes_to_read = std::min(bytes_remaining, chunk_size);
2427 const lldb::addr_t current_addr = vm_addr + bytes_read;
2431 bytes_read += bytes_read_for_chunk;
2434 if (bytes_read_for_chunk > bytes_remaining)
2437 bytes_remaining -= bytes_read_for_chunk;
2439 if (callback(
error, current_addr, buf, bytes_read_for_chunk) ==
2448 size_t integer_byte_size,
2449 uint64_t fail_value,
2458llvm::SmallVector<std::optional<uint64_t>>
2460 unsigned integer_byte_size) {
2461 if (addresses.empty())
2465 if (!llvm::is_contained({1u, 2u, 4u, 8u}, integer_byte_size))
2466 return llvm::SmallVector<std::optional<uint64_t>>(addresses.size(),
2469 llvm::SmallVector<Range<addr_t, size_t>> ranges{
2470 llvm::map_range(addresses, [=](
addr_t ptr) {
2474 std::vector<uint8_t> buffer(integer_byte_size * addresses.size(), 0);
2475 llvm::SmallVector<llvm::MutableArrayRef<uint8_t>> memory =
2478 llvm::SmallVector<std::optional<uint64_t>> result;
2479 result.reserve(addresses.size());
2483 for (llvm::MutableArrayRef<uint8_t> range : memory) {
2484 if (range.size() != integer_byte_size) {
2485 result.push_back(std::nullopt);
2489 DataExtractor data(range.data(), integer_byte_size, byte_order, addr_size);
2491 result.push_back(data.
GetMaxU64(&offset, integer_byte_size));
2492 assert(offset == integer_byte_size);
2498 size_t integer_byte_size,
2516llvm::SmallVector<std::optional<addr_t>>
2526 if (addr_byte_size <= 4)
2527 scalar = (uint32_t)ptr_value;
2536 size_t bytes_written = 0;
2537 const uint8_t *bytes = (
const uint8_t *)buf;
2539 while (bytes_written < size) {
2540 const size_t curr_size = size - bytes_written;
2542 addr + bytes_written, bytes + bytes_written, curr_size,
error);
2543 bytes_written += curr_bytes_written;
2544 if (curr_bytes_written == curr_size || curr_bytes_written == 0)
2547 return bytes_written;
2553 addr = abi_sp->FixAnyAddress(addr);
2557 if (buf ==
nullptr || size == 0)
2572 if (bp_sites_in_range.
IsEmpty())
2575 const uint8_t *ubuf = (
const uint8_t *)buf;
2576 uint64_t bytes_written = 0;
2578 bp_sites_in_range.
ForEach([
this, addr, size, &bytes_written, &ubuf,
2587 size_t intersect_size;
2588 size_t opcode_offset;
2590 addr, size, &intersect_addr, &intersect_size, &opcode_offset);
2593 assert(addr <= intersect_addr && intersect_addr < addr + size);
2594 assert(addr < intersect_addr + intersect_size &&
2595 intersect_addr + intersect_size <= addr + size);
2596 assert(opcode_offset + intersect_size <= bp->GetByteSize());
2599 const addr_t curr_addr = addr + bytes_written;
2600 if (intersect_addr > curr_addr) {
2603 size_t curr_size = intersect_addr - curr_addr;
2604 size_t curr_bytes_written =
2606 bytes_written += curr_bytes_written;
2607 if (curr_bytes_written != curr_size) {
2611 if (
error.Success())
2619 bytes_written += intersect_size;
2623 if (bytes_written < size)
2626 size - bytes_written,
error);
2628 return bytes_written;
2635 if (byte_size > 0) {
2637 const size_t mem_size =
2650 bool is_signed,
Scalar &scalar,
2653 if (byte_size == 0) {
2655 }
else if (byte_size & (byte_size - 1)) {
2657 "byte size %u is not a power of 2", byte_size);
2658 }
else if (byte_size <=
sizeof(uval)) {
2660 if (bytes_read == byte_size) {
2665 scalar = data.
GetMaxU32(&offset, byte_size);
2667 scalar = data.
GetMaxU64(&offset, byte_size);
2676 "byte size of %u is too large for integer scalar type", byte_size);
2683 for (
const auto &
Entry : entries) {
2686 if (!
error.Success())
2696 "cannot allocate memory while process is running");
2706 if (
error.Success()) {
2707 std::string buffer(size, 0);
2719 8, ePermissionsReadable | ePermissionsWritable | ePermissionsExecutable,
2725 "Process::%s pid %" PRIu64
2726 " allocation test passed, CanJIT () is true",
2727 __FUNCTION__,
GetID());
2731 "Process::%s pid %" PRIu64
2732 " allocation test failed, CanJIT () is false: %s",
2755 "deallocation of memory at 0x%" PRIx64
" failed.", (uint64_t)ptr);
2762 return *subclass_override;
2764 bool reported_after =
true;
2767 return reported_after;
2770 if (triple.isMIPS() || triple.isPPC64() || triple.isRISCV() ||
2771 triple.isAArch64() || triple.isArmMClass() || triple.isARM() ||
2772 triple.isLoongArch())
2773 reported_after =
false;
2775 return reported_after;
2778llvm::Expected<ModuleSP>
2782 "Process::ReadModuleFromMemory reading %s binary from memory",
2786 return llvm::createStringError(
"failed to allocate module");
2789 std::unique_ptr<Progress> progress_up;
2794 progress_up = std::make_unique<Progress>(
2797 if (
ObjectFile *_ = module_sp->GetMemoryObjectFile(
2798 shared_from_this(), header_addr,
error, size_to_read))
2801 return error.takeError();
2805 uint32_t &permissions) {
2809 if (!
error.Success())
2867 LaunchPrivate(launch_info, state_after_launch, first_stop_event_sp);
2896 if (launch_info.
GetFlags().
Test(eLaunchFlagStopAtEntry))
2955 std::string local_exec_file_path = exe_spec_to_use.
GetPath();
2957 local_exec_file_path.c_str());
2960 const bool restarted =
false;
2970 const char *error_string =
error.AsCString();
2971 if (error_string ==
nullptr)
2972 error_string =
"launch failed";
3027 "Unexpected process state after the launch: %s, expected %s, "
3037 if (
error.Success()) {
3080 LLDB_LOGF(log,
"Process::Halt() failed to stop, state is: %s",
3083 "Did not get stopped event after loading the core file.");
3124 uint32_t exec_count)
3129 "Process::AttachCompletionHandler::%s process=%p, exec_count=%" PRIu32,
3130 __FUNCTION__,
static_cast<void *
>(process), exec_count);
3139 "Process::AttachCompletionHandler::%s called with state %s (%d)",
3163 "Process::AttachCompletionHandler::%s state %s: reduced "
3164 "remaining exec count to %" PRIu32
", requesting resume",
3171 "Process::AttachCompletionHandler::%s state %s: no more "
3172 "execs expected to start, continuing with attach",
3215 bool wait_for_launch) {
3237 sizeof(process_name))) {
3240 if (wait_for_launch) {
3242 if (
error.Success()) {
3250 if (
error.AsCString() ==
nullptr)
3264 "could not start private state thread.");
3277 platform_sp->FindProcesses(match_info, process_infos);
3278 const uint32_t num_matches = process_infos.size();
3279 if (num_matches == 1) {
3280 attach_pid = process_infos[0].GetProcessID();
3284 process_name,
sizeof(process_name));
3285 if (num_matches > 1) {
3288 for (
size_t i = 0; i < num_matches; i++) {
3289 process_infos[i].DumpAsTableRow(
3290 s, platform_sp->GetUserIDResolver(),
true,
false);
3293 "more than one process named %s:\n%s", process_name,
3297 "could not find a process named %s", process_name);
3301 "invalid platform, can't find processes by name");
3312 if (
error.Success()) {
3317 if (
error.Success()) {
3327 "could not start private state thread.");
3333 const char *error_string =
error.AsCString();
3334 if (error_string ==
nullptr)
3335 error_string =
"attach failed";
3346 LLDB_LOGF(log,
"Process::%s()", __FUNCTION__);
3355 "Process::{0} replacing process architecture with DidAttach() "
3356 "architecture: \"{1}\"",
3357 __FUNCTION__, process_arch.
GetTriple().getTriple());
3365 assert(platform_sp);
3369 if (target_arch.
IsValid() && !platform_sp->IsCompatibleArchitecture(
3370 target_arch, process_host_arch,
3374 target_arch, process_host_arch, &platform_arch);
3379 "switching platform to {0} and architecture to {1} based on "
3381 platform_sp->GetName(), platform_arch.
GetTriple().getTriple());
3383 }
else if (!process_arch.
IsValid()) {
3393 "Process::%s switching architecture to %s based on info "
3394 "the platform retrieved for pid %" PRIu64,
3395 __FUNCTION__, process_arch.
GetTriple().getTriple().c_str(),
3414 "after DynamicLoader::DidAttach(), target "
3415 "executable is {0} (using {1} plugin)",
3416 exe_module_sp ? exe_module_sp->GetFileSpec() :
FileSpec(),
3424 if (system_runtime) {
3429 "after SystemRuntime::DidAttach(), target "
3430 "executable is {0} (using {1} plugin)",
3431 exe_module_sp ? exe_module_sp->GetFileSpec() :
FileSpec(),
3452 if (module_sp && module_sp->IsExecutable()) {
3453 if (
GetTarget().GetExecutableModulePointer() != module_sp.get())
3454 new_executable_module_sp = module_sp;
3458 if (new_executable_module_sp) {
3465 "Process::%s after looping through modules, target executable is %s",
3467 exe_module_sp ? exe_module_sp->GetFileSpec().GetPath().c_str()
3487 if (
error.Success()) {
3530 "Process::PrivateResume() m_stop_id = %u, public state: %s "
3531 "private state: %s",
3540 if (!
GetModID().IsLastResumeForUserExpression())
3545 if (
error.Success()) {
3555 LLDB_LOGF(log,
"Process::PrivateResume WillResume direction=%d",
3560 "Process::PrivateResume PreResumeActions failed, not resuming.");
3563 "Process::PrivateResume PreResumeActions failed, not resuming.");
3568 "Failed to update some delayed breakpoints: {0}");
3570 if (
error.Success()) {
3574 "Process::PrivateResume thinks the process has resumed.");
3576 LLDB_LOGF(log,
"Process::PrivateResume() DoResume failed.");
3586 "Process::PrivateResume() asked to simulate a start & stop.");
3592 LLDB_LOGF(log,
"Process::PrivateResume() got an error \"%s\".",
3593 error.AsCString(
"<unknown error>"));
3628 halt_listener_sp,
nullptr,
3629 use_run_lock, select_most_relevant);
3644 const uint8_t *buf,
size_t size) {
3645 const size_t region_size = high - low;
3647 if (region_size < size)
3651 std::vector<size_t> bad_char_heuristic(256, size);
3652 for (
size_t idx = 0; idx < size - 1; idx++) {
3653 decltype(bad_char_heuristic)::size_type bcu_idx = buf[idx];
3654 bad_char_heuristic[bcu_idx] = size - idx - 1;
3658 llvm::SmallVector<uint8_t, 0> mem;
3663 const size_t max_read_size = std::max<size_t>(size, 0x10000);
3665 for (
addr_t cur_addr = low; cur_addr <= (high - size);) {
3666 if (cur_addr + size > mem_pos + mem.size()) {
3672 mem.resize_for_overwrite(max_read_size);
3675 std::min<addr_t>(mem.size(), high - cur_addr),
3678 if (size > mem.size()) {
3688 int64_t j = size - 1;
3689 while (j >= 0 && buf[j] == mem[cur_addr + j - mem_pos])
3693 cur_addr += bad_char_heuristic[mem[cur_addr + size - 1 - mem_pos]];
3707 LLDB_LOGF(log,
"Process::%s() About to stop.", __FUNCTION__);
3717 &exit_event_sp,
true, listener_sp);
3727 LLDB_LOGF(log,
"Process::%s() Process exited while waiting to stop.",
3731 exit_event_sp.reset();
3734 LLDB_LOGF(log,
"Process::%s() failed to stop, state is: %s", __FUNCTION__,
3742 "Attempt to stop the target in order to detach timed out. "
3758 if (
error.Success()) {
3761 if (!
error.Success()) {
3764 }
else if (exit_event_sp) {
3778 "Failed to update some delayed breakpoints during detach: {0}");
3781 if (
error.Success()) {
3792 if (exit_event_sp) {
3827 bool keep_stopped =
false;
3834 if (
error.Success()) {
3851 "Failed to update some delayed breakpoints during destroy: {0}");
3855 if (
error.Success()) {
3874 if (exit_event_sp) {
3894 if (
error.Success()) {
3896 if (
error.Success())
3903 assert(signals_sp &&
"null signals_sp");
3923 bool return_value =
true;
3941 return_value =
true;
3945 return_value =
false;
3957 return_value =
true;
3963 return_value =
false;
3976 return_value =
true;
3979 return_value =
false;
3998 "Process::ShouldBroadcastEvent (%p) stopped due to an "
3999 "interrupt, state: %s",
4004 return_value =
true;
4007 bool should_resume =
false;
4019 "Process::ShouldBroadcastEvent: should_resume: %i state: "
4020 "%s was_restarted: %i report_stop_vote: %d.",
4024 switch (report_stop_vote) {
4026 return_value =
true;
4030 return_value =
false;
4034 if (!was_restarted) {
4036 "Process::ShouldBroadcastEvent (%p) Restarting process "
4043 return_value =
true;
4066 "Process::ShouldBroadcastEvent (%p) => new state: %s, last "
4067 "broadcast state: %s - %s",
4070 return_value ?
"YES" :
"NO");
4071 return return_value;
4075 llvm::Expected<HostThread> private_state_thread =
4080 if (!private_state_thread) {
4082 "failed to launch host thread: {0}");
4086 assert(private_state_thread->IsJoinable());
4108 std::shared_ptr<PrivateStateThread> *backup_ptr) {
4112 LLDB_LOGF(log,
"Process::%s()%s ", __FUNCTION__,
4113 already_running ?
" already running"
4114 :
" starting private state thread");
4116 if (backup_ptr ==
nullptr && already_running)
4121 char thread_name[1024];
4122 uint32_t max_len = llvm::get_max_thread_name_length();
4123 if (max_len > 0 && max_len <= 30) {
4126 if (already_running)
4127 snprintf(thread_name,
sizeof(thread_name),
"intern-state-OV");
4129 snprintf(thread_name,
sizeof(thread_name),
"intern-state");
4131 if (already_running)
4132 snprintf(thread_name,
sizeof(thread_name),
4133 "<lldb.process.internal-state-override(pid=%" PRIu64
")>",
4136 snprintf(thread_name,
sizeof(thread_name),
4137 "<lldb.process.internal-state(pid=%" PRIu64
")>",
GetID());
4151 if (run_lock_is_running)
4177 "Went to stop the private state thread, but it was already invalid.");
4188 LLDB_LOGF(log,
"Process::%s (signal = %d)", __FUNCTION__, signal);
4197 LLDB_LOGF(log,
"Sending control event of type: %d.", signal);
4198 std::shared_ptr<EventDataReceipt> event_receipt_sp(
new EventDataReceipt());
4203 bool receipt_received =
false;
4205 while (!receipt_received) {
4210 if (!receipt_received) {
4225 "Private state thread already dead, no need to signal it to stop.");
4230 if (thread !=
nullptr)
4252 LLDB_LOGF(log,
"Ran next event action, result was %d.", action_result);
4254 switch (action_result) {
4280 if (should_broadcast) {
4283 "Process::%s (pid = %" PRIu64
4284 ") broadcasting new state %s (old state %s) to %s",
4292 if (!
GetTarget().GetDebugger().IsForwardingEvents() &&
4297 LLDB_LOGF(log,
"Process::%s updated m_iohandler_sync to %d",
4331 if (is_hijacked || !
GetTarget().GetDebugger().IsHandlingEvents())
4340 "Process::%s (pid = %" PRIu64
4341 ") suppressing state %s (old state %s): should_broadcast == false",
4364 std::optional<PolicyStack::Guard> policy_guard;
4368 bool control_only =
true;
4371 LLDB_LOGF(log,
"Process::%s (arg = %p, pid = %" PRIu64
") thread starting...",
4372 __FUNCTION__,
static_cast<void *
>(
this),
GetID());
4374 bool exit_now =
false;
4375 bool interrupt_requested =
false;
4381 "Process::%s (arg = %p, pid = %" PRIu64
4382 ") got a control event: %d",
4383 __FUNCTION__,
static_cast<void *
>(
this),
GetID(),
4384 event_sp->GetType());
4386 switch (event_sp->GetType()) {
4392 control_only =
true;
4396 control_only =
false;
4404 "Process::%s (arg = %p, pid = %" PRIu64
4405 ") woke up with an interrupt while attaching - "
4406 "forwarding interrupt.",
4407 __FUNCTION__,
static_cast<void *
>(
this),
GetID());
4418 "Process::%s (arg = %p, pid = %" PRIu64
4419 ") woke up with an interrupt - Halting.",
4420 __FUNCTION__,
static_cast<void *
>(
this),
GetID());
4422 if (
error.Fail() && log)
4424 "Process::%s (arg = %p, pid = %" PRIu64
4425 ") failed to halt the process: %s",
4426 __FUNCTION__,
static_cast<void *
>(
this),
GetID(),
4433 interrupt_requested =
true;
4442 "Process::%s ignoring interrupt as we have already stopped.",
4458 if (interrupt_requested) {
4468 interrupt_requested =
false;
4471 "Process::%s interrupt_requested, but a non-stopped "
4472 "state '%s' received.",
4483 "Process::%s (arg = %p, pid = %" PRIu64
4484 ") about to exit with internal state %s...",
4485 __FUNCTION__,
static_cast<void *
>(
this),
GetID(),
4493 LLDB_LOGF(log,
"Process::%s (arg = %p, pid = %" PRIu64
") thread exiting...",
4494 __FUNCTION__,
static_cast<void *
>(
this),
GetID());
4514 return "Process::ProcessEventData";
4522 bool &found_valid_stopinfo) {
4523 found_valid_stopinfo =
false;
4529 ThreadList &curr_thread_list = process_sp->GetThreadList();
4530 uint32_t num_threads = curr_thread_list.
GetSize();
4542 std::vector<std::pair<ThreadSP, size_t>> not_suspended_threads;
4543 for (uint32_t idx = 0; idx < num_threads; ++idx) {
4551 not_suspended_threads.emplace_back(thread_sp, thread_sp->GetIndexID());
4559 bool still_should_stop =
false;
4567 for (
auto [thread_sp, thread_index] : not_suspended_threads) {
4568 if (curr_thread_list.
GetSize() != num_threads) {
4572 "Number of threads changed from %u to %u while processing event.",
4573 num_threads, curr_thread_list.
GetSize());
4577 if (thread_sp->GetIndexID() != thread_index) {
4580 "The thread {0} changed from {1} to {2} while processing event.",
4581 thread_sp.get(), thread_index, thread_sp->GetIndexID());
4585 StopInfoSP stop_info_sp = thread_sp->GetStopInfo();
4586 if (stop_info_sp && stop_info_sp->IsValid()) {
4587 found_valid_stopinfo =
true;
4588 bool this_thread_wants_to_stop;
4589 if (stop_info_sp->GetOverrideShouldStop()) {
4590 this_thread_wants_to_stop =
4591 stop_info_sp->GetOverriddenShouldStopValue();
4593 stop_info_sp->PerformAction(event_ptr);
4606 thread_sp->ClearSelectedFrameIndex();
4609 if (stop_info_sp->HasTargetRunSinceMe()) {
4614 this_thread_wants_to_stop = stop_info_sp->ShouldStop(event_ptr);
4617 if (!still_should_stop)
4618 still_should_stop = this_thread_wants_to_stop;
4622 return still_should_stop;
4662 process_sp->SetPublicState(
4669 process_sp->WillPublicStop();
4684 bool does_anybody_have_an_opinion =
false;
4685 bool still_should_stop =
ShouldStop(event_ptr, does_anybody_have_an_opinion);
4691 if (!still_should_stop && does_anybody_have_an_opinion) {
4696 process_sp->PrivateResume();
4699 !process_sp->StateChangedIsHijackedForSynchronousResume();
4707 if (process_sp->GetTarget().RunStopHooks())
4717 s->
Printf(
" process = %p (pid = %" PRIu64
"), ",
4718 static_cast<void *
>(process_sp.get()), process_sp->GetID());
4747 if (data ==
nullptr)
4755 if (data ==
nullptr)
4765 if (data !=
nullptr)
4773 if (data !=
nullptr)
4784 if (data !=
nullptr)
4791 const char *reason) {
4794 if (data !=
nullptr)
4799 const Event *event_ptr) {
4801 if (data ==
nullptr)
4811 if (data !=
nullptr)
4854 auto event_data_sp =
4855 std::make_shared<ProcessEventData>(shared_from_this(),
GetState());
4856 return std::make_shared<Event>(event_type, event_data_sp);
4882 auto data_sp = std::make_shared<EventDataStructuredData>(
4883 shared_from_this(), object_sp, plugin_sp);
4891 return find_it->second;
4902 size_t bytes_available = one_profile_data.size();
4903 if (bytes_available > 0) {
4905 LLDB_LOGF(log,
"Process::GetProfileData (buf = %p, size = %" PRIu64
")",
4906 static_cast<void *
>(buf),
static_cast<uint64_t
>(buf_size));
4907 if (bytes_available > buf_size) {
4908 memcpy(buf, one_profile_data.c_str(), buf_size);
4909 one_profile_data.erase(0, buf_size);
4910 bytes_available = buf_size;
4912 memcpy(buf, one_profile_data.c_str(), bytes_available);
4916 return bytes_available;
4924 if (bytes_available > 0) {
4926 LLDB_LOGF(log,
"Process::GetSTDOUT (buf = %p, size = %" PRIu64
")",
4927 static_cast<void *
>(buf),
static_cast<uint64_t
>(buf_size));
4928 if (bytes_available > buf_size) {
4931 bytes_available = buf_size;
4937 return bytes_available;
4943 if (bytes_available > 0) {
4945 LLDB_LOGF(log,
"Process::GetSTDERR (buf = %p, size = %" PRIu64
")",
4946 static_cast<void *
>(buf),
static_cast<uint64_t
>(buf_size));
4947 if (bytes_available > buf_size) {
4950 bytes_available = buf_size;
4956 return bytes_available;
4962 process->
AppendSTDOUT(
static_cast<const char *
>(src), src_len);
4968 std::make_unique<ConnectionFileDescriptor>(fd,
true));
4979 std::make_shared<IOHandlerProcessSTDIO>(
this, fd);
4995 if (io_handler_sp) {
4997 LLDB_LOGF(log,
"Process::%s pushing IO handler", __FUNCTION__);
4999 io_handler_sp->SetIsDone(
false);
5004 bool cancel_top_handler = !
m_mod_id.IsRunningUtilityFunction();
5006 cancel_top_handler);
5032class RestorePlanState {
5035 : m_thread_plan_sp(thread_plan_sp) {
5036 if (m_thread_plan_sp) {
5037 m_private = m_thread_plan_sp->GetPrivate();
5038 m_is_controlling = m_thread_plan_sp->IsControllingPlan();
5039 m_okay_to_discard = m_thread_plan_sp->OkayToDiscard();
5043 ~RestorePlanState() { Clean(); }
5046 if (!m_already_reset && m_thread_plan_sp) {
5047 m_already_reset =
true;
5048 m_thread_plan_sp->SetPrivate(m_private);
5049 m_thread_plan_sp->SetIsControllingPlan(m_is_controlling);
5050 m_thread_plan_sp->SetOkayToDiscard(m_okay_to_discard);
5056 bool m_already_reset =
false;
5057 bool m_private =
false;
5058 bool m_is_controlling =
false;
5059 bool m_okay_to_discard =
false;
5065 const milliseconds default_one_thread_timeout(250);
5070 : default_one_thread_timeout;
5079 return std::min<microseconds>(default_one_thread_timeout,
5083static Timeout<std::micro>
5085 bool before_first_timeout) {
5091 if (before_first_timeout)
5095 return std::nullopt;
5100static std::optional<ExpressionResults>
5102 RestorePlanState &restorer,
const EventSP &event_sp,
5103 EventSP &event_to_broadcast_sp,
5105 bool handle_interrupts) {
5108 ThreadSP thread_sp = thread_plan_sp->GetTarget()
5111 .FindThreadByID(thread_id);
5114 "The thread on which we were running the "
5115 "expression: tid = {0}, exited while "
5116 "the expression was running.",
5122 if (plan == thread_plan_sp && plan->PlanSucceeded()) {
5123 LLDB_LOG(log,
"execution completed successfully");
5131 StopInfoSP stop_info_sp = thread_sp->GetStopInfo();
5133 stop_info_sp->ShouldNotify(event_sp.get())) {
5134 LLDB_LOG(log,
"stopped for breakpoint: {0}.", stop_info_sp->GetDescription());
5141 thread_plan_sp->SetPrivate(
false);
5142 event_to_broadcast_sp = event_sp;
5147 if (!handle_interrupts &&
5149 return std::nullopt;
5151 LLDB_LOG(log,
"thread plan did not successfully complete");
5153 event_to_broadcast_sp = event_sp;
5166 if (!thread_plan_sp) {
5172 if (!thread_plan_sp->ValidatePlan(
nullptr)) {
5175 "RunThreadPlan called with an invalid thread plan.");
5181 "RunThreadPlan called on wrong process.");
5186 if (thread ==
nullptr) {
5188 "RunThreadPlan called with invalid thread.");
5199 RestorePlanState thread_plan_restorer(thread_plan_sp);
5206 thread_plan_sp->SetPrivate(
false);
5212 thread_plan_sp->SetIsControllingPlan(
true);
5213 thread_plan_sp->SetOkayToDiscard(
false);
5223 "RunThreadPlan called while the private state was not stopped.");
5228 const uint32_t thread_idx_id = thread->GetIndexID();
5231 if (!selected_frame_sp) {
5232 thread->SetSelectedFrame(
nullptr);
5234 if (!selected_frame_sp) {
5235 diagnostic_manager.
Printf(
5237 "RunThreadPlan called without a selected frame on thread %d",
5248 "RunThreadPlan called with one thread "
5249 "timeout greater than total timeout");
5259 : selected_frame_sp->GetStackID();
5267 uint32_t selected_tid;
5269 if (selected_thread_sp) {
5270 selected_tid = selected_thread_sp->GetIndexID();
5278 std::shared_ptr<PrivateStateThread> backup_private_state_thread;
5289 LLDB_LOGF(log,
"Running thread plan on private state thread, spinning up "
5290 "another state thread to handle the events.");
5300 thread->QueueThreadPlan(stopper_base_plan_sp,
false);
5308 &backup_private_state_thread);
5313 diagnostic_manager.
Printf(
5315 "could not spin up a thread to handle events for an expression"
5316 " run on the private state thread.");
5322 thread->QueueThreadPlan(
5323 thread_plan_sp,
false);
5356 "Process::RunThreadPlan(): Resuming thread %u - 0x%4.4" PRIx64
5357 " to run thread plan \"%s\".",
5358 thread_idx_id, expr_thread_id, s.
GetData());
5365 bool before_first_timeout =
true;
5367 bool do_resume =
true;
5368 bool handle_running_event =
true;
5371 uint32_t num_resumes = 0;
5377 before_first_timeout =
false;
5379 LLDB_LOGF(log,
"Stop others: %u, try all: %u, before_first: %u.\n",
5381 before_first_timeout);
5388 Event *other_events = listener_sp->PeekAtNextEvent();
5389 if (other_events !=
nullptr) {
5392 "RunThreadPlan called with pending events on the queue.");
5405#ifdef LLDB_RUN_THREAD_HALT_WITH_EVENT
5413 bool miss_first_event =
true;
5415 bool pending_stop_on_vfork_done =
false;
5419 std::optional<PolicyStack::Guard> policy_guard;
5420 if (backup_private_state_thread)
5429 "Top of while loop: do_resume: %i handle_running_event: %i "
5430 "before_first_timeout: %i.",
5431 do_resume, handle_running_event, before_first_timeout);
5433 if (do_resume || handle_running_event) {
5440 if (!resume_error.
Success()) {
5441 diagnostic_manager.
Printf(
5443 "couldn't resume inferior the %d time: \"%s\".", num_resumes,
5454 "Process::RunThreadPlan(): didn't get any event after "
5455 "resume %" PRIu32
", exiting.",
5459 "didn't get any event after resume %" PRIu32
5470 bool restarted =
false;
5477 "Process::RunThreadPlan(): didn't get running event after "
5478 "resume %d, got %s instead (restarted: %i, do_resume: %i, "
5479 "handle_running_event: %i).",
5481 handle_running_event);
5488 const bool clear_thread_plans =
false;
5489 const bool use_run_lock =
false;
5490 Halt(clear_thread_plans, use_run_lock);
5493 diagnostic_manager.
Printf(
5495 "didn't get running event after initial resume, got %s instead.",
5502 log->
PutCString(
"Process::RunThreadPlan(): resuming succeeded.");
5510 log->
PutCString(
"Process::RunThreadPlan(): waiting for next event.");
5514 handle_running_event =
true;
5523 auto now = system_clock::now();
5525 "Process::RunThreadPlan(): about to wait - now is %s - "
5527 llvm::to_string(now).c_str(),
5528 llvm::to_string(now + *timeout).c_str());
5530 LLDB_LOGF(log,
"Process::RunThreadPlan(): about to wait forever.");
5534#ifdef LLDB_RUN_THREAD_HALT_WITH_EVENT
5536 if (miss_first_event) {
5537 std::this_thread::sleep_for(std::chrono::milliseconds(1));
5538 miss_first_event =
false;
5542 got_event = listener_sp->GetEvent(event_sp, timeout);
5546 bool keep_going =
false;
5548 const bool clear_thread_plans =
false;
5549 const bool use_run_lock =
false;
5550 Halt(clear_thread_plans, use_run_lock);
5553 "execution halted by user interrupt.");
5554 LLDB_LOGF(log,
"Process::RunThreadPlan(): Got interrupted by "
5555 "eBroadcastBitInterrupted, exiting.");
5561 "Process::RunThreadPlan(): in while loop, got event: %s.",
5564 switch (stop_state) {
5570 LLDB_LOGF(log,
"Process::RunThreadPlan(): Got a stop and "
5571 "restart, so we'll continue waiting.");
5574 handle_running_event =
true;
5579 bool handled_fork =
false;
5582 if (
StopInfoSP stop_info_sp = fork_thread_sp->GetStopInfo()) {
5583 StopReason reason = stop_info_sp->GetStopReason();
5587 handled_fork =
true;
5592 LLDB_LOGF(log,
"Process::RunThreadPlan(): stopped for "
5593 "fork, stop-on-fork is set.");
5604 "Process::RunThreadPlan(): got vfork with "
5605 "stop-on-fork, deferring stop to "
5607 pending_stop_on_vfork_done =
true;
5610 handle_running_event =
true;
5612 pending_stop_on_vfork_done) {
5617 LLDB_LOGF(log,
"Process::RunThreadPlan(): vfork cycle "
5618 "complete, stop-on-fork is set.");
5619 pending_stop_on_vfork_done =
false;
5622 LLDB_LOGF(log,
"Process::RunThreadPlan(): got fork "
5623 "event, continuing.");
5626 handle_running_event =
true;
5632 if (!handled_fork) {
5633 const bool handle_interrupts =
true;
5635 expr_thread_id, thread_plan_sp, thread_plan_restorer,
5636 event_sp, event_to_broadcast_sp, options,
5650 handle_running_event =
false;
5655 "Process::RunThreadPlan(): execution stopped with "
5656 "unexpected state: %s.",
5660 event_to_broadcast_sp = event_sp;
5664 "execution stopped with unexpected state.");
5676 log->
PutCString(
"Process::RunThreadPlan(): got_event was true, but "
5677 "the event pointer was null. How odd...");
5689 if (before_first_timeout) {
5691 "Running function with one thread timeout timed out.");
5693 LLDB_LOG(log,
"Restarting function with all threads enabled and "
5694 "timeout: {0} timed out, abandoning execution.",
5697 LLDB_LOG(log,
"Running function with timeout: {0} timed out, "
5698 "abandoning execution.",
5711 bool back_to_top =
true;
5712 uint32_t try_halt_again = 0;
5713 bool do_halt =
true;
5714 const uint32_t num_retries = 5;
5715 while (try_halt_again < num_retries) {
5718 LLDB_LOGF(log,
"Process::RunThreadPlan(): Running Halt.");
5719 const bool clear_thread_plans =
false;
5720 const bool use_run_lock =
false;
5721 Halt(clear_thread_plans, use_run_lock);
5725 log->
PutCString(
"Process::RunThreadPlan(): Halt succeeded.");
5735 "Process::RunThreadPlan(): Stopped with event: %s",
5740 log->
PutCString(
" Event was the Halt interruption event.");
5747 log->
PutCString(
"Process::RunThreadPlan(): Went to halt "
5748 "but got a restarted event, there must be "
5749 "an un-restarted stopped event so try "
5751 "Exiting wait loop.");
5760 const bool handle_interrupts =
false;
5762 expr_thread_id, thread_plan_sp, thread_plan_restorer,
5763 event_sp, event_to_broadcast_sp, options,
5764 handle_interrupts)) {
5765 return_value = *result;
5766 back_to_top =
false;
5772 log->
PutCString(
"Process::RunThreadPlan(): try_all_threads "
5773 "was false, we stopped so now we're "
5776 back_to_top =
false;
5780 if (before_first_timeout) {
5783 before_first_timeout =
false;
5784 thread_plan_sp->SetStopOthers(
false);
5787 "Process::RunThreadPlan(): about to resume.");
5794 log->
PutCString(
"Process::RunThreadPlan(): running all "
5795 "threads timed out.");
5797 back_to_top =
false;
5803 log->
PutCString(
"Process::RunThreadPlan(): halt said it "
5804 "succeeded, but I got no event. "
5805 "I'm getting out of here passing Interrupted.");
5807 back_to_top =
false;
5816 if (!back_to_top || try_halt_again > num_retries)
5823 policy_guard.reset();
5827 if (backup_private_state_thread &&
5828 backup_private_state_thread->IsJoinable()) {
5832 if (stopper_base_plan_sp) {
5833 thread->DiscardThreadPlansUpToPlan(stopper_base_plan_sp);
5843 return return_value;
5849 s.
PutCString(
"Thread state after unsuccessful completion: \n");
5864 thread_plan_sp->RestoreThreadState();
5875 log->
PutCString(
"Process::RunThreadPlan(): Stop event that "
5876 "interrupted us is NULL.");
5881 const char *event_explanation =
nullptr;
5885 event_explanation =
"<no event>";
5888 event_explanation =
"<user interrupt>";
5896 event_explanation =
"<no event data>";
5903 event_explanation =
"<no process>";
5909 uint32_t num_threads = thread_list.
GetSize();
5910 uint32_t thread_index;
5912 ts.
Printf(
"<%u threads> ", num_threads);
5914 for (thread_index = 0; thread_index < num_threads; ++thread_index) {
5922 ts.
Printf(
"<0x%4.4" PRIx64
" ", thread->GetID());
5924 thread->GetRegisterContext().get();
5926 if (register_context)
5927 ts.
Printf(
"[ip 0x%" PRIx64
"] ", register_context->
GetPC());
5929 ts.
Printf(
"[ip unknown] ");
5935 const char *stop_desc = stop_info_sp->GetDescription();
5942 event_explanation = ts.
GetData();
5946 if (event_explanation)
5948 "Process::RunThreadPlan(): execution interrupted: %s %s",
5949 s.
GetData(), event_explanation);
5951 LLDB_LOGF(log,
"Process::RunThreadPlan(): execution interrupted: %s",
5955 if (should_unwind) {
5957 "Process::RunThreadPlan: ExecutionInterrupted - "
5958 "discarding thread plans up to %p.",
5959 static_cast<void *
>(thread_plan_sp.get()));
5960 thread->DiscardThreadPlansUpToPlan(thread_plan_sp);
5963 "Process::RunThreadPlan: ExecutionInterrupted - for "
5964 "plan: %p not discarding.",
5965 static_cast<void *
>(thread_plan_sp.get()));
5969 log->
PutCString(
"Process::RunThreadPlan(): execution set up error.");
5972 thread->DiscardThreadPlansUpToPlan(thread_plan_sp);
5975 if (thread->IsThreadPlanDone(thread_plan_sp.get())) {
5977 log->
PutCString(
"Process::RunThreadPlan(): thread plan is done");
5979 }
else if (thread->WasThreadPlanDiscarded(thread_plan_sp.get())) {
5982 "Process::RunThreadPlan(): thread plan was discarded");
5987 "Process::RunThreadPlan(): thread plan stopped in mid course");
5990 log->
PutCString(
"Process::RunThreadPlan(): discarding thread plan "
5991 "'cause unwind_on_error is set.");
5992 thread->DiscardThreadPlansUpToPlan(thread_plan_sp);
6002 exe_ctx.
SetFrameSP(thread->GetFrameWithStackID(ctx_frame_id));
6009 if (
GetThreadList().SetSelectedThreadByIndexID(selected_tid) &&
6010 selected_stack_id.
IsValid()) {
6012 std::lock_guard<std::recursive_mutex> guard(
GetThreadList().GetMutex());
6018 old_frame_sp.get());
6025 if (event_to_broadcast_sp) {
6027 log->
PutCString(
"Process::RunThreadPlan(): rebroadcasting event.");
6031 return return_value;
6040 strm.
Printf(
"Process %" PRIu64
" exited with status = %i (0x%8.8x) %s\n",
6041 GetID(), exit_status, exit_status,
6042 exit_description ? exit_description :
"");
6045 strm.
Printf(
"Connected to remote target.\n");
6049 core_args->Format(strm);
6053 strm.
Printf(
"Process %" PRIu64
" is running.\n",
GetID());
6058 bool only_threads_with_stop_reason,
6059 uint32_t start_frame, uint32_t num_frames,
6060 uint32_t num_frames_with_source,
6062 size_t num_thread_infos_dumped = 0;
6069 uint32_t num_threads;
6070 std::vector<lldb::tid_t> thread_id_array;
6073 std::lock_guard<std::recursive_mutex> guard(
GetThreadList().GetMutex());
6075 num_threads = curr_thread_list.
GetSize();
6077 thread_id_array.resize(num_threads);
6078 for (idx = 0; idx < num_threads; ++idx)
6082 for (uint32_t i = 0; i < num_threads; i++) {
6085 if (only_threads_with_stop_reason) {
6086 StopInfoSP stop_info_sp = thread_sp->GetStopInfo();
6087 if (!stop_info_sp || !stop_info_sp->ShouldShow())
6090 thread_sp->GetStatus(strm, start_frame, num_frames,
6091 num_frames_with_source, stop_format,
6093 ++num_thread_infos_dumped;
6096 LLDB_LOGF(log,
"Process::GetThreadStatus - thread 0x" PRIu64
6097 " vanished while running Thread::GetStatus.");
6100 return num_thread_infos_dumped;
6124 result = this_result;
6206 "Setting Process code address mask to {0:x}", code_address_mask);
6212 "Setting Process data address mask to {0:x}", data_address_mask);
6218 "Setting Process highmem code address mask to {0:x}",
6225 "Setting Process highmem data address mask to {0:x}",
6232 addr = abi_sp->FixCodeAddress(addr);
6238 addr = abi_sp->FixDataAddress(addr);
6244 addr = abi_sp->FixAnyAddress(addr);
6250 LLDB_LOGF(log,
"Process::%s()", __FUNCTION__);
6285 if (address ==
nullptr) {
6293 std::map<addr_t, addr_t>::const_iterator iter =
6296 function_addr = (*iter).second;
6301 "Unable to call resolver for indirect function %s",
6306 function_addr = abi_sp->FixCodeAddress(function_addr);
6308 std::pair<addr_t, addr_t>(addr, function_addr));
6311 return function_addr;
6327 runtime.second->ModulesDidLoad(module_list);
6333 runtime->ModulesDidLoad(module_list);
6344 pair.second->ModulesDidLoad(*
this, module_list);
6368 if (plugins[language])
6370 sc.
module_sp->ReportWarningUnsupportedLanguage(
6381 return platform_sp->GetProcessInfo(
GetID(), info);
6394 if (!memory_history) {
6398 threads = std::make_shared<ThreadCollection>(
6399 memory_history->GetHistoryThreads(addr));
6406 InstrumentationRuntimeCollection::iterator pos;
6411 return (*pos).second;
6416 module_spec.
Clear();
6443 Address retval = default_stop_addr;
6447 if (!default_stop_addr.
IsValid())
6450 const char *plugin_name =
nullptr;
6451 const char *flavor =
nullptr;
6452 const char *cpu =
nullptr;
6453 const char *features =
nullptr;
6457 if (disassembler_sp)
6458 insn_list = &disassembler_sp->GetInstructionList();
6460 if (insn_list ==
nullptr) {
6464 size_t insn_offset =
6471 insn_offset,
false ,
nullptr);
6476 if (branch_index > insn_offset) {
6477 Address next_branch_insn_address =
6479 if (next_branch_insn_address.
IsValid() &&
6481 retval = next_branch_insn_address;
6491 load_addr = abi->FixAnyAddress(load_addr);
6506 region_list.clear();
6512 region_list.clear();
6523 region_list.push_back(std::move(region_info));
6531 !(abi && (abi->FixAnyAddress(range_end) != range_end)));
6550 if (supported_type_names.
GetSize() == 0) {
6551 LLDB_LOG(log,
"no structured data types supported");
6556 std::set<llvm::StringRef> type_names;
6559 "the process supports the following async structured data types:");
6568 const llvm::StringRef type_name =
object->GetStringValue();
6569 if (type_name.empty())
6572 type_names.insert(type_name);
6583 if (type_names.empty())
6595 std::vector<llvm::StringRef> names_to_remove;
6596 for (llvm::StringRef type_name : type_names) {
6597 if (plugin_sp->SupportsStructuredDataType(type_name)) {
6599 std::make_pair(type_name, plugin_sp));
6600 names_to_remove.push_back(type_name);
6601 LLDB_LOG(log,
"using plugin {0} for type name {1}",
6602 plugin_sp->GetPluginName(), type_name);
6607 for (llvm::StringRef type_name : names_to_remove)
6608 type_names.erase(type_name);
6625 llvm::StringRef type_name;
6637 find_it->second->HandleArrivalOfStructuredData(*
this, type_name, object_sp);
6649 llvm::function_ref<std::unique_ptr<UtilityFunction>()> factory) {
6650 if (platform !=
GetTarget().GetPlatform().get())
6659 return llvm::createStringError(llvm::inconvertibleErrorCode(),
6660 "Can't trace a non-live process.");
6661 return llvm::make_error<UnimplementedError>();
6666 bool trap_exceptions) {
6668 if (thread ==
nullptr || address ==
nullptr)
6680 auto type_system_or_err =
6682 if (!type_system_or_err) {
6683 llvm::consumeError(type_system_or_err.takeError());
6686 auto ts = *type_system_or_err;
6692 *thread, *address, void_ptr_type, llvm::ArrayRef<addr_t>(), options));
6696 StackFrame *frame = thread->GetStackFrameAtIndex(0).get();
6704 call_plan_sp->GetReturnValueObject()->GetValueAsUnsigned(
6726 if (!arch || !tag_manager) {
6727 return llvm::createStringError(
6728 llvm::inconvertibleErrorCode(),
6729 "This architecture does not support memory tagging");
6733 return llvm::createStringError(llvm::inconvertibleErrorCode(),
6734 "Process does not support memory tagging");
6740llvm::Expected<std::vector<lldb::addr_t>>
6742 llvm::Expected<const MemoryTagManager *> tag_manager_or_err =
6744 if (!tag_manager_or_err)
6745 return tag_manager_or_err.takeError();
6748 llvm::Expected<std::vector<uint8_t>> tag_data =
6751 return tag_data.takeError();
6758 const std::vector<lldb::addr_t> &tags) {
6759 llvm::Expected<const MemoryTagManager *> tag_manager_or_err =
6761 if (!tag_manager_or_err)
6765 llvm::Expected<std::vector<uint8_t>> packed_tags =
6789 if (!dirty_page_list)
6795 llvm::AddressRange range(0, 0);
6796 for (
addr_t page_addr : *dirty_page_list) {
6797 if (range.empty()) {
6799 range = llvm::AddressRange(page_addr, page_addr + page_size);
6801 if (range.end() == page_addr) {
6803 range = llvm::AddressRange(range.start(), page_addr + page_size);
6807 ranges.
Append(range.start(), range.size(), {range, lldb_permissions});
6808 range = llvm::AddressRange(page_addr, page_addr + page_size);
6814 ranges.
Append(range.start(), range.size(), {range, lldb_permissions});
6844 std::set<addr_t> &stack_ends) {
6849 std::vector<lldb_private::MemoryRegionInfo> dynamic_loader_mem_regions;
6855 save_thread_predicate);
6856 for (
const auto ®ion : dynamic_loader_mem_regions) {
6859 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0)
6868 std::set<addr_t> &stack_ends) {
6869 const bool try_dirty_pages =
true;
6878 StackFrameSP frame_sp = thread_sp->GetStackFrameAtIndex(0);
6884 const addr_t sp = reg_ctx_sp->GetSP();
6885 const size_t red_zone = process.
GetABI()->GetRedZoneSize();
6888 const size_t stack_head = (
sp - red_zone);
6896 stack_ends.insert(range_end);
6900 AddRegion(sp_region, try_dirty_pages, ranges);
6911 std::set<addr_t> &stack_ends) {
6914 const bool try_dirty_pages =
false;
6915 for (
const auto ®ion : regions)
6916 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0)
6917 AddRegion(region, try_dirty_pages, ranges);
6927 std::set<addr_t> &stack_ends) {
6930 bool have_dirty_page_info =
false;
6931 for (
const auto ®ion : regions) {
6932 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0 &&
6934 have_dirty_page_info =
true;
6937 if (!have_dirty_page_info) {
6940 const bool try_dirty_pages =
false;
6941 for (
const auto ®ion : regions)
6942 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0 &&
6944 AddRegion(region, try_dirty_pages, ranges);
6959 std::set<addr_t> &stack_ends) {
6960 const bool try_dirty_pages =
true;
6964 for (
const auto ®ion : regions) {
6966 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0 &&
6968 AddRegion(region, try_dirty_pages, ranges);
6974static lldb_private::MemoryRegionInfo
6990 if (option_ranges.IsEmpty())
6993 for (
const auto &range : regions) {
6994 auto *entry = option_ranges.FindEntryThatIntersects(range.GetRange());
6996 if (*entry != range.GetRange()) {
7013 if (regions.empty())
7015 "failed to get any valid memory regions from the process");
7018 "callers must set the core_style to something other than "
7019 "eSaveCoreUnspecified");
7023 std::set<addr_t> stack_ends;
7035 switch (core_style) {
7058 "no valid address ranges found for core style");
7063std::vector<ThreadSP>
7065 std::vector<ThreadSP> thread_list;
7068 thread_list.push_back(thread_sp);
7079 if (low_memory_addr_bits == 0 && high_memory_addr_bits == 0)
7082 if (low_memory_addr_bits != 0) {
7089 if (high_memory_addr_bits != 0) {
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
#define LLDB_LOGF(log,...)
#define LLDB_LOG_ERROR(log, error,...)
static void GetCoreFileSaveRangesFull(Process &process, const MemoryRegionInfos ®ions, CoreFileMemoryRanges &ranges, std::set< addr_t > &stack_ends)
static std::optional< ExpressionResults > HandleStoppedEvent(lldb::tid_t thread_id, const ThreadPlanSP &thread_plan_sp, RestorePlanState &restorer, const EventSP &event_sp, EventSP &event_to_broadcast_sp, const EvaluateExpressionOptions &options, bool handle_interrupts)
static void SaveDynamicLoaderSections(Process &process, const SaveCoreOptions &options, CoreFileMemoryRanges &ranges, std::set< addr_t > &stack_ends)
static CoreFileMemoryRange CreateCoreFileMemoryRange(const lldb_private::MemoryRegionInfo ®ion)
static constexpr unsigned g_string_read_width
static bool AddDirtyPages(const lldb_private::MemoryRegionInfo ®ion, CoreFileMemoryRanges &ranges)
static constexpr OptionEnumValueElement g_follow_fork_mode_values[]
static void GetUserSpecifiedCoreFileSaveRanges(Process &process, const MemoryRegionInfos ®ions, const SaveCoreOptions &options, CoreFileMemoryRanges &ranges)
static void GetCoreFileSaveRangesDirtyOnly(Process &process, const MemoryRegionInfos ®ions, CoreFileMemoryRanges &ranges, std::set< addr_t > &stack_ends)
static bool ShouldShowError(Process &process)
static void AddRegion(const lldb_private::MemoryRegionInfo ®ion, bool try_dirty_pages, CoreFileMemoryRanges &ranges)
static Timeout< std::micro > GetExpressionTimeout(const EvaluateExpressionOptions &options, bool before_first_timeout)
static microseconds GetOneThreadExpressionTimeout(const EvaluateExpressionOptions &options)
static addr_t ComputeConstituentLoadAddress(BreakpointLocation &constituent, Process &proc)
static lldb_private::MemoryRegionInfo Intersect(const lldb_private::MemoryRegionInfo &lhs, const lldb_private::MemoryRegionInfo::RangeType &rhs)
static void SaveOffRegionsWithStackPointers(Process &process, const SaveCoreOptions &core_options, const MemoryRegionInfos ®ions, CoreFileMemoryRanges &ranges, std::set< addr_t > &stack_ends)
static void GetCoreFileSaveRangesStackOnly(Process &process, const MemoryRegionInfos ®ions, CoreFileMemoryRanges &ranges, std::set< addr_t > &stack_ends)
#define LLDB_SCOPED_TIMER()
ProcessExperimentalOptionValueProperties()
const Property * GetPropertyAtIndex(size_t idx, const ExecutionContext *exe_ctx) const override
ProcessOptionValueProperties(llvm::StringRef name)
static lldb::ABISP FindPlugin(lldb::ProcessSP process_sp, const ArchSpec &arch)
A section + offset based address range class.
Address & GetBaseAddress()
Get accessor for the base address of the range.
bool ContainsFileAddress(const Address &so_addr) const
Check if a section offset address is contained in this range.
lldb::addr_t GetByteSize() const
Get accessor for the byte size of this range.
A section + offset based address class.
lldb::addr_t GetLoadAddress(Target *target) const
Get the load address.
lldb::addr_t GetOpcodeLoadAddress(Target *target, AddressClass addr_class=AddressClass::eInvalid) const
Get the load address as an opcode load address.
bool IsValid() const
Check if the object state is valid.
Symbol * CalculateSymbolContextSymbol() const
A class which holds the metadata from a remote stub/corefile note about how many bits are used for ad...
uint32_t GetHighmemAddressableBits() const
static lldb::addr_t AddressableBitToMask(uint32_t addressable_bits)
uint32_t GetLowmemAddressableBits() const
An architecture specification class.
uint32_t GetAddressByteSize() const
Returns the size in bytes of an address of the current architecture.
bool IsValid() const
Tests if this ArchSpec is valid.
llvm::Triple & GetTriple()
Architecture triple accessor.
bool IsCompatibleMatch(const ArchSpec &rhs) const
Shorthand for IsMatch(rhs, CompatibleMatch).
bool IsExactMatch(const ArchSpec &rhs) const
Shorthand for IsMatch(rhs, ExactMatch).
lldb::ByteOrder GetByteOrder() const
Returns the byte order for the architecture specification.
virtual const MemoryTagManager * GetMemoryTagManager() const
A command line argument class.
General Outline: A breakpoint location is defined by the breakpoint that produces it,...
void SetIsIndirect(bool is_indirect)
bool ShouldResolveIndirectFunctions()
Returns whether we should resolve Indirect functions in setting the breakpoint site for this location...
lldb::break_id_t GetID() const
Returns the breakpoint location ID.
Address & GetAddress()
Gets the Address for this breakpoint location.
Breakpoint & GetBreakpoint()
Gets the Breakpoint that created this breakpoint location.
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 m_enabled
Boolean indicating if this breakpoint site enabled or not.
Broadcaster(lldb::BroadcasterManagerSP manager_sp, std::string name)
Construct with a broadcaster with a name.
lldb::ListenerSP GetPrimaryListener()
void RestoreBroadcaster()
Restore the state of the Broadcaster from a previous hijack attempt.
void SetEventName(uint32_t event_mask, const char *name)
Set the name for an event bit.
bool HijackBroadcaster(const lldb::ListenerSP &listener_sp, uint32_t event_mask=UINT32_MAX)
Provides a simple mechanism to temporarily redirect events from broadcaster.
void BroadcastEventIfUnique(lldb::EventSP &event_sp)
void SetPrimaryListener(lldb::ListenerSP listener_sp)
const char * GetHijackingListenerName()
void BroadcastEvent(lldb::EventSP &event_sp)
Broadcast an event which has no associated data.
bool IsHijackedForEvent(uint32_t event_mask)
void CheckInWithManager()
A class that implements CRTP-based "virtual constructor" idiom.
Generic representation of a type in a programming language.
CompilerType GetBasicTypeFromAST(lldb::BasicType basic_type) const
Create related types using the current type's AST.
CompilerType GetPointerType() const
Return a new CompilerType that is a pointer to this type.
std::string GetString() const
Get the string value as a std::string.
const char * AsCString(const char *value_if_empty) const
Get the string value as a C string.
Status FinalizeCoreFileSaveRanges()
Finalize and merge all overlapping ranges in this collection.
A subclass of DataBuffer that stores a data buffer on the heap.
lldb::offset_t SetByteSize(lldb::offset_t byte_size)
Set the number of bytes in the data buffer.
A class to manage flag bits.
lldb::StreamUP GetAsyncErrorStream()
TargetList & GetTargetList()
Get accessor for the target list.
bool IsTopIOHandler(const lldb::IOHandlerSP &reader_sp)
bool RemoveIOHandler(const lldb::IOHandlerSP &reader_sp)
Remove the given IO handler if it's currently active.
void FlushStatusLine()
Flush cached state (e.g. stale execution context in the statusline).
void RunIOHandlerAsync(const lldb::IOHandlerSP &reader_sp, bool cancel_top_handler=true)
Run the given IO handler and return immediately.
PlatformList & GetPlatformList()
lldb::ListenerSP GetListener()
size_t void PutString(lldb::Severity severity, llvm::StringRef str)
size_t Printf(lldb::Severity severity, const char *format,...) __attribute__((format(printf
static lldb::DisassemblerSP DisassembleRange(const ArchSpec &arch, const char *plugin_name, const char *flavor, const char *cpu, const char *features, Target &target, llvm::ArrayRef< AddressRange > disasm_ranges, bool force_live_memory=false)
Encapsulates dynamic check functions used by expressions.
A plug-in interface definition class for dynamic loaders.
virtual void DidAttach()=0
Called after attaching a process.
virtual void CalculateDynamicSaveCoreRanges(lldb_private::Process &process, std::vector< lldb_private::MemoryRegionInfo > &ranges, llvm::function_ref< bool(const lldb_private::Thread &)> save_thread_predicate)
Returns a list of memory ranges that should be saved in the core file, specific for this dynamic load...
virtual void DidLaunch()=0
Called after launching a process.
static DynamicLoader * FindPlugin(Process *process, llvm::StringRef plugin_name)
Find a dynamic loader plugin for a given process.
void SetUnwindOnError(bool unwind=false)
bool GetStopOthers() const
bool DoesIgnoreBreakpoints() const
bool IsForUtilityExpr() const
bool GetTryAllThreads() const
void SetTrapExceptions(bool b)
void SetTryAllThreads(bool try_others=true)
void SetTimeout(const Timeout< std::micro > &timeout)
void SetStopOthers(bool stop_others=true)
bool DoesUnwindOnError() const
const Timeout< std::micro > & GetTimeout() const
bool GetStopOnFork() const
void SetIgnoreBreakpoints(bool ignore=false)
const Timeout< std::micro > & GetOneThreadTimeout() const
virtual llvm::StringRef GetFlavor() const =0
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
void SetFrameSP(const lldb::StackFrameSP &frame_sp)
Set accessor to set only the frame shared pointer.
void SetProcessPtr(Process *process)
Set accessor to set only the process shared pointer from a process pointer.
void SetThreadPtr(Thread *thread)
Set accessor to set only the thread shared pointer from a thread pointer.
void SetTargetPtr(Target *target)
Set accessor to set only the target shared pointer from a target pointer.
StackFrame & GetFrameRef() const
Returns a reference to the thread object.
bool HasFrameScope() const
Returns true the ExecutionContext object contains a valid target, process, thread and frame.
void SetFramePtr(StackFrame *frame)
Set accessor to set only the frame shared pointer from a frame pointer.
Process * GetProcessPtr() const
Returns a pointer to the process object.
Thread * GetThreadPtr() const
Returns a pointer to the thread object.
const ConstString & GetFilename() const
Filename string const get accessor.
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
static FileSystem & Instance()
bool Test(ValueType bit) const
Test a single flag bit.
bool GetIsOptimized()
Get whether compiler optimizations were enabled for this function.
static lldb::thread_t GetCurrentThread()
Get the thread token (the one returned by ThreadCreate when the thread was created) for the calling t...
uint32_t GetIndexOfInstructionAtAddress(const Address &addr)
lldb::InstructionSP GetInstructionAtIndex(size_t idx) const
uint32_t GetIndexOfNextBranchInstruction(uint32_t start, bool ignore_calls, bool *found_calls) const
Get the index of the next branch instruction.
static void ModulesDidLoad(lldb_private::ModuleList &module_list, Process *process, InstrumentationRuntimeCollection &runtimes)
Class used by the Process to hold a list of its JITLoaders.
void ModulesDidLoad(ModuleList &module_list)
static void LoadPlugins(Process *process, lldb_private::JITLoaderList &list)
Find a JIT loader plugin for a given process.
virtual lldb::LanguageType GetLanguageType() const =0
static LanguageRuntime * FindPlugin(Process *process, lldb::LanguageType language)
virtual bool CouldHaveDynamicValue(ValueObject &in_value)=0
static lldb::LanguageType GetPrimaryLanguage(lldb::LanguageType language)
static std::set< lldb::LanguageType > GetSupportedLanguages()
static lldb::ListenerSP MakeListener(const char *name)
void PutCString(const char *cstr)
void PutString(llvm::StringRef str)
static lldb::MemoryHistorySP FindPlugin(const lldb::ProcessSP process)
LazyBool GetMapped() const
int GetPageSize() const
Get the target system's VM page size in bytes.
LazyBool GetReadable() const
LazyBool GetExecutable() const
uint32_t GetLLDBPermissions() const
Range< lldb::addr_t, lldb::addr_t > RangeType
const std::optional< std::vector< lldb::addr_t > > & GetDirtyPageList() const
Get a vector of target VM pages that are dirty – that have been modified – within this memory region.
LazyBool GetWritable() const
void SetLLDBPermissions(uint32_t permissions)
virtual llvm::Expected< std::vector< lldb::addr_t > > UnpackTagsData(const std::vector< uint8_t > &tags, size_t granules=0) const =0
virtual lldb::addr_t GetGranuleSize() const =0
virtual llvm::Expected< std::vector< uint8_t > > PackTags(const std::vector< lldb::addr_t > &tags) const =0
virtual int32_t GetAllocationTagType() const =0
A collection class for Module objects.
A class that describes an executable image and its associated object and symbol files.
const FileSpec & GetFileSpec() const
Get const accessor for the module file specification.
A plug-in interface definition class for object file parsers.
A plug-in interface definition class for halted OS helpers.
virtual lldb::ThreadSP CreateThread(lldb::tid_t tid, lldb::addr_t context)
static OperatingSystem * FindPlugin(Process *process, const char *plugin_name)
Find a halted OS plugin for a given process.
virtual bool UpdateThreadList(ThreadList &old_thread_list, ThreadList &real_thread_list, ThreadList &new_thread_list)=0
virtual bool DoesPluginReportAllThreads()=0
auto GetPropertyAtIndexAs(size_t idx, const ExecutionContext *exe_ctx=nullptr) const
Property * ProtectedGetPropertyAtIndex(size_t idx)
bool SetPropertyAtIndex(size_t idx, T t, const ExecutionContext *exe_ctx=nullptr) const
static lldb::OptionValuePropertiesSP CreateLocalCopy(const Properties &global_properties)
virtual llvm::StringRef GetPluginName()=0
static llvm::SmallVector< ProcessCreateInstance > GetProcessCreateCallbacks()
static ProcessCreateInstance GetProcessCreateCallbackForPluginName(llvm::StringRef name)
static llvm::SmallVector< StructuredDataPluginCallbacks > GetStructuredDataPluginCallbacks()
static LanguageSet GetAllTypeSystemSupportedLanguagesForTypes()
static PolicyStack & Get()
uint32_t GetResumeCount() const
lldb::ListenerSP GetListenerForProcess(Debugger &debugger)
bool GetWaitForLaunch() const
ProcessExperimentalProperties()
lldb::pid_t GetProcessID() const
lldb::ListenerSP m_listener_sp
FileSpec & GetExecutableFile()
bool IsScriptedProcess() const
ArchSpec & GetArchitecture()
void SetNameMatchType(NameMatch name_match_type)
ProcessInstanceInfo & GetProcessInfo()
static void DumpTableHeader(Stream &s, bool show_args, bool verbose)
bool GetDetachKeepsStopped() const
bool TrackMemoryCacheChanges() const
bool GetSteppingRunsAllThreads() const
void SetStopOnSharedLibraryEvents(bool stop)
Args GetExtraStartupCommands() const
std::unique_ptr< ProcessExperimentalProperties > m_experimental_properties_up
FollowForkMode GetFollowForkMode() const
uint32_t GetVirtualAddressableBits() const
~ProcessProperties() override
void SetIgnoreBreakpointsInExpressions(bool ignore)
bool GetUnwindOnErrorInExpressions() const
Args GetAlwaysRunThreadNames() const
std::chrono::seconds GetInterruptTimeout() const
bool GetDisableLangRuntimeUnwindPlans() const
void SetDetachKeepsStopped(bool keep_stopped)
void SetDisableLangRuntimeUnwindPlans(bool disable)
std::chrono::seconds GetUtilityExpressionTimeout() const
void SetVirtualAddressableBits(uint32_t bits)
bool GetStopOnSharedLibraryEvents() const
void SetHighmemVirtualAddressableBits(uint32_t bits)
void SetOSPluginReportsAllThreads(bool does_report)
bool GetWarningsOptimization() const
void DisableLanguageRuntimeUnwindPlansCallback()
void SetUnwindOnErrorInExpressions(bool ignore)
bool GetDisableMemoryCache() const
bool GetUseDelayedBreakpoints() 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)
Read/write lock around the process running/stopped state.
EventActionResult HandleBeingInterrupted() override
const char * GetExitString() override
EventActionResult PerformAction(lldb::EventSP &event_sp) override
AttachCompletionHandler(Process *process, uint32_t exec_count)
std::string m_exit_string
NextEventAction(Process *process)
lldb::ProcessWP m_process_wp
static bool GetRestartedFromEvent(const Event *event_ptr)
virtual bool ShouldStop(Event *event_ptr, bool &found_valid_stopinfo)
void SetUpdateStateOnRemoval()
static void AddRestartedReason(Event *event_ptr, const char *reason)
void SetInterrupted(bool new_value)
lldb::ProcessSP GetProcessSP() const
void SetRestarted(bool new_value)
static void SetRestartedInEvent(Event *event_ptr, bool new_value)
static lldb::ProcessSP GetProcessFromEvent(const Event *event_ptr)
static void SetInterruptedInEvent(Event *event_ptr, bool new_value)
bool ForwardEventToPendingListeners(Event *event_ptr) override
This will be queried for a Broadcaster with a primary and some secondary listeners after the primary ...
llvm::StringRef GetFlavor() const override
~ProcessEventData() override
bool GetInterrupted() const
bool GetRestarted() const
size_t GetNumRestartedReasons()
static bool GetInterruptedFromEvent(const Event *event_ptr)
const char * GetRestartedReasonAtIndex(size_t idx)
static bool SetUpdateStateOnRemoval(Event *event_ptr)
static lldb::StateType GetStateFromEvent(const Event *event_ptr)
lldb::StateType GetState() const
static const Process::ProcessEventData * GetEventDataFromEvent(const Event *event_ptr)
static llvm::StringRef GetFlavorString()
void DoOnRemoval(Event *event_ptr) override
void Dump(Stream *s) const override
A plug-in interface definition class for debugging a process.
virtual Status EnableBreakpointSite(BreakpointSite *bp_site)
Status WillAttachToProcessWithName(const char *process_name, bool wait_for_launch)
Called before attaching to a process.
virtual llvm::Expected< TraceSupportedResponse > TraceSupported()
Get the processor tracing type supported for this process.
lldb::IOHandlerSP m_process_input_reader
friend class ProcessProperties
UtilityFunction * GetLoadImageUtilityFunction(Platform *platform, llvm::function_ref< std::unique_ptr< UtilityFunction >()> factory)
Get the cached UtilityFunction that assists in loading binary images into the process.
virtual Status DoSignal(int signal)
Sends a process a UNIX signal signal.
virtual Status WillResume()
Called before resuming to a process.
std::mutex m_process_input_reader_mutex
lldb::addr_t m_code_address_mask
Mask for code an data addresses.
StopPointSiteList< lldb_private::BreakpointSite > & GetBreakpointSiteList()
std::vector< lldb::addr_t > m_image_tokens
virtual Status DoHalt(bool &caused_stop)
Halts a running process.
virtual void DidLaunch()
Called after launching a process.
virtual Status DisableSoftwareBreakpoint(BreakpointSite *bp_site)
lldb::pid_t GetID() const
Returns the pid of the process or LLDB_INVALID_PROCESS_ID if there is no known pid.
lldb::break_id_t CreateBreakpointSite(const lldb::BreakpointLocationSP &owner, bool use_hardware)
virtual Status WillSignal()
Called before sending a signal to a process.
void ResetImageToken(size_t token)
lldb::JITLoaderListUP m_jit_loaders_up
lldb::addr_t CallocateMemory(size_t size, uint32_t permissions, Status &error)
The public interface to allocating memory in the process, this also clears the allocated memory.
void SetNextEventAction(Process::NextEventAction *next_event_action)
Status Destroy(bool force_kill)
Kills the process and shuts down all threads that were spawned to track and monitor the process.
virtual Status WillDetach()
Called before detaching from a process.
virtual Status DoLaunch(Module *exe_module, ProcessLaunchInfo &launch_info)
Launch a new process.
StopPointSiteList< lldb_private::BreakpointSite > m_breakpoint_site_list
This is the list of breakpoint locations we intend to insert in the target.
void ControlPrivateStateThread(uint32_t signal)
ThreadList & GetThreadList()
void SetAddressableBitMasks(AddressableBits bit_masks)
void ClearPreResumeActions()
virtual DataExtractor GetAuxvData()
Process(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp)
Construct with a shared pointer to a target, and the Process listener.
lldb::ExpressionResults RunThreadPlan(ExecutionContext &exe_ctx, lldb::ThreadPlanSP &thread_plan_sp, const EvaluateExpressionOptions &options, DiagnosticManager &diagnostic_manager)
void PrintWarningUnsupportedLanguage(const SymbolContext &sc)
Print a user-visible warning about a function written in a language that this version of LLDB doesn't...
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)
DelayedBreakpointCache m_delayed_breakpoints
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
llvm::Error ExecuteBreakpointSiteAction(BreakpointSite &site, Process::BreakpointAction action, bool forbid_delay)
Performs action on site.
std::atomic< bool > m_destructing
std::shared_ptr< PrivateStateThread > m_current_private_state_thread_sp
This is filled on construction with the "main" private state which will be exposed to clients of this...
virtual llvm::Error UpdateBreakpointSites(const BreakpointSiteToActionMap &site_to_action)
virtual Status DoGetMemoryRegionInfo(lldb::addr_t load_addr, MemoryRegionInfo &range_info)
DoGetMemoryRegionInfo is called by GetMemoryRegionInfo after it has removed non address bits from loa...
@ eBroadcastInternalStateControlResume
@ eBroadcastInternalStateControlStop
@ eBroadcastInternalStateControlPause
int GetExitStatus()
Get the exit status for a process.
OperatingSystem * GetOperatingSystem()
Status WillAttachToProcessWithID(lldb::pid_t pid)
Called before attaching to a process.
virtual Status DoDetach(bool keep_stopped)
Detaches from a running or stopped process.
std::unique_ptr< UtilityFunction > m_dlopen_utility_func_up
void SetRunningUtilityFunction(bool on)
void DisableAllBreakpointSites()
uint32_t m_process_unique_id
Each lldb_private::Process class that is created gets a unique integer ID that increments with each n...
int64_t ReadSignedIntegerFromMemory(lldb::addr_t load_addr, size_t byte_size, int64_t fail_value, Status &error)
Address AdvanceAddressToNextBranchInstruction(Address default_stop_addr, AddressRange range_bounds)
Find the next branch instruction to set a breakpoint on.
virtual bool GetLoadAddressPermissions(lldb::addr_t load_addr, uint32_t &permissions)
Attempt to get the attributes for a region of memory in the process.
static bool HandleProcessStateChangedEvent(const lldb::EventSP &event_sp, Stream *stream, SelectMostRelevant select_most_relevant, bool &pop_process_io_handler)
Centralize the code that handles and prints descriptions for process state changes.
bool SetPublicRunLockToRunning()
virtual size_t GetAsyncProfileData(char *buf, size_t buf_size, Status &error)
Get any available profile data.
lldb::addr_t FixDataAddress(lldb::addr_t pc)
lldb::addr_t AllocateMemory(size_t size, uint32_t permissions, Status &error)
The public interface to allocating memory in the process.
std::unique_ptr< NextEventAction > m_next_event_action_up
void SetHighmemDataAddressMask(lldb::addr_t data_address_mask)
bool PruneThreadPlansForTID(lldb::tid_t tid)
Prune ThreadPlanStacks for unreported threads.
virtual void DidDetach()
Called after detaching from a process.
std::function< IterationAction(lldb_private::Status &error, lldb::addr_t bytes_addr, const void *bytes, lldb::offset_t bytes_size)> ReadMemoryChunkCallback
void PausePrivateStateThread()
virtual llvm::SmallVector< llvm::MutableArrayRef< uint8_t > > DoReadMemoryRanges(llvm::ArrayRef< Range< lldb::addr_t, size_t > > ranges, llvm::MutableArrayRef< uint8_t > buffer)
Reads each range individually via ReadMemoryFromInferior, bypassing the memory cache.
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
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.
std::map< lldb::BreakpointSiteSP, BreakpointAction, SiteIDCmp > BreakpointSiteToActionMap
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
lldb::StateType GetPrivateState() const
void SetPrivateStateNoLock(lldb::StateType new_state)
bool DumpThreadPlansForTID(Stream &strm, lldb::tid_t tid, lldb::DescriptionLevel desc_level, bool internal, bool condense_trivial, bool skip_unreported_plans)
Dump the thread plans associated with thread with tid.
lldb::ListenerSP m_private_state_listener_sp
uint32_t m_extended_thread_stop_id
The natural stop id when extended_thread_list was last updated.
bool PreResumeActionCallback(void *)
lldb::RunDirection m_base_direction
ThreadPlanBase run direction.
Range< lldb::addr_t, lldb::addr_t > LoadRange
static constexpr llvm::StringRef ResumeSynchronousHijackListenerName
void SetBreakpointSiteEnabled(BreakpointSite &site, bool is_enabled=true)
bool WritePointerToMemory(lldb::addr_t vm_addr, lldb::addr_t ptr_value, Status &error)
QueueList m_queue_list
The list of libdispatch queues at a given stop point.
void ClearPreResumeAction(PreResumeActionCallback callback, void *baton)
virtual Status WillDestroy()
lldb::ThreadSP CreateOSPluginThread(lldb::tid_t tid, lldb::addr_t context)
std::vector< PreResumeCallbackAndBaton > m_pre_resume_actions
void SetCanJIT(bool can_jit)
Sets whether executing JIT-compiled code in this process is possible.
lldb::StateType GetStateChangedEventsPrivate(lldb::EventSP &event_sp, const Timeout< std::micro > &timeout)
void LoadOperatingSystemPlugin(bool flush)
lldb::StructuredDataPluginSP GetStructuredDataPlugin(llvm::StringRef type_name) const
Returns the StructuredDataPlugin associated with a given type name, if there is one.
lldb::DynamicLoaderUP m_dyld_up
friend class ProcessEventData
void ResetExtendedCrashInfoDict()
AddressRanges FindRangesInMemory(const uint8_t *buf, uint64_t size, const AddressRanges &ranges, size_t alignment, size_t max_matches, Status &error)
virtual bool GetModuleSpec(const FileSpec &module_file_spec, const ArchSpec &arch, ModuleSpec &module_spec)
Try to fetch the module specification for a module with the given file name and architecture.
virtual size_t DoWriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size, Status &error)
Actually do the writing of memory to a process.
virtual Status WriteObjectFile(std::vector< ObjectFile::LoadableData > entries)
std::recursive_mutex m_stdio_communication_mutex
static lldb::ProcessSP FindPlugin(lldb::TargetSP target_sp, llvm::StringRef plugin_name, lldb::ListenerSP listener_sp, const FileSpec *crash_file_path, bool can_connect)
Find a Process plug-in that can debug module using the currently selected architecture.
StopPointSiteList< lldb_private::WatchpointResource > m_watchpoint_resource_list
Watchpoint resources currently in use.
Status DisableBreakpointSiteByID(lldb::user_id_t break_id)
llvm::Expected< const MemoryTagManager * > GetMemoryTagManager()
If this architecture and process supports memory tagging, return a tag manager that can be used to ma...
~Process() override
Destructor.
virtual Status DoWriteMemoryTags(lldb::addr_t addr, size_t len, int32_t type, const std::vector< uint8_t > &tags)
Does the final operation to write memory tags.
std::recursive_mutex m_profile_data_comm_mutex
bool IsBreakpointSitePhysicallyEnabled(const BreakpointSite &site)
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_override)
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)
llvm::SmallVector< std::optional< uint64_t > > ReadUnsignedIntegersFromMemory(llvm::ArrayRef< lldb::addr_t > addresses, unsigned byte_size)
Use Process::ReadMemoryRanges to efficiently read multiple unsigned integers from memory at once.
void StopPrivateStateThread()
size_t AddImageToken(lldb::addr_t image_ptr)
llvm::Error FlushDelayedBreakpoints()
lldb::StateType GetPrivateStateNoLock() const
virtual void DoFindInMemory(lldb::addr_t start_addr, lldb::addr_t end_addr, const uint8_t *buf, size_t size, AddressRanges &matches, size_t alignment, size_t max_matches)
virtual bool DestroyRequiresHalt()
lldb::EventSP CreateEventFromProcessState(uint32_t event_type)
StructuredData::DictionarySP m_crash_info_dict_sp
A repository for extra crash information, consulted in GetExtendedCrashInformation.
Status CalculateCoreFileSaveRanges(const SaveCoreOptions &core_options, CoreFileMemoryRanges &ranges)
Helper function for Process::SaveCore(...) that calculates the address ranges that should be saved.
lldb::TargetSP CalculateTarget() override
bool SetPublicRunLockToStopped()
void SetHighmemCodeAddressMask(lldb::addr_t code_address_mask)
lldb::ByteOrder GetByteOrder() const
Status Detach(bool keep_stopped)
Detaches from a running or stopped process.
void UpdateThreadListIfNeeded()
virtual llvm::Expected< std::vector< lldb::addr_t > > ReadMemoryTags(lldb::addr_t addr, size_t len)
Read memory tags for the range addr to addr+len.
virtual void DidResume()
Called after resuming a process.
virtual void DidExec()
Called after a process re-execs itself.
void SetCodeAddressMask(lldb::addr_t code_address_mask)
AllocatedMemoryCache m_allocated_memory_cache
virtual Status LoadCore()
std::mutex m_exit_status_mutex
Mutex so m_exit_status m_exit_string can be safely accessed from multiple threads.
Status Signal(int signal)
Sends a process a UNIX signal signal.
void SetDynamicLoader(lldb::DynamicLoaderUP dyld)
ThreadPlanStackMap m_thread_plans
This is the list of thread plans for threads in m_thread_list, as well as threads we knew existed,...
std::recursive_mutex m_thread_mutex
virtual Status ConfigureStructuredData(llvm::StringRef type_name, const StructuredData::ObjectSP &config_sp)
Configure asynchronous structured data feature.
virtual Status DoWillAttachToProcessWithName(const char *process_name, bool wait_for_launch)
Called before attaching to a process.
bool m_currently_handling_do_on_removals
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 SetRunningUserExpression(bool on)
enum lldb_private::Process::@120260360120067272255351105340035202127223005263 m_can_jit
bool IsPossibleDynamicValue(ValueObject &in_value)
std::recursive_mutex m_delayed_breakpoints_mutex
llvm::Expected< lldb::ModuleSP > ReadModuleFromMemory(const FileSpec &file_spec, lldb::addr_t header_addr, size_t size_to_read=512)
Creates and populates a module using an in-memory object file.
bool CurrentThreadPosesAsPrivateStateThread()
void RemoveConstituentFromBreakpointSite(lldb::user_id_t site_id, lldb::user_id_t constituent_id, lldb::BreakpointSiteSP &bp_site_sp)
lldb::addr_t FindInMemory(lldb::addr_t low, lldb::addr_t high, const uint8_t *buf, size_t size)
Find a pattern within a memory region.
lldb::OperatingSystemUP m_os_up
uint32_t GetLastNaturalStopID() const
lldb::StateType WaitForProcessToStop(const Timeout< std::micro > &timeout, lldb::EventSP *event_sp_ptr=nullptr, bool wait_always=true, lldb::ListenerSP hijack_listener=lldb::ListenerSP(), Stream *stream=nullptr, bool use_run_lock=true, SelectMostRelevant select_most_relevant=DoNoSelectMostRelevantFrame)
lldb::UnixSignalsSP m_unix_signals_sp
bool StateChangedIsHijackedForSynchronousResume()
const char * GetExitDescription()
Get a textual description of what the process exited.
void SetPublicState(lldb::StateType new_state, bool restarted)
lldb::tid_t m_interrupt_tid
void SetDataAddressMask(lldb::addr_t data_address_mask)
virtual Status DoConnectRemote(llvm::StringRef remote_url)
Attach to a remote system via a URL.
uint64_t ReadUnsignedIntegerFromMemory(lldb::addr_t load_addr, size_t byte_size, uint64_t fail_value, Status &error)
Reads an unsigned integer of the specified byte size from process memory.
llvm::once_flag m_dlopen_utility_func_flag_once
virtual void UpdateQueueListIfNeeded()
virtual Status UpdateAutomaticSignalFiltering()
virtual lldb::addr_t GetImageInfoAddress()
Get the image information address for the current process.
std::map< lldb::addr_t, lldb::addr_t > m_resolved_indirect_addresses
This helps with the Public event coalescing in ShouldBroadcastEvent.
virtual Status DoAttachToProcessWithID(lldb::pid_t pid, const ProcessAttachInfo &attach_info)
Attach to an existing process using a process ID.
llvm::SmallVector< std::optional< std::string > > ReadCStringsFromMemory(llvm::ArrayRef< lldb::addr_t > addresses)
void SetCanRunCode(bool can_run_code)
Sets whether executing code in this process is possible.
Status ClearBreakpointSiteByID(lldb::user_id_t break_id)
virtual Status EnableSoftwareBreakpoint(BreakpointSite *bp_site)
void AppendSTDERR(const char *s, size_t len)
bool GetShouldDetach() const
static llvm::StringRef GetStaticBroadcasterClass()
uint32_t m_thread_index_id
Each thread is created with a 1 based index that won't get re-used.
bool ProcessIOHandlerExists() const
virtual Status DoResume(lldb::RunDirection direction)
Resumes all of a process's threads as configured using the Thread run control functions.
bool RouteAsyncStructuredData(const StructuredData::ObjectSP object_sp)
Route the incoming structured data dictionary to the right plugin.
virtual void DidDestroy()
lldb::offset_t ReadMemoryInChunks(lldb::addr_t vm_addr, void *buf, lldb::addr_t chunk_size, lldb::offset_t total_size, ReadMemoryChunkCallback callback)
Read of memory from a process in discrete chunks, terminating either when all bytes are read,...
lldb::addr_t ReadPointerFromMemory(lldb::addr_t vm_addr, Status &error)
bool IsBreakpointSiteEnabled(const BreakpointSite &site)
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.
lldb::addr_t m_data_address_mask
virtual ArchSpec GetSystemArchitecture()
Get the system architecture for this process.
Status DeallocateMemory(lldb::addr_t ptr)
The public interface to deallocating memory in the process.
virtual Status DisableWatchpoint(lldb::WatchpointSP wp_sp, bool notify=true)
void RegisterNotificationCallbacks(const Process::Notifications &callbacks)
Register for process and thread notifications.
virtual void DidAttach(ArchSpec &process_arch)
Called after attaching a process.
virtual lldb::addr_t ResolveIndirectFunction(const Address *address, Status &error)
Resolve dynamically loaded indirect functions.
lldb::StateType m_last_broadcast_state
LanguageRuntime * GetLanguageRuntime(lldb::LanguageType language)
ProcessModID m_mod_id
Tracks the state of the process over stops and other alterations.
void SetID(lldb::pid_t new_pid)
Sets the stored pid.
virtual JITLoaderList & GetJITLoaders()
uint32_t AssignIndexIDToThread(uint64_t thread_id)
virtual bool SetExitStatus(int exit_status, llvm::StringRef exit_string)
Set accessor for the process exit status (return code).
uint32_t m_queue_list_stop_id
The natural stop id when queue list was last fetched.
void PrintWarningOptimization(const SymbolContext &sc)
Print a user-visible warning about a module being built with optimization.
@ eBroadcastBitStructuredData
@ eBroadcastBitStateChanged
@ eBroadcastBitProfileData
virtual std::optional< bool > DoGetWatchpointReportedAfter()
Provide an override value in the subclass for lldb's CPU-based logic for whether watchpoint exception...
static ProcessProperties & GetGlobalProperties()
lldb::addr_t m_highmem_code_address_mask
lldb::addr_t GetImagePtrFromToken(size_t token) const
int m_exit_status
The exit status of the process, or -1 if not set.
std::vector< LanguageRuntime * > GetLanguageRuntimes()
void SetShouldDetach(bool b)
bool StartPrivateStateThread(lldb::StateType state, bool run_lock_is_running, std::shared_ptr< PrivateStateThread > *backup_ptr=nullptr)
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.
bool SetPrivateRunLockToRunning()
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()
lldb::StateType GetPublicState() const
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
void GetStatus(Stream &ostrm, bool is_verbose=false)
lldb::SystemRuntimeUP m_system_runtime_up
virtual Status WillHalt()
Called before halting to a process.
bool ShouldBroadcastEvent(Event *event_ptr)
This is the part of the event handling that for a process event.
virtual DynamicLoader * GetDynamicLoader()
Get the dynamic loader plug-in for this process.
std::string m_exit_string
A textual description of why a process exited.
lldb::DynamicCheckerFunctionsUP m_dynamic_checkers_up
The functions used by the expression parser to validate data that expressions use.
void SyncIOHandler(uint32_t iohandler_id, const Timeout< std::micro > &timeout)
Waits for the process state to be running within a given msec timeout.
void ForceNextEventDelivery()
ThreadPlanStack * FindThreadPlans(lldb::tid_t tid)
Find the thread plan stack associated with thread with tid.
void SetSTDIOFileDescriptor(int file_descriptor)
Associates a file descriptor with the process' STDIO handling and configures an asynchronous reading ...
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()
std::recursive_mutex & GetPrivateStateMutex()
virtual bool ShouldUseDelayedBreakpoints() const
Reports whether this process should delay physically enabling/disabling breakpoints until the process...
void SynchronouslyNotifyStateChanged(lldb::StateType state)
bool SetPrivateRunLockToStopped()
bool CanJIT()
Determines whether executing JIT-compiled code in this process is possible.
virtual lldb_private::UUID FindModuleUUID(const llvm::StringRef path)
virtual Status DoAttachToProcessWithName(const char *process_name, const ProcessAttachInfo &attach_info)
Attach to an existing process using a partial process name.
ThreadList m_thread_list
The threads for this process as the user will see them.
bool UpdateThreadList(ThreadList &old_thread_list, ThreadList &new_thread_list)
Update the thread list.
const lldb::UnixSignalsSP & GetUnixSignals()
void SetBaseDirection(lldb::RunDirection direction)
Set the base run direction for the process.
Status WriteMemoryTags(lldb::addr_t addr, size_t len, const std::vector< lldb::addr_t > &tags)
Write memory tags for a range of memory.
virtual size_t DoReadMemory(lldb::addr_t vm_addr, void *buf, size_t size, Status &error)=0
Actually do the reading of memory from a process.
virtual std::optional< CoreArgs > GetCoreFileArgs()
Provide arguments of a command that triggered a core dump.
virtual bool IsLiveDebugSession() const
Check if a process is a live debug session, or a corefile/post-mortem.
std::weak_ptr< Target > m_target_wp
The target that owns this process.
virtual void DoDidExec()
Subclasses of Process should implement this function if they need to do anything after a process exec...
llvm::SmallVector< std::optional< lldb::addr_t > > ReadPointersFromMemory(llvm::ArrayRef< lldb::addr_t > ptr_locs)
Use Process::ReadMemoryRanges to efficiently read multiple pointers from memory at once.
virtual void RefreshStateAfterStop()=0
Currently called as part of ShouldStop.
llvm::SmallVector< llvm::MutableArrayRef< uint8_t > > ReadMemoryRanges(llvm::ArrayRef< Range< lldb::addr_t, size_t > > ranges, llvm::MutableArrayRef< uint8_t > buffer)
Read from multiple memory ranges and write the results into buffer.
lldb::addr_t GetCodeAddressMask()
Get the current address mask in the Process.
bool UnregisterNotificationCallbacks(const Process::Notifications &callbacks)
Unregister for process and thread notifications.
bool HijackProcessEvents(lldb::ListenerSP listener_sp)
If you need to ensure that you and only you will hear about some public event, then make a new listen...
Status GetMemoryRegionInfo(lldb::addr_t load_addr, MemoryRegionInfo &range_info)
Locate the memory region that contains load_addr.
friend class DynamicLoader
static void SettingsTerminate()
lldb::addr_t GetHighmemDataAddressMask()
ThreadList m_extended_thread_list
Constituent for extended threads that may be generated, cleared on natural stops.
bool CallVoidArgVoidPtrReturn(const Address *address, lldb::addr_t &returned_func, bool trap_exceptions=false)
bool CurrentThreadIsPrivateStateThread()
void AddPreResumeAction(PreResumeActionCallback callback, void *baton)
size_t GetSoftwareBreakpointTrapOpcode(BreakpointSite *bp_site)
Status Halt(bool clear_thread_plans=false, bool use_run_lock=true)
Halts a running process.
const lldb::ABISP & GetABI()
Status WillLaunch(Module *module)
Called before launching to a process.
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)
bool PrivateStateThreadIsRunning() const
lldb::StateType GetStateChangedEvents(lldb::EventSP &event_sp, const Timeout< std::micro > &timeout, lldb::ListenerSP hijack_listener)
ThreadedCommunication m_stdio_communication
std::atomic< bool > m_finalizing
The tid of the thread that issued the async interrupt, used by thread plan timeout.
std::recursive_mutex m_language_runtimes_mutex
std::string m_stderr_data
Target & GetTarget()
Get the target object pointer for this module.
virtual Status EnableWatchpoint(lldb::WatchpointSP wp_sp, bool notify=true)
lldb::OptionValuePropertiesSP m_collection_sp
T GetPropertyAtIndexAs(uint32_t idx, T default_value, const ExecutionContext *exe_ctx=nullptr) const
static llvm::StringRef GetExperimentalSettingsName()
bool SetPropertyAtIndex(uint32_t idx, T t, const ExecutionContext *exe_ctx=nullptr) const
lldb::OptionValuePropertiesSP GetValueProperties() const
const lldb::OptionValueSP & GetValue() const
void Append(const Entry &entry)
uint64_t GetPC(uint64_t fail_value=LLDB_INVALID_ADDRESS)
lldb::SaveCoreStyle GetStyle() const
bool HasSpecifiedThreads() const
const MemoryRanges & GetCoreFileMemoryRanges() const
bool ShouldThreadBeSaved(lldb::tid_t tid) const
size_t GetByteSize() const
bool SignExtend(uint32_t bit_pos)
unsigned long long ULongLong(unsigned long long fail_value=0) const
size_t GetAsMemoryData(void *dst, size_t dst_len, lldb::ByteOrder dst_byte_order, Status &error) const
long long SLongLong(long long fail_value=0) const
This base class provides an interface to stack frames.
virtual StackID & GetStackID()
void CalculateExecutionContext(ExecutionContext &exe_ctx) override
Reconstruct the object's execution context into sc.
void Clear()
Clear the object state.
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
bool Fail() const
Test for error condition.
const char * AsCString(const char *default_error_str="unknown error") const
Get the error string associated with the current error.
static Status FromError(llvm::Error error)
Avoid using this in new code. Migrate APIs to llvm::Expected instead.
bool Success() const
Test for success condition.
static lldb::ValueObjectSP GetCrashingDereference(lldb::StopInfoSP &stop_info_sp, lldb::addr_t *crashing_address=nullptr)
void ForEach(std::function< void(StopPointSite *)> const &callback)
lldb::break_id_t GetID() const
virtual lldb::addr_t GetLoadAddress() const
uint32_t GetByteSize() const
lldb::break_id_t GetID() 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
A class which can hold structured data.
std::shared_ptr< Object > ObjectSP
Defines a symbol context baton that can be handed other debug core functions.
lldb::LanguageType GetLanguage() const
Function * function
The Function for a given query.
lldb::ModuleSP module_sp
The Module for a given query.
lldb::addr_t GetLoadAddress(Target *target) const
ConstString GetName() const
Address GetAddress() const
A plug-in interface definition class for system runtimes.
virtual void DidAttach()
Called after attaching to a process.
void ModulesDidLoad(const ModuleList &module_list) override
Called when modules have been loaded in the process.
virtual void DidLaunch()
Called after launching a process.
static SystemRuntime * FindPlugin(Process *process)
Find a system runtime plugin for a given process.
uint32_t GetIndexOfTarget(lldb::TargetSP target_sp) const
lldb::TargetSP GetSelectedTarget()
bool SetPreferDynamicValue(lldb::DynamicValueType d)
bool GetUseFastStepping() const
lldb::DynamicValueType GetPreferDynamicValue() const
void SetFirstPrivateStopTime()
void SetFirstPublicStopTime()
Module * GetExecutableModulePointer()
Debugger & GetDebugger() const
void UpdateSignalsFromDummy(lldb::UnixSignalsSP signals_sp, lldb::StreamSP warning_stream_sp)
Updates the signals in signals_sp using the stored dummy signals.
void ClearAllLoadedSections()
void ClearModules(bool delete_locations)
Architecture * GetArchitecturePlugin() const
TargetStats & GetStatistics()
bool SetArchitecture(const ArchSpec &arch_spec, bool set_platform=false, bool merge=true)
Set the architecture for this target.
llvm::Expected< lldb::TypeSystemSP > GetScratchTypeSystemForLanguage(lldb::LanguageType language, bool create_on_demand=true)
lldb::ModuleSP GetExecutableModule()
Gets the module for the main executable.
void DidExec()
Called as the last function in Process::DidExec().
bool RunStopHooks(bool at_initial_stop=false)
Status Install(ProcessLaunchInfo *launch_info)
lldb::PlatformSP GetPlatform()
const ArchSpec & GetArchitecture() const
void SetExecutableModule(lldb::ModuleSP &module_sp, LoadDependentFiles load_dependent_files=eLoadDependentsDefault)
Set the main executable module.
void SetPlatform(const lldb::PlatformSP &platform_sp)
virtual ThreadIterable Threads()
static llvm::Expected< HostThread > LaunchThread(llvm::StringRef name, std::function< lldb::thread_result_t()> thread_function, size_t min_stack_byte_size=0)
lldb::ThreadSP GetSelectedThread()
uint32_t GetSize(bool can_update=true)
bool SetSelectedThreadByID(lldb::tid_t tid, bool notify=false)
lldb::ThreadSP FindThreadByIndexID(uint32_t index_id, bool can_update=true)
lldb::ThreadSP GetThreadAtIndex(uint32_t idx, bool can_update=true)
std::recursive_mutex & GetMutex() const override
lldb::ThreadSP GetExpressionExecutionThread()
static void SettingsInitialize()
static void SettingsTerminate()
static ThreadProperties & GetGlobalProperties()
Represents UUID's of various sizes.
RAII guard that should be acquired when an utility function is called within a given process.
"lldb/Expression/UtilityFunction.h" Encapsulates a bit of source code that provides a function that i...
lldb::LanguageType GetObjectRuntimeLanguage()
uint8_t * GetBytes()
Get a pointer to the data.
#define LLDB_INVALID_BREAK_ID
#define LLDB_INVALID_ADDRESS_MASK
Address Mask Bits not used for addressing are set to 1 in the mask; all mask bits set is an invalid v...
#define LLDB_INVALID_THREAD_ID
#define UNUSED_IF_ASSERT_DISABLED(x)
#define LLDB_INVALID_ADDRESS
#define LLDB_INVALID_PROCESS_ID
@ DoNoSelectMostRelevantFrame
@ SelectMostRelevantFrame
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
bool StateIsStoppedState(lldb::StateType state, bool must_exist)
Check if a state represents a state where the process or thread is stopped.
void RegisterAssertFrameRecognizer(Process *process)
Registers the assert stack frame recognizer.
bool StateIsRunningState(lldb::StateType state)
Check if a state represents a state where the process or thread is running.
lldb::ProcessSP(* ProcessCreateInstance)(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, const FileSpec *crash_file_path, bool can_connect)
@ eBroadcastAlways
Always send a broadcast when the value is modified.
const char * StateAsCString(lldb::StateType state)
Converts a StateType to a C string.
std::vector< ProcessInstanceInfo > ProcessInstanceInfoList
static uint32_t bits(const uint32_t val, const uint32_t msbit, const uint32_t lsbit)
std::shared_ptr< lldb_private::OptionValueProperties > OptionValuePropertiesSP
std::shared_ptr< lldb_private::ThreadPlan > ThreadPlanSP
std::shared_ptr< lldb_private::ABI > ABISP
std::shared_ptr< lldb_private::StackFrame > StackFrameSP
std::shared_ptr< lldb_private::BreakpointSite > BreakpointSiteSP
std::shared_ptr< lldb_private::BreakpointLocation > BreakpointLocationSP
DescriptionLevel
Description levels for "void GetDescription(Stream *, DescriptionLevel)" calls.
@ eDescriptionLevelVerbose
RunDirection
Execution directions.
std::shared_ptr< lldb_private::IOHandler > IOHandlerSP
std::shared_ptr< lldb_private::Thread > ThreadSP
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
std::shared_ptr< lldb_private::UnixSignals > UnixSignalsSP
std::shared_ptr< lldb_private::Platform > PlatformSP
StateType
Process and Thread States.
@ eStateUnloaded
Process is object is valid, but not currently loaded.
@ eStateConnected
Process is connected to remote debug services, but not launched or attached to anything yet.
@ eStateDetached
Process has been detached and can't be examined.
@ eStateStopped
Process or thread is stopped and can be examined.
@ eStateSuspended
Process or thread is in a suspended state as far as the debugger is concerned while other processes o...
@ eStateRunning
Process or thread is running and can't be examined.
@ eStateLaunching
Process is in the process of launching.
@ eStateAttaching
Process is currently trying to attach.
@ eStateExited
Process has exited and can't be examined.
@ eStateStepping
Process or thread is in the process of stepping and can not be examined.
@ eStateCrashed
Process or thread has crashed and can be examined.
LanguageType
Programming language type.
@ eLanguageTypeMipsAssembler
Mips_Assembler.
@ eLanguageTypeUnknown
Unknown or invalid language value.
@ eLanguageTypeC
Non-standardized C, such as K&R.
std::shared_ptr< lldb_private::MemoryHistory > MemoryHistorySP
ExpressionResults
The results of expression evaluation.
@ eExpressionHitBreakpoint
@ eExpressionStoppedForDebug
@ eExpressionThreadVanished
std::shared_ptr< lldb_private::StructuredDataPlugin > StructuredDataPluginSP
std::shared_ptr< lldb_private::Process > ProcessSP
InstrumentationRuntimeType
std::shared_ptr< lldb_private::Disassembler > DisassemblerSP
std::shared_ptr< lldb_private::LanguageRuntime > LanguageRuntimeSP
std::shared_ptr< lldb_private::Event > EventSP
std::unique_ptr< lldb_private::DynamicLoader > DynamicLoaderUP
ByteOrder
Byte ordering definitions.
std::shared_ptr< lldb_private::Watchpoint > WatchpointSP
std::shared_ptr< lldb_private::Listener > ListenerSP
std::shared_ptr< lldb_private::StopInfo > StopInfoSP
StopReason
Thread stop reasons.
@ eStopReasonPlanComplete
std::shared_ptr< lldb_private::Target > TargetSP
std::shared_ptr< lldb_private::RegisterContext > RegisterContextSP
std::shared_ptr< lldb_private::InstrumentationRuntime > InstrumentationRuntimeSP
std::shared_ptr< lldb_private::Module > ModuleSP
std::shared_ptr< lldb_private::OptionValue > OptionValueSP
std::shared_ptr< lldb_private::ThreadCollection > ThreadCollectionSP
A SmallBitVector that represents a set of source languages (lldb::LanguageType).
Describes what view of the process a thread should see and what operations it is allowed to perform.
@ Private
Parent (unwinder) frames, private state, private run lock.
static Policy PrivateState()
BreakpointSiteToActionMap m_site_to_action
void Enqueue(lldb::BreakpointSiteSP site, BreakpointAction action)
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)
The PrivateStateThread struct gathers all the bits of state needed to manage handling Process events,...
ProcessRunLock m_public_run_lock
Process & m_process
The process state that we show to client code.
ProcessRunLock & GetRunLock()
HostThread m_private_state_thread
bool IsOnThread(const HostThread &thread) const
std::string m_thread_name
bool m_is_override
This will be the thread name given to the Private State HostThread when it gets spun up.
ProcessRunLock m_private_run_lock
bool Contains(BaseType r) const
BaseType GetRangeBase() const
SizeType GetByteSize() const
void SetRangeBase(BaseType b)
Set the start value for the range, and keep the same size.
BaseType GetRangeEnd() const
Range Intersect(const Range &rhs) const
void SetByteSize(SizeType s)
std::optional< ExitDescription > exit_desc
Helper RAII class for collecting telemetry.
void DispatchOnExit(llvm::unique_function< void(Info *info)> final_callback)
void DispatchNow(llvm::unique_function< void(Info *info)> populate_fields_cb)
void SetDebugger(Debugger *debugger)