LLDB mainline
Process.cpp
Go to the documentation of this file.
1//===-- Process.cpp -------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include <atomic>
10#include <memory>
11#include <mutex>
12#include <optional>
13
14#include "llvm/ADT/ScopeExit.h"
15#include "llvm/Support/ScopedPrinter.h"
16#include "llvm/Support/Threading.h"
17
20#include "lldb/Core/Debugger.h"
21#include "lldb/Core/Module.h"
24#include "lldb/Core/Progress.h"
25#include "lldb/Core/Telemetry.h"
32#include "lldb/Host/Host.h"
33#include "lldb/Host/HostInfo.h"
35#include "lldb/Host/Pipe.h"
36#include "lldb/Host/Terminal.h"
42#include "lldb/Symbol/Symbol.h"
43#include "lldb/Target/ABI.h"
55#include "lldb/Target/Process.h"
60#include "lldb/Target/Target.h"
62#include "lldb/Target/Thread.h"
69#include "lldb/Utility/Event.h"
71#include "lldb/Utility/Log.h"
75#include "lldb/Utility/State.h"
76#include "lldb/Utility/Timer.h"
77
78using namespace lldb;
79using namespace lldb_private;
80using namespace std::chrono;
81
83 : public Cloneable<ProcessOptionValueProperties, OptionValueProperties> {
84public:
85 ProcessOptionValueProperties(llvm::StringRef name) : Cloneable(name) {}
86
87 const Property *
89 const ExecutionContext *exe_ctx) const override {
90 // When getting the value for a key from the process options, we will
91 // always try and grab the setting from the current process if there is
92 // one. Else we just use the one from this instance.
93 if (exe_ctx) {
94 Process *process = exe_ctx->GetProcessPtr();
95 if (process) {
96 ProcessOptionValueProperties *instance_properties =
97 static_cast<ProcessOptionValueProperties *>(
98 process->GetValueProperties().get());
99 if (this != instance_properties)
100 return instance_properties->ProtectedGetPropertyAtIndex(idx);
101 }
102 }
103 return ProtectedGetPropertyAtIndex(idx);
104 }
105};
106
108 {
110 "parent",
111 "Continue tracing the parent process and detach the child.",
112 },
113 {
115 "child",
116 "Trace the child process and detach the parent.",
117 },
118};
119
120static constexpr unsigned g_string_read_width = 256;
121
122#define LLDB_PROPERTIES_process
123#include "TargetProperties.inc"
124
125enum {
126#define LLDB_PROPERTIES_process
127#include "TargetPropertiesEnum.inc"
129};
130
131#define LLDB_PROPERTIES_process_experimental
132#include "TargetProperties.inc"
133
134enum {
135#define LLDB_PROPERTIES_process_experimental
136#include "TargetPropertiesEnum.inc"
137};
138
140 : public Cloneable<ProcessExperimentalOptionValueProperties,
141 OptionValueProperties> {
142public:
144 : Cloneable(Properties::GetExperimentalSettingsName()) {}
145};
146
152
154 : Properties(),
155 m_process(process) // Can be nullptr for global ProcessProperties
156{
157 if (process == nullptr) {
158 // Global process properties, set them up one time
159 m_collection_sp = std::make_shared<ProcessOptionValueProperties>("process");
160 m_collection_sp->Initialize(g_process_properties);
161 m_collection_sp->AppendProperty(
162 "thread", "Settings specific to threads.", true,
164 } else {
167 m_collection_sp->SetValueChangedCallback(
168 ePropertyPythonOSPluginPath,
169 [this] { m_process->LoadOperatingSystemPlugin(true); });
170 m_collection_sp->SetValueChangedCallback(
171 ePropertyDisableLangRuntimeUnwindPlans,
173 }
174
176 std::make_unique<ProcessExperimentalProperties>();
177 m_collection_sp->AppendProperty(
179 "Experimental settings - setting these won't produce "
180 "errors if the setting is not present.",
181 true, m_experimental_properties_up->GetValueProperties());
182}
183
185
187 const uint32_t idx = ePropertyDisableMemCache;
189 idx, g_process_properties[idx].default_uint_value != 0);
190}
191
193 const uint32_t idx = ePropertyMemCacheLineSize;
195 idx, g_process_properties[idx].default_uint_value);
196}
197
199 Args args;
200 const uint32_t idx = ePropertyExtraStartCommand;
201 m_collection_sp->GetPropertyAtIndexAsArgs(idx, args);
202 return args;
203}
204
206 const uint32_t idx = ePropertyExtraStartCommand;
207 m_collection_sp->SetPropertyAtIndexFromArgs(idx, args);
208}
209
211 const uint32_t idx = ePropertyPythonOSPluginPath;
212 return GetPropertyAtIndexAs<FileSpec>(idx, {});
213}
214
216 const uint32_t idx = ePropertyVirtualAddressableBits;
218 idx, g_process_properties[idx].default_uint_value);
219}
220
222 const uint32_t idx = ePropertyVirtualAddressableBits;
223 SetPropertyAtIndex(idx, static_cast<uint64_t>(bits));
224}
225
227 const uint32_t idx = ePropertyHighmemVirtualAddressableBits;
229 idx, g_process_properties[idx].default_uint_value);
230}
231
233 const uint32_t idx = ePropertyHighmemVirtualAddressableBits;
234 SetPropertyAtIndex(idx, static_cast<uint64_t>(bits));
235}
236
238 const uint32_t idx = ePropertyPythonOSPluginPath;
239 SetPropertyAtIndex(idx, file);
240}
241
243 const uint32_t idx = ePropertyIgnoreBreakpointsInExpressions;
245 idx, g_process_properties[idx].default_uint_value != 0);
246}
247
249 const uint32_t idx = ePropertyIgnoreBreakpointsInExpressions;
250 SetPropertyAtIndex(idx, ignore);
251}
252
254 const uint32_t idx = ePropertyUnwindOnErrorInExpressions;
256 idx, g_process_properties[idx].default_uint_value != 0);
257}
258
260 const uint32_t idx = ePropertyUnwindOnErrorInExpressions;
261 SetPropertyAtIndex(idx, ignore);
262}
263
265 const uint32_t idx = ePropertyStopOnSharedLibraryEvents;
267 idx, g_process_properties[idx].default_uint_value != 0);
268}
269
271 const uint32_t idx = ePropertyStopOnSharedLibraryEvents;
272 SetPropertyAtIndex(idx, stop);
273}
274
276 const uint32_t idx = ePropertyDisableLangRuntimeUnwindPlans;
278 idx, g_process_properties[idx].default_uint_value != 0);
279}
280
282 const uint32_t idx = ePropertyDisableLangRuntimeUnwindPlans;
283 SetPropertyAtIndex(idx, disable);
284 m_process->Flush();
285}
286
288 if (!m_process)
289 return;
290 for (auto thread_sp : m_process->Threads()) {
291 thread_sp->ClearStackFrames();
292 thread_sp->DiscardThreadPlans(/*force*/ true);
293 }
294}
295
297 const uint32_t idx = ePropertyDetachKeepsStopped;
299 idx, g_process_properties[idx].default_uint_value != 0);
300}
301
303 const uint32_t idx = ePropertyDetachKeepsStopped;
304 SetPropertyAtIndex(idx, stop);
305}
306
308 const uint32_t idx = ePropertyWarningOptimization;
310 idx, g_process_properties[idx].default_uint_value != 0);
311}
312
314 const uint32_t idx = ePropertyWarningUnsupportedLanguage;
316 idx, g_process_properties[idx].default_uint_value != 0);
317}
318
320 const uint32_t idx = ePropertyStopOnExec;
322 idx, g_process_properties[idx].default_uint_value != 0);
323}
324
326 const uint32_t idx = ePropertyUtilityExpressionTimeout;
327 uint64_t value = GetPropertyAtIndexAs<uint64_t>(
328 idx, g_process_properties[idx].default_uint_value);
329 return std::chrono::seconds(value);
330}
331
332std::chrono::seconds ProcessProperties::GetInterruptTimeout() const {
333 const uint32_t idx = ePropertyInterruptTimeout;
334 uint64_t value = GetPropertyAtIndexAs<uint64_t>(
335 idx, g_process_properties[idx].default_uint_value);
336 return std::chrono::seconds(value);
337}
338
340 const uint32_t idx = ePropertySteppingRunsAllThreads;
342 idx, g_process_properties[idx].default_uint_value != 0);
343}
344
346 const bool fail_value = true;
347 const Property *exp_property =
348 m_collection_sp->GetPropertyAtIndex(ePropertyExperimental);
349 OptionValueProperties *exp_values =
350 exp_property->GetValue()->GetAsProperties();
351 if (!exp_values)
352 return fail_value;
353
354 return exp_values
355 ->GetPropertyAtIndexAs<bool>(ePropertyOSPluginReportsAllThreads)
356 .value_or(fail_value);
357}
358
360 const Property *exp_property =
361 m_collection_sp->GetPropertyAtIndex(ePropertyExperimental);
362 OptionValueProperties *exp_values =
363 exp_property->GetValue()->GetAsProperties();
364 if (exp_values)
365 exp_values->SetPropertyAtIndex(ePropertyOSPluginReportsAllThreads,
366 does_report);
367}
368
370 const uint32_t idx = ePropertyFollowForkMode;
372 idx, static_cast<FollowForkMode>(
373 g_process_properties[idx].default_uint_value));
374}
375
377 const uint32_t idx = ePropertyTrackMemoryCacheChanges;
379 idx, g_process_properties[idx].default_uint_value != 0);
380}
381
383 llvm::StringRef plugin_name,
384 ListenerSP listener_sp,
385 const FileSpec *crash_file_path,
386 bool can_connect) {
387 static uint32_t g_process_unique_id = 0;
388
389 ProcessSP process_sp;
390 ProcessCreateInstance create_callback = nullptr;
391 if (!plugin_name.empty()) {
392 create_callback =
394 if (create_callback) {
395 process_sp = create_callback(target_sp, listener_sp, crash_file_path,
396 can_connect);
397 if (process_sp) {
398 if (process_sp->CanDebug(target_sp, true)) {
399 process_sp->m_process_unique_id = ++g_process_unique_id;
400 } else
401 process_sp.reset();
402 }
403 }
404 } else {
405 for (uint32_t idx = 0;
406 (create_callback =
408 ++idx) {
409 process_sp = create_callback(target_sp, listener_sp, crash_file_path,
410 can_connect);
411 if (process_sp) {
412 if (process_sp->CanDebug(target_sp, false)) {
413 process_sp->m_process_unique_id = ++g_process_unique_id;
414 break;
415 } else
416 process_sp.reset();
417 }
418 }
419 }
420 return process_sp;
421}
422
424 static constexpr llvm::StringLiteral class_name("lldb.process");
425 return class_name;
426}
427
429 : Process(target_sp, listener_sp, UnixSignals::CreateForHost()) {
430 // This constructor just delegates to the full Process constructor,
431 // defaulting to using the Host's UnixSignals.
432}
433
435 const UnixSignalsSP &unix_signals_sp)
436 : ProcessProperties(this),
437 Broadcaster((target_sp->GetDebugger().GetBroadcasterManager()),
442 "lldb.process.internal_state_broadcaster"),
444 nullptr, "lldb.process.internal_state_control_broadcaster"),
446 Listener::MakeListener("lldb.process.internal_state_listener")),
449 m_thread_list_real(*this), m_thread_list(*this), m_thread_plans(*this),
461 m_finalizing(false), m_destructing(false),
466 m_crash_info_dict_sp(new StructuredData::Dictionary()) {
468
469 Log *log = GetLog(LLDBLog::Object);
470 LLDB_LOGF(log, "%p Process::Process()", static_cast<void *>(this));
471
473 m_unix_signals_sp = std::make_shared<UnixSignals>();
474
475 SetEventName(eBroadcastBitStateChanged, "state-changed");
477 SetEventName(eBroadcastBitSTDOUT, "stdout-available");
478 SetEventName(eBroadcastBitSTDERR, "stderr-available");
479 SetEventName(eBroadcastBitProfileData, "profile-data-available");
480 SetEventName(eBroadcastBitStructuredData, "structured-data-available");
481
483 eBroadcastInternalStateControlStop, "control-stop");
485 eBroadcastInternalStateControlPause, "control-pause");
487 eBroadcastInternalStateControlResume, "control-resume");
488
489 // The listener passed into process creation is the primary listener:
490 // It always listens for all the event bits for Process:
491 SetPrimaryListener(listener_sp);
492
493 m_private_state_listener_sp->StartListeningForEvents(
496
497 m_private_state_listener_sp->StartListeningForEvents(
501 // We need something valid here, even if just the default UnixSignalsSP.
502 assert(m_unix_signals_sp && "null m_unix_signals_sp after initialization");
503
504 // Allow the platform to override the default cache line size
505 OptionValueSP value_sp =
506 m_collection_sp->GetPropertyAtIndex(ePropertyMemCacheLineSize)
507 ->GetValue();
508 uint64_t platform_cache_line_size =
509 target_sp->GetPlatform()->GetDefaultMemoryCacheLineSize();
510 if (!value_sp->OptionWasSet() && platform_cache_line_size != 0)
511 value_sp->SetValueAs(platform_cache_line_size);
512
513 // FIXME: Frame recognizer registration should not be done in Target.
514 // We should have a plugin do the registration instead, for example, a
515 // common C LanguageRuntime plugin.
517}
518
520 Log *log = GetLog(LLDBLog::Object);
521 LLDB_LOGF(log, "%p Process::~Process()", static_cast<void *>(this));
523
524 // ThreadList::Clear() will try to acquire this process's mutex, so
525 // explicitly clear the thread list here to ensure that the mutex is not
526 // destroyed before the thread list.
527 m_thread_list.Clear();
528}
529
531 // NOTE: intentional leak so we don't crash if global destructor chain gets
532 // called as other threads still use the result of this function
533 static ProcessProperties *g_settings_ptr =
534 new ProcessProperties(nullptr);
535 return *g_settings_ptr;
536}
537
538void Process::Finalize(bool destructing) {
539 if (m_finalizing.exchange(true))
540 return;
541 if (destructing)
542 m_destructing.exchange(true);
543
544 // Destroy the process. This will call the virtual function DoDestroy under
545 // the hood, giving our derived class a chance to do the ncessary tear down.
546 DestroyImpl(false);
547
548 // Clear our broadcaster before we proceed with destroying
550
551 // Do any cleanup needed prior to being destructed... Subclasses that
552 // override this method should call this superclass method as well.
553
554 // We need to destroy the loader before the derived Process class gets
555 // destroyed since it is very likely that undoing the loader will require
556 // access to the real process.
557 m_dynamic_checkers_up.reset();
558 m_abi_sp.reset();
559 m_os_up.reset();
560 m_system_runtime_up.reset();
561 m_dyld_up.reset();
562 m_jit_loaders_up.reset();
563 m_thread_plans.Clear();
564 m_thread_list_real.Destroy();
565 m_thread_list.Destroy();
566 m_extended_thread_list.Destroy();
567 m_queue_list.Clear();
570 std::vector<Notifications> empty_notifications;
571 m_notifications.swap(empty_notifications);
572 m_image_tokens.clear();
573 m_memory_cache.Clear();
574 m_allocated_memory_cache.Clear(/*deallocate_memory=*/true);
575 {
576 std::lock_guard<std::recursive_mutex> guard(m_language_runtimes_mutex);
577 m_language_runtimes.clear();
578 }
581 // Clear the last natural stop ID since it has a strong reference to this
582 // process
583 m_mod_id.SetStopEventForLastNaturalStopID(EventSP());
584 // We have to be very careful here as the m_private_state_listener might
585 // contain events that have ProcessSP values in them which can keep this
586 // process around forever. These events need to be cleared out.
588 m_public_run_lock.SetStopped();
589 m_private_run_lock.SetStopped();
591}
592
594 m_notifications.push_back(callbacks);
595 if (callbacks.initialize != nullptr)
596 callbacks.initialize(callbacks.baton, this);
597}
598
600 std::vector<Notifications>::iterator pos, end = m_notifications.end();
601 for (pos = m_notifications.begin(); pos != end; ++pos) {
602 if (pos->baton == callbacks.baton &&
603 pos->initialize == callbacks.initialize &&
604 pos->process_state_changed == callbacks.process_state_changed) {
605 m_notifications.erase(pos);
606 return true;
607 }
608 }
609 return false;
610}
611
613 std::vector<Notifications>::iterator notification_pos,
614 notification_end = m_notifications.end();
615 for (notification_pos = m_notifications.begin();
616 notification_pos != notification_end; ++notification_pos) {
617 if (notification_pos->process_state_changed)
618 notification_pos->process_state_changed(notification_pos->baton, this,
619 state);
620 }
621}
622
623// FIXME: We need to do some work on events before the general Listener sees
624// them.
625// For instance if we are continuing from a breakpoint, we need to ensure that
626// we do the little "insert real insn, step & stop" trick. But we can't do
627// that when the event is delivered by the broadcaster - since that is done on
628// the thread that is waiting for new events, so if we needed more than one
629// event for our handling, we would stall. So instead we do it when we fetch
630// the event off of the queue.
631//
632
634 StateType state = eStateInvalid;
635
636 if (GetPrimaryListener()->GetEventForBroadcaster(this, event_sp,
637 std::chrono::seconds(0)) &&
638 event_sp)
639 state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
640
641 return state;
642}
643
644void Process::SyncIOHandler(uint32_t iohandler_id,
645 const Timeout<std::micro> &timeout) {
646 // don't sync (potentially context switch) in case where there is no process
647 // IO
649 return;
650
651 auto Result = m_iohandler_sync.WaitForValueNotEqualTo(iohandler_id, timeout);
652
654 if (Result) {
655 LLDB_LOG(
656 log,
657 "waited from m_iohandler_sync to change from {0}. New value is {1}.",
658 iohandler_id, *Result);
659 } else {
660 LLDB_LOG(log, "timed out waiting for m_iohandler_sync to change from {0}.",
661 iohandler_id);
662 }
663}
664
666 const Timeout<std::micro> &timeout, EventSP *event_sp_ptr, bool wait_always,
667 ListenerSP hijack_listener_sp, Stream *stream, bool use_run_lock,
668 SelectMostRelevant select_most_relevant) {
669 // We can't just wait for a "stopped" event, because the stopped event may
670 // have restarted the target. We have to actually check each event, and in
671 // the case of a stopped event check the restarted flag on the event.
672 if (event_sp_ptr)
673 event_sp_ptr->reset();
674 StateType state = GetState();
675 // If we are exited or detached, we won't ever get back to any other valid
676 // state...
677 if (state == eStateDetached || state == eStateExited)
678 return state;
679
681 LLDB_LOG(log, "timeout = {0}", timeout);
682
683 if (!wait_always && StateIsStoppedState(state, true) &&
685 LLDB_LOGF(log,
686 "Process::%s returning without waiting for events; process "
687 "private and public states are already 'stopped'.",
688 __FUNCTION__);
689 // We need to toggle the run lock as this won't get done in
690 // SetPublicState() if the process is hijacked.
691 if (hijack_listener_sp && use_run_lock)
692 m_public_run_lock.SetStopped();
693 return state;
694 }
695
696 while (state != eStateInvalid) {
697 EventSP event_sp;
698 state = GetStateChangedEvents(event_sp, timeout, hijack_listener_sp);
699 if (event_sp_ptr && event_sp)
700 *event_sp_ptr = event_sp;
701
702 bool pop_process_io_handler = (hijack_listener_sp.get() != nullptr);
704 event_sp, stream, select_most_relevant, pop_process_io_handler);
705
706 switch (state) {
707 case eStateCrashed:
708 case eStateDetached:
709 case eStateExited:
710 case eStateUnloaded:
711 // We need to toggle the run lock as this won't get done in
712 // SetPublicState() if the process is hijacked.
713 if (hijack_listener_sp && use_run_lock)
714 m_public_run_lock.SetStopped();
715 return state;
716 case eStateStopped:
718 continue;
719 else {
720 // We need to toggle the run lock as this won't get done in
721 // SetPublicState() if the process is hijacked.
722 if (hijack_listener_sp && use_run_lock)
723 m_public_run_lock.SetStopped();
724 return state;
725 }
726 default:
727 continue;
728 }
729 }
730 return state;
731}
732
734 const EventSP &event_sp, Stream *stream,
735 SelectMostRelevant select_most_relevant,
736 bool &pop_process_io_handler) {
737 const bool handle_pop = pop_process_io_handler;
738
739 pop_process_io_handler = false;
740 ProcessSP process_sp =
742
743 if (!process_sp)
744 return false;
745
746 StateType event_state =
748 if (event_state == eStateInvalid)
749 return false;
750
751 switch (event_state) {
752 case eStateInvalid:
753 case eStateUnloaded:
754 case eStateAttaching:
755 case eStateLaunching:
756 case eStateStepping:
757 case eStateDetached:
758 if (stream)
759 stream->Printf("Process %" PRIu64 " %s\n", process_sp->GetID(),
760 StateAsCString(event_state));
761 if (event_state == eStateDetached)
762 pop_process_io_handler = true;
763 break;
764
765 case eStateConnected:
766 case eStateRunning:
767 // Don't be chatty when we run...
768 break;
769
770 case eStateExited:
771 if (stream)
772 process_sp->GetStatus(*stream);
773 pop_process_io_handler = true;
774 break;
775
776 case eStateStopped:
777 case eStateCrashed:
778 case eStateSuspended:
779 // Make sure the program hasn't been auto-restarted:
781 if (stream) {
782 size_t num_reasons =
784 if (num_reasons > 0) {
785 // FIXME: Do we want to report this, or would that just be annoyingly
786 // chatty?
787 if (num_reasons == 1) {
788 const char *reason =
790 event_sp.get(), 0);
791 stream->Printf("Process %" PRIu64 " stopped and restarted: %s\n",
792 process_sp->GetID(),
793 reason ? reason : "<UNKNOWN REASON>");
794 } else {
795 stream->Printf("Process %" PRIu64
796 " stopped and restarted, reasons:\n",
797 process_sp->GetID());
798
799 for (size_t i = 0; i < num_reasons; i++) {
800 const char *reason =
802 event_sp.get(), i);
803 stream->Printf("\t%s\n", reason ? reason : "<UNKNOWN REASON>");
804 }
805 }
806 }
807 }
808 } else {
809 StopInfoSP curr_thread_stop_info_sp;
810 // Lock the thread list so it doesn't change on us, this is the scope for
811 // the locker:
812 {
813 ThreadList &thread_list = process_sp->GetThreadList();
814 std::lock_guard<std::recursive_mutex> guard(thread_list.GetMutex());
815
816 ThreadSP curr_thread(thread_list.GetSelectedThread());
817
818 if (curr_thread && curr_thread->IsValid())
819 curr_thread_stop_info_sp = curr_thread->GetStopInfo();
820 bool prefer_curr_thread = curr_thread_stop_info_sp &&
821 curr_thread_stop_info_sp->ShouldSelect();
822
823 if (!prefer_curr_thread) {
824 // Prefer a thread that has just completed its plan over another
825 // thread as current thread.
826 ThreadSP plan_thread;
827 ThreadSP other_thread;
828
829 for (ThreadSP thread : thread_list.Threads()) {
830 StopInfoSP stop_info = thread->GetStopInfo();
831 if (!stop_info || !stop_info->ShouldSelect())
832 continue;
833 StopReason thread_stop_reason = stop_info->GetStopReason();
834 if (thread_stop_reason == eStopReasonPlanComplete) {
835 if (!plan_thread)
836 plan_thread = thread;
837 } else if (!other_thread) {
838 other_thread = thread;
839 }
840 }
841 if (plan_thread)
842 thread_list.SetSelectedThreadByID(plan_thread->GetID());
843 else if (other_thread)
844 thread_list.SetSelectedThreadByID(other_thread->GetID());
845 else {
846 ThreadSP thread;
847 if (curr_thread && curr_thread->IsValid())
848 thread = curr_thread;
849 else
850 thread = thread_list.GetThreadAtIndex(0);
851
852 if (thread)
853 thread_list.SetSelectedThreadByID(thread->GetID());
854 }
855 }
856 }
857 // Drop the ThreadList mutex by here, since GetThreadStatus below might
858 // have to run code, e.g. for Data formatters, and if we hold the
859 // ThreadList mutex, then the process is going to have a hard time
860 // restarting the process.
861 if (stream) {
862 Debugger &debugger = process_sp->GetTarget().GetDebugger();
863 if (debugger.GetTargetList().GetSelectedTarget().get() ==
864 &process_sp->GetTarget()) {
865 ThreadSP thread_sp = process_sp->GetThreadList().GetSelectedThread();
866
867 if (!thread_sp || !thread_sp->IsValid())
868 return false;
869
870 const bool only_threads_with_stop_reason = true;
871 const uint32_t start_frame =
872 thread_sp->GetSelectedFrameIndex(select_most_relevant);
873 const uint32_t num_frames = 1;
874 const uint32_t num_frames_with_source = 1;
875 const bool stop_format = true;
876
877 process_sp->GetStatus(*stream);
878 process_sp->GetThreadStatus(*stream, only_threads_with_stop_reason,
879 start_frame, num_frames,
880 num_frames_with_source,
881 stop_format);
882 if (curr_thread_stop_info_sp) {
883 lldb::addr_t crashing_address;
885 curr_thread_stop_info_sp, &crashing_address);
886 if (valobj_sp) {
888 ValueObject::GetExpressionPathFormat::
889 eGetExpressionPathFormatHonorPointers;
890 stream->PutCString("Likely cause: ");
891 valobj_sp->GetExpressionPath(*stream, format);
892 stream->Printf(" accessed 0x%" PRIx64 "\n", crashing_address);
893 }
894 }
895 } else {
896 uint32_t target_idx = debugger.GetTargetList().GetIndexOfTarget(
897 process_sp->GetTarget().shared_from_this());
898 if (target_idx != UINT32_MAX)
899 stream->Printf("Target %d: (", target_idx);
900 else
901 stream->Printf("Target <unknown index>: (");
902 process_sp->GetTarget().Dump(stream, eDescriptionLevelBrief);
903 stream->Printf(") stopped.\n");
904 }
905 }
906
907 // Pop the process IO handler
908 pop_process_io_handler = true;
909 }
910 break;
911 }
912
913 if (handle_pop && pop_process_io_handler)
914 process_sp->PopProcessIOHandler();
915
916 return true;
917}
918
920 if (listener_sp) {
921 return HijackBroadcaster(listener_sp, eBroadcastBitStateChanged |
923 } else
924 return false;
925}
926
928
930 const Timeout<std::micro> &timeout,
931 ListenerSP hijack_listener_sp) {
933 LLDB_LOG(log, "timeout = {0}, event_sp)...", timeout);
934
935 ListenerSP listener_sp = hijack_listener_sp;
936 if (!listener_sp)
937 listener_sp = GetPrimaryListener();
938
939 StateType state = eStateInvalid;
940 if (listener_sp->GetEventForBroadcasterWithType(
942 timeout)) {
943 if (event_sp && event_sp->GetType() == eBroadcastBitStateChanged)
944 state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
945 else
946 LLDB_LOG(log, "got no event or was interrupted.");
947 }
948
949 LLDB_LOG(log, "timeout = {0}, event_sp) => {1}", timeout, state);
950 return state;
951}
952
955
956 LLDB_LOGF(log, "Process::%s...", __FUNCTION__);
957
958 Event *event_ptr;
959 event_ptr = GetPrimaryListener()->PeekAtNextEventForBroadcasterWithType(
961 if (log) {
962 if (event_ptr) {
963 LLDB_LOGF(log, "Process::%s (event_ptr) => %s", __FUNCTION__,
965 } else {
966 LLDB_LOGF(log, "Process::%s no events found", __FUNCTION__);
967 }
968 }
969 return event_ptr;
970}
971
974 const Timeout<std::micro> &timeout) {
976 LLDB_LOG(log, "timeout = {0}, event_sp)...", timeout);
977
978 StateType state = eStateInvalid;
979 if (m_private_state_listener_sp->GetEventForBroadcasterWithType(
982 timeout))
983 if (event_sp && event_sp->GetType() == eBroadcastBitStateChanged)
984 state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
985
986 LLDB_LOG(log, "timeout = {0}, event_sp) => {1}", timeout,
987 state == eStateInvalid ? "TIMEOUT" : StateAsCString(state));
988 return state;
989}
990
992 const Timeout<std::micro> &timeout,
993 bool control_only) {
995 LLDB_LOG(log, "timeout = {0}, event_sp)...", timeout);
996
997 if (control_only)
998 return m_private_state_listener_sp->GetEventForBroadcaster(
999 &m_private_state_control_broadcaster, event_sp, timeout);
1000 else
1001 return m_private_state_listener_sp->GetEvent(event_sp, timeout);
1002}
1003
1005 return StateIsRunningState(m_public_state.GetValue());
1006}
1007
1009 std::lock_guard<std::mutex> guard(m_exit_status_mutex);
1010
1011 if (m_public_state.GetValue() == eStateExited)
1012 return m_exit_status;
1013 return -1;
1014}
1015
1017 std::lock_guard<std::mutex> guard(m_exit_status_mutex);
1018
1019 if (m_public_state.GetValue() == eStateExited && !m_exit_string.empty())
1020 return m_exit_string.c_str();
1021 return nullptr;
1022}
1023
1024bool Process::SetExitStatus(int status, llvm::StringRef exit_string) {
1025 // Use a mutex to protect setting the exit status.
1026 std::lock_guard<std::mutex> guard(m_exit_status_mutex);
1028 LLDB_LOG(log, "(plugin = {0} status = {1} ({1:x8}), description=\"{2}\")",
1029 GetPluginName(), status, exit_string);
1030
1031 // We were already in the exited state
1032 if (m_private_state.GetValue() == eStateExited) {
1033 LLDB_LOG(
1034 log,
1035 "(plugin = {0}) ignoring exit status because state was already set "
1036 "to eStateExited",
1037 GetPluginName());
1038 return false;
1039 }
1040
1042
1043 UUID module_uuid;
1044 // Need this check because the pointer may not be valid at this point.
1045 if (TargetSP target_sp = m_target_wp.lock()) {
1046 helper.SetDebugger(&target_sp->GetDebugger());
1047 if (ModuleSP mod = target_sp->GetExecutableModule())
1048 module_uuid = mod->GetUUID();
1049 }
1050
1051 helper.DispatchNow([&](telemetry::ProcessExitInfo *info) {
1052 info->module_uuid = module_uuid;
1053 info->pid = m_pid;
1054 info->is_start_entry = true;
1055 info->exit_desc = {status, exit_string.str()};
1056 });
1057
1058 helper.DispatchOnExit(
1059 [module_uuid, pid = m_pid](telemetry::ProcessExitInfo *info) {
1060 info->module_uuid = module_uuid;
1061 info->pid = pid;
1062 });
1063
1064 m_exit_status = status;
1065 if (!exit_string.empty())
1066 m_exit_string = exit_string.str();
1067 else
1068 m_exit_string.clear();
1069
1070 // Clear the last natural stop ID since it has a strong reference to this
1071 // process
1072 m_mod_id.SetStopEventForLastNaturalStopID(EventSP());
1073
1075
1076 // Allow subclasses to do some cleanup
1077 DidExit();
1078
1079 return true;
1080}
1081
1083 switch (m_private_state.GetValue()) {
1084 case eStateConnected:
1085 case eStateAttaching:
1086 case eStateLaunching:
1087 case eStateStopped:
1088 case eStateRunning:
1089 case eStateStepping:
1090 case eStateCrashed:
1091 case eStateSuspended:
1092 return true;
1093 default:
1094 return false;
1095 }
1096}
1097
1098// This static callback can be used to watch for local child processes on the
1099// current host. The child process exits, the process will be found in the
1100// global target list (we want to be completely sure that the
1101// lldb_private::Process doesn't go away before we can deliver the signal.
1103 lldb::pid_t pid, bool exited,
1104 int signo, // Zero for no signal
1105 int exit_status // Exit value of process if signal is zero
1106 ) {
1107 Log *log = GetLog(LLDBLog::Process);
1108 LLDB_LOGF(log,
1109 "Process::SetProcessExitStatus (pid=%" PRIu64
1110 ", exited=%i, signal=%i, exit_status=%i)\n",
1111 pid, exited, signo, exit_status);
1112
1113 if (exited) {
1115 if (target_sp) {
1116 ProcessSP process_sp(target_sp->GetProcessSP());
1117 if (process_sp) {
1118 llvm::StringRef signal_str =
1119 process_sp->GetUnixSignals()->GetSignalAsStringRef(signo);
1120 process_sp->SetExitStatus(exit_status, signal_str);
1121 }
1122 }
1123 return true;
1124 }
1125 return false;
1126}
1127
1129 ThreadList &new_thread_list) {
1130 m_thread_plans.ClearThreadCache();
1131 return DoUpdateThreadList(old_thread_list, new_thread_list);
1132}
1133
1135 const uint32_t stop_id = GetStopID();
1136 if (m_thread_list.GetSize(false) == 0 ||
1137 stop_id != m_thread_list.GetStopID()) {
1138 bool clear_unused_threads = true;
1139 const StateType state = GetPrivateState();
1140 if (StateIsStoppedState(state, true)) {
1141 std::lock_guard<std::recursive_mutex> guard(m_thread_list.GetMutex());
1142 m_thread_list.SetStopID(stop_id);
1143
1144 // m_thread_list does have its own mutex, but we need to hold onto the
1145 // mutex between the call to UpdateThreadList(...) and the
1146 // os->UpdateThreadList(...) so it doesn't change on us
1147 ThreadList &old_thread_list = m_thread_list;
1148 ThreadList real_thread_list(*this);
1149 ThreadList new_thread_list(*this);
1150 // Always update the thread list with the protocol specific thread list,
1151 // but only update if "true" is returned
1152 if (UpdateThreadList(m_thread_list_real, real_thread_list)) {
1153 // Don't call into the OperatingSystem to update the thread list if we
1154 // are shutting down, since that may call back into the SBAPI's,
1155 // requiring the API lock which is already held by whoever is shutting
1156 // us down, causing a deadlock.
1158 if (os && !m_destroy_in_process) {
1159 // Clear any old backing threads where memory threads might have been
1160 // backed by actual threads from the lldb_private::Process subclass
1161 size_t num_old_threads = old_thread_list.GetSize(false);
1162 for (size_t i = 0; i < num_old_threads; ++i)
1163 old_thread_list.GetThreadAtIndex(i, false)->ClearBackingThread();
1164 // See if the OS plugin reports all threads. If it does, then
1165 // it is safe to clear unseen thread's plans here. Otherwise we
1166 // should preserve them in case they show up again:
1167 clear_unused_threads = os->DoesPluginReportAllThreads();
1168
1169 // Turn off dynamic types to ensure we don't run any expressions.
1170 // Objective-C can run an expression to determine if a SBValue is a
1171 // dynamic type or not and we need to avoid this. OperatingSystem
1172 // plug-ins can't run expressions that require running code...
1173
1174 Target &target = GetTarget();
1175 const lldb::DynamicValueType saved_prefer_dynamic =
1176 target.GetPreferDynamicValue();
1177 if (saved_prefer_dynamic != lldb::eNoDynamicValues)
1179
1180 // Now let the OperatingSystem plug-in update the thread list
1181
1182 os->UpdateThreadList(
1183 old_thread_list, // Old list full of threads created by OS plug-in
1184 real_thread_list, // The actual thread list full of threads
1185 // created by each lldb_private::Process
1186 // subclass
1187 new_thread_list); // The new thread list that we will show to the
1188 // user that gets filled in
1189
1190 if (saved_prefer_dynamic != lldb::eNoDynamicValues)
1191 target.SetPreferDynamicValue(saved_prefer_dynamic);
1192 } else {
1193 // No OS plug-in, the new thread list is the same as the real thread
1194 // list.
1195 new_thread_list = real_thread_list;
1196 }
1197
1198 m_thread_list_real.Update(real_thread_list);
1199 m_thread_list.Update(new_thread_list);
1200 m_thread_list.SetStopID(stop_id);
1201
1203 // Clear any extended threads that we may have accumulated previously
1204 m_extended_thread_list.Clear();
1206
1207 m_queue_list.Clear();
1209 }
1210 }
1211 // Now update the plan stack map.
1212 // If we do have an OS plugin, any absent real threads in the
1213 // m_thread_list have already been removed from the ThreadPlanStackMap.
1214 // So any remaining threads are OS Plugin threads, and those we want to
1215 // preserve in case they show up again.
1216 m_thread_plans.Update(m_thread_list, clear_unused_threads);
1217 }
1218 }
1219}
1220
1224
1226 return m_thread_plans.PrunePlansForTID(tid);
1227}
1228
1230 m_thread_plans.Update(GetThreadList(), true, false);
1231}
1232
1234 lldb::DescriptionLevel desc_level,
1235 bool internal, bool condense_trivial,
1236 bool skip_unreported_plans) {
1237 return m_thread_plans.DumpPlansForTID(
1238 strm, tid, desc_level, internal, condense_trivial, skip_unreported_plans);
1239}
1241 bool internal, bool condense_trivial,
1242 bool skip_unreported_plans) {
1243 m_thread_plans.DumpPlans(strm, desc_level, internal, condense_trivial,
1244 skip_unreported_plans);
1245}
1246
1248 if (m_system_runtime_up) {
1249 if (m_queue_list.GetSize() == 0 ||
1251 const StateType state = GetPrivateState();
1252 if (StateIsStoppedState(state, true)) {
1253 m_system_runtime_up->PopulateQueueList(m_queue_list);
1255 }
1256 }
1257 }
1258}
1259
1262 if (os)
1263 return os->CreateThread(tid, context);
1264 return ThreadSP();
1265}
1266
1267uint32_t Process::GetNextThreadIndexID(uint64_t thread_id) {
1268 return AssignIndexIDToThread(thread_id);
1269}
1270
1271bool Process::HasAssignedIndexIDToThread(uint64_t thread_id) {
1272 return (m_thread_id_to_index_id_map.find(thread_id) !=
1274}
1275
1276uint32_t Process::AssignIndexIDToThread(uint64_t thread_id) {
1277 auto [iterator, inserted] =
1278 m_thread_id_to_index_id_map.try_emplace(thread_id, m_thread_index_id + 1);
1279 if (inserted)
1281
1282 return iterator->second;
1283}
1284
1287 return m_private_state.GetValue();
1288 else
1289 return m_public_state.GetValue();
1290}
1291
1292void Process::SetPublicState(StateType new_state, bool restarted) {
1293 const bool new_state_is_stopped = StateIsStoppedState(new_state, false);
1294 if (new_state_is_stopped) {
1295 // This will only set the time if the public stop time has no value, so
1296 // it is ok to call this multiple times. With a public stop we can't look
1297 // at the stop ID because many private stops might have happened, so we
1298 // can't check for a stop ID of zero. This allows the "statistics" command
1299 // to dump the time it takes to reach somewhere in your code, like a
1300 // breakpoint you set.
1302 }
1303
1305 LLDB_LOGF(log, "(plugin = %s, state = %s, restarted = %i)",
1306 GetPluginName().data(), StateAsCString(new_state), restarted);
1307 const StateType old_state = m_public_state.GetValue();
1308 m_public_state.SetValue(new_state);
1309
1310 // On the transition from Run to Stopped, we unlock the writer end of the run
1311 // lock. The lock gets locked in Resume, which is the public API to tell the
1312 // program to run.
1314 if (new_state == eStateDetached) {
1315 LLDB_LOGF(log,
1316 "(plugin = %s, state = %s) -- unlocking run lock for detach",
1317 GetPluginName().data(), StateAsCString(new_state));
1318 m_public_run_lock.SetStopped();
1319 } else {
1320 const bool old_state_is_stopped = StateIsStoppedState(old_state, false);
1321 if ((old_state_is_stopped != new_state_is_stopped)) {
1322 if (new_state_is_stopped && !restarted) {
1323 LLDB_LOGF(log, "(plugin = %s, state = %s) -- unlocking run lock",
1324 GetPluginName().data(), StateAsCString(new_state));
1325 m_public_run_lock.SetStopped();
1326 }
1327 }
1328 }
1329 }
1330}
1331
1334 LLDB_LOGF(log, "(plugin = %s) -- locking run lock", GetPluginName().data());
1335 if (!m_public_run_lock.SetRunning()) {
1336 LLDB_LOGF(log, "(plugin = %s) -- SetRunning failed, not resuming.",
1337 GetPluginName().data());
1339 "resume request failed - process already running");
1340 }
1342 if (!error.Success()) {
1343 // Undo running state change
1344 m_public_run_lock.SetStopped();
1345 }
1346 return error;
1347}
1348
1351 LLDB_LOGF(log, "Process::ResumeSynchronous -- locking run lock");
1352 if (!m_public_run_lock.SetRunning()) {
1353 LLDB_LOGF(log, "Process::Resume: -- SetRunning failed, not resuming.");
1355 "resume request failed: process already running");
1356 }
1357
1358 ListenerSP listener_sp(
1360 HijackProcessEvents(listener_sp);
1361
1363 if (error.Success()) {
1364 StateType state =
1365 WaitForProcessToStop(std::nullopt, nullptr, true, listener_sp, stream,
1366 true /* use_run_lock */, SelectMostRelevantFrame);
1367 const bool must_be_alive =
1368 false; // eStateExited is ok, so this must be false
1369 if (!StateIsStoppedState(state, must_be_alive))
1371 "process not in stopped state after synchronous resume: %s",
1372 StateAsCString(state));
1373 } else {
1374 // Undo running state change
1375 m_public_run_lock.SetStopped();
1376 }
1377
1378 // Undo the hijacking of process events...
1380
1381 return error;
1382}
1383
1386 llvm::StringRef hijacking_name = GetHijackingListenerName();
1387 if (!hijacking_name.starts_with("lldb.internal"))
1388 return true;
1389 }
1390 return false;
1391}
1392
1395 llvm::StringRef hijacking_name = GetHijackingListenerName();
1396 if (hijacking_name == ResumeSynchronousHijackListenerName)
1397 return true;
1398 }
1399 return false;
1400}
1401
1403
1405 // Use m_destructing not m_finalizing here. If we are finalizing a process
1406 // that we haven't started tearing down, we'd like to be able to nicely
1407 // detach if asked, but that requires the event system be live. That will
1408 // not be true for an in-the-middle-of-being-destructed Process, since the
1409 // event system relies on Process::shared_from_this, which may have already
1410 // been destroyed.
1411 if (m_destructing)
1412 return;
1413
1415 bool state_changed = false;
1416
1417 LLDB_LOGF(log, "(plugin = %s, state = %s)", GetPluginName().data(),
1418 StateAsCString(new_state));
1419
1420 std::lock_guard<std::recursive_mutex> thread_guard(m_thread_list.GetMutex());
1421 std::lock_guard<std::recursive_mutex> guard(m_private_state.GetMutex());
1422
1423 const StateType old_state = m_private_state.GetValueNoLock();
1424 state_changed = old_state != new_state;
1425
1426 const bool old_state_is_stopped = StateIsStoppedState(old_state, false);
1427 const bool new_state_is_stopped = StateIsStoppedState(new_state, false);
1428 if (old_state_is_stopped != new_state_is_stopped) {
1429 if (new_state_is_stopped)
1430 m_private_run_lock.SetStopped();
1431 else
1432 m_private_run_lock.SetRunning();
1433 }
1434
1435 if (state_changed) {
1436 m_private_state.SetValueNoLock(new_state);
1437 EventSP event_sp(
1439 new ProcessEventData(shared_from_this(), new_state)));
1440 if (StateIsStoppedState(new_state, false)) {
1441 // Note, this currently assumes that all threads in the list stop when
1442 // the process stops. In the future we will want to support a debugging
1443 // model where some threads continue to run while others are stopped.
1444 // When that happens we will either need a way for the thread list to
1445 // identify which threads are stopping or create a special thread list
1446 // containing only threads which actually stopped.
1447 //
1448 // The process plugin is responsible for managing the actual behavior of
1449 // the threads and should have stopped any threads that are going to stop
1450 // before we get here.
1451 m_thread_list.DidStop();
1452
1453 if (m_mod_id.BumpStopID() == 0)
1455
1456 if (!m_mod_id.IsLastResumeForUserExpression())
1457 m_mod_id.SetStopEventForLastNaturalStopID(event_sp);
1458 m_memory_cache.Clear();
1459 LLDB_LOGF(log, "(plugin = %s, state = %s, stop_id = %u",
1460 GetPluginName().data(), StateAsCString(new_state),
1461 m_mod_id.GetStopID());
1462 }
1463
1464 m_private_state_broadcaster.BroadcastEvent(event_sp);
1465 } else {
1466 LLDB_LOGF(log, "(plugin = %s, state = %s) state didn't change. Ignoring...",
1467 GetPluginName().data(), StateAsCString(new_state));
1468 }
1469}
1470
1472 m_mod_id.SetRunningUserExpression(on);
1473}
1474
1476 m_mod_id.SetRunningUtilityFunction(on);
1477}
1478
1480
1482 if (!m_abi_sp)
1483 m_abi_sp = ABI::FindPlugin(shared_from_this(), GetTarget().GetArchitecture());
1484 return m_abi_sp;
1485}
1486
1487std::vector<LanguageRuntime *> Process::GetLanguageRuntimes() {
1488 std::vector<LanguageRuntime *> language_runtimes;
1489
1490 if (m_finalizing)
1491 return language_runtimes;
1492
1493 std::lock_guard<std::recursive_mutex> guard(m_language_runtimes_mutex);
1494 // Before we pass off a copy of the language runtimes, we must make sure that
1495 // our collection is properly populated. It's possible that some of the
1496 // language runtimes were not loaded yet, either because nobody requested it
1497 // yet or the proper condition for loading wasn't yet met (e.g. libc++.so
1498 // hadn't been loaded).
1499 for (const lldb::LanguageType lang_type : Language::GetSupportedLanguages()) {
1500 if (LanguageRuntime *runtime = GetLanguageRuntime(lang_type))
1501 language_runtimes.emplace_back(runtime);
1502 }
1503
1504 return language_runtimes;
1505}
1506
1508 if (m_finalizing)
1509 return nullptr;
1510
1511 LanguageRuntime *runtime = nullptr;
1512
1513 std::lock_guard<std::recursive_mutex> guard(m_language_runtimes_mutex);
1514 LanguageRuntimeCollection::iterator pos;
1515 pos = m_language_runtimes.find(language);
1516 if (pos == m_language_runtimes.end() || !pos->second) {
1517 lldb::LanguageRuntimeSP runtime_sp(
1518 LanguageRuntime::FindPlugin(this, language));
1519
1520 m_language_runtimes[language] = runtime_sp;
1521 runtime = runtime_sp.get();
1522 } else
1523 runtime = pos->second.get();
1524
1525 if (runtime)
1526 // It's possible that a language runtime can support multiple LanguageTypes,
1527 // for example, CPPLanguageRuntime will support eLanguageTypeC_plus_plus,
1528 // eLanguageTypeC_plus_plus_03, etc. Because of this, we should get the
1529 // primary language type and make sure that our runtime supports it.
1530 assert(runtime->GetLanguageType() == Language::GetPrimaryLanguage(language));
1531
1532 return runtime;
1533}
1534
1536 if (m_finalizing)
1537 return false;
1538
1539 if (in_value.IsDynamic())
1540 return false;
1541 LanguageType known_type = in_value.GetObjectRuntimeLanguage();
1542
1543 if (known_type != eLanguageTypeUnknown && known_type != eLanguageTypeC) {
1544 LanguageRuntime *runtime = GetLanguageRuntime(known_type);
1545 return runtime ? runtime->CouldHaveDynamicValue(in_value) : false;
1546 }
1547
1548 for (LanguageRuntime *runtime : GetLanguageRuntimes()) {
1549 if (runtime->CouldHaveDynamicValue(in_value))
1550 return true;
1551 }
1552
1553 return false;
1554}
1555
1557 m_dynamic_checkers_up.reset(dynamic_checkers);
1558}
1559
1563
1568
1570 m_breakpoint_site_list.ForEach([this](BreakpointSite *bp_site) -> void {
1571 // bp_site->SetEnabled(true);
1572 DisableBreakpointSite(bp_site);
1573 });
1574}
1575
1578
1579 if (error.Success())
1580 m_breakpoint_site_list.Remove(break_id);
1581
1582 return error;
1583}
1584
1586 Status error;
1587 BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID(break_id);
1588 if (bp_site_sp) {
1589 if (bp_site_sp->IsEnabled())
1590 error = DisableBreakpointSite(bp_site_sp.get());
1591 } else {
1593 "invalid breakpoint site ID: %" PRIu64, break_id);
1594 }
1595
1596 return error;
1597}
1598
1600 Status error;
1601 BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID(break_id);
1602 if (bp_site_sp) {
1603 if (!bp_site_sp->IsEnabled())
1604 error = EnableBreakpointSite(bp_site_sp.get());
1605 } else {
1607 "invalid breakpoint site ID: %" PRIu64, break_id);
1608 }
1609 return error;
1610}
1611
1614 bool use_hardware) {
1615 addr_t load_addr = LLDB_INVALID_ADDRESS;
1616
1617 bool show_error = true;
1618 switch (GetState()) {
1619 case eStateInvalid:
1620 case eStateUnloaded:
1621 case eStateConnected:
1622 case eStateAttaching:
1623 case eStateLaunching:
1624 case eStateDetached:
1625 case eStateExited:
1626 show_error = false;
1627 break;
1628
1629 case eStateStopped:
1630 case eStateRunning:
1631 case eStateStepping:
1632 case eStateCrashed:
1633 case eStateSuspended:
1634 show_error = IsAlive();
1635 break;
1636 }
1637
1638 // Reset the IsIndirect flag here, in case the location changes from pointing
1639 // to a indirect symbol to a regular symbol.
1640 constituent->SetIsIndirect(false);
1641
1642 if (constituent->ShouldResolveIndirectFunctions()) {
1643 Symbol *symbol = constituent->GetAddress().CalculateSymbolContextSymbol();
1644 if (symbol && symbol->IsIndirect()) {
1645 Status error;
1646 Address symbol_address = symbol->GetAddress();
1647 load_addr = ResolveIndirectFunction(&symbol_address, error);
1648 if (!error.Success() && show_error) {
1650 "warning: failed to resolve indirect function at 0x%" PRIx64
1651 " for breakpoint %i.%i: %s\n",
1652 symbol->GetLoadAddress(&GetTarget()),
1653 constituent->GetBreakpoint().GetID(), constituent->GetID(),
1654 error.AsCString() ? error.AsCString() : "unknown error");
1655 return LLDB_INVALID_BREAK_ID;
1656 }
1657 Address resolved_address(load_addr);
1658 load_addr = resolved_address.GetOpcodeLoadAddress(&GetTarget());
1659 constituent->SetIsIndirect(true);
1660 } else
1661 load_addr = constituent->GetAddress().GetOpcodeLoadAddress(&GetTarget());
1662 } else
1663 load_addr = constituent->GetAddress().GetOpcodeLoadAddress(&GetTarget());
1664
1665 if (load_addr != LLDB_INVALID_ADDRESS) {
1666 BreakpointSiteSP bp_site_sp;
1667
1668 // Look up this breakpoint site. If it exists, then add this new
1669 // constituent, otherwise create a new breakpoint site and add it.
1670
1671 bp_site_sp = m_breakpoint_site_list.FindByAddress(load_addr);
1672
1673 if (bp_site_sp) {
1674 bp_site_sp->AddConstituent(constituent);
1675 constituent->SetBreakpointSite(bp_site_sp);
1676 return bp_site_sp->GetID();
1677 } else {
1678 bp_site_sp.reset(
1679 new BreakpointSite(constituent, load_addr, use_hardware));
1680 if (bp_site_sp) {
1681 Status error = EnableBreakpointSite(bp_site_sp.get());
1682 if (error.Success()) {
1683 constituent->SetBreakpointSite(bp_site_sp);
1684 return m_breakpoint_site_list.Add(bp_site_sp);
1685 } else {
1686 if (show_error || use_hardware) {
1687 // Report error for setting breakpoint...
1689 "warning: failed to set breakpoint site at 0x%" PRIx64
1690 " for breakpoint %i.%i: %s\n",
1691 load_addr, constituent->GetBreakpoint().GetID(),
1692 constituent->GetID(),
1693 error.AsCString() ? error.AsCString() : "unknown error");
1694 }
1695 }
1696 }
1697 }
1698 }
1699 // We failed to enable the breakpoint
1700 return LLDB_INVALID_BREAK_ID;
1701}
1702
1704 lldb::user_id_t constituent_id, lldb::user_id_t constituent_loc_id,
1705 BreakpointSiteSP &bp_site_sp) {
1706 uint32_t num_constituents =
1707 bp_site_sp->RemoveConstituent(constituent_id, constituent_loc_id);
1708 if (num_constituents == 0) {
1709 // Don't try to disable the site if we don't have a live process anymore.
1710 if (IsAlive())
1711 DisableBreakpointSite(bp_site_sp.get());
1712 m_breakpoint_site_list.RemoveByAddress(bp_site_sp->GetLoadAddress());
1713 }
1714}
1715
1717 uint8_t *buf) const {
1718 size_t bytes_removed = 0;
1719 StopPointSiteList<BreakpointSite> bp_sites_in_range;
1720
1721 if (m_breakpoint_site_list.FindInRange(bp_addr, bp_addr + size,
1722 bp_sites_in_range)) {
1723 bp_sites_in_range.ForEach([bp_addr, size,
1724 buf](BreakpointSite *bp_site) -> void {
1725 if (bp_site->GetType() == BreakpointSite::eSoftware) {
1726 addr_t intersect_addr;
1727 size_t intersect_size;
1728 size_t opcode_offset;
1729 if (bp_site->IntersectsRange(bp_addr, size, &intersect_addr,
1730 &intersect_size, &opcode_offset)) {
1731 assert(bp_addr <= intersect_addr && intersect_addr < bp_addr + size);
1732 assert(bp_addr < intersect_addr + intersect_size &&
1733 intersect_addr + intersect_size <= bp_addr + size);
1734 assert(opcode_offset + intersect_size <= bp_site->GetByteSize());
1735 size_t buf_offset = intersect_addr - bp_addr;
1736 ::memcpy(buf + buf_offset,
1737 bp_site->GetSavedOpcodeBytes() + opcode_offset,
1738 intersect_size);
1739 }
1740 }
1741 });
1742 }
1743 return bytes_removed;
1744}
1745
1747 PlatformSP platform_sp(GetTarget().GetPlatform());
1748 if (platform_sp)
1749 return platform_sp->GetSoftwareBreakpointTrapOpcode(GetTarget(), bp_site);
1750 return 0;
1751}
1752
1754 Status error;
1755 assert(bp_site != nullptr);
1757 const addr_t bp_addr = bp_site->GetLoadAddress();
1758 LLDB_LOGF(
1759 log, "Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64,
1760 bp_site->GetID(), (uint64_t)bp_addr);
1761 if (bp_site->IsEnabled()) {
1762 LLDB_LOGF(
1763 log,
1764 "Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64
1765 " -- already enabled",
1766 bp_site->GetID(), (uint64_t)bp_addr);
1767 return error;
1768 }
1769
1770 if (bp_addr == LLDB_INVALID_ADDRESS) {
1772 "BreakpointSite contains an invalid load address.");
1773 return error;
1774 }
1775 // Ask the lldb::Process subclass to fill in the correct software breakpoint
1776 // trap for the breakpoint site
1777 const size_t bp_opcode_size = GetSoftwareBreakpointTrapOpcode(bp_site);
1778
1779 if (bp_opcode_size == 0) {
1781 "Process::GetSoftwareBreakpointTrapOpcode() "
1782 "returned zero, unable to get breakpoint "
1783 "trap for address 0x%" PRIx64,
1784 bp_addr);
1785 } else {
1786 const uint8_t *const bp_opcode_bytes = bp_site->GetTrapOpcodeBytes();
1787
1788 if (bp_opcode_bytes == nullptr) {
1790 "BreakpointSite doesn't contain a valid breakpoint trap opcode.");
1791 return error;
1792 }
1793
1794 // Save the original opcode by reading it
1795 if (DoReadMemory(bp_addr, bp_site->GetSavedOpcodeBytes(), bp_opcode_size,
1796 error) == bp_opcode_size) {
1797 // Write a software breakpoint in place of the original opcode
1798 if (DoWriteMemory(bp_addr, bp_opcode_bytes, bp_opcode_size, error) ==
1799 bp_opcode_size) {
1800 uint8_t verify_bp_opcode_bytes[64];
1801 if (DoReadMemory(bp_addr, verify_bp_opcode_bytes, bp_opcode_size,
1802 error) == bp_opcode_size) {
1803 if (::memcmp(bp_opcode_bytes, verify_bp_opcode_bytes,
1804 bp_opcode_size) == 0) {
1805 bp_site->SetEnabled(true);
1807 LLDB_LOGF(log,
1808 "Process::EnableSoftwareBreakpoint (site_id = %d) "
1809 "addr = 0x%" PRIx64 " -- SUCCESS",
1810 bp_site->GetID(), (uint64_t)bp_addr);
1811 } else
1813 "failed to verify the breakpoint trap in memory.");
1814 } else
1816 "Unable to read memory to verify breakpoint trap.");
1817 } else
1819 "Unable to write breakpoint trap to memory.");
1820 } else
1822 "Unable to read memory at breakpoint address.");
1823 }
1824 if (log && error.Fail())
1825 LLDB_LOGF(
1826 log,
1827 "Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64
1828 " -- FAILED: %s",
1829 bp_site->GetID(), (uint64_t)bp_addr, error.AsCString());
1830 return error;
1831}
1832
1834 Status error;
1835 assert(bp_site != nullptr);
1837 addr_t bp_addr = bp_site->GetLoadAddress();
1838 lldb::user_id_t breakID = bp_site->GetID();
1839 LLDB_LOGF(log,
1840 "Process::DisableSoftwareBreakpoint (breakID = %" PRIu64
1841 ") addr = 0x%" PRIx64,
1842 breakID, (uint64_t)bp_addr);
1843
1844 if (bp_site->IsHardware()) {
1845 error =
1846 Status::FromErrorString("Breakpoint site is a hardware breakpoint.");
1847 } else if (bp_site->IsEnabled()) {
1848 const size_t break_op_size = bp_site->GetByteSize();
1849 const uint8_t *const break_op = bp_site->GetTrapOpcodeBytes();
1850 if (break_op_size > 0) {
1851 // Clear a software breakpoint instruction
1852 uint8_t curr_break_op[8];
1853 assert(break_op_size <= sizeof(curr_break_op));
1854 bool break_op_found = false;
1855
1856 // Read the breakpoint opcode
1857 if (DoReadMemory(bp_addr, curr_break_op, break_op_size, error) ==
1858 break_op_size) {
1859 bool verify = false;
1860 // Make sure the breakpoint opcode exists at this address
1861 if (::memcmp(curr_break_op, break_op, break_op_size) == 0) {
1862 break_op_found = true;
1863 // We found a valid breakpoint opcode at this address, now restore
1864 // the saved opcode.
1865 if (DoWriteMemory(bp_addr, bp_site->GetSavedOpcodeBytes(),
1866 break_op_size, error) == break_op_size) {
1867 verify = true;
1868 } else
1870 "Memory write failed when restoring original opcode.");
1871 } else {
1873 "Original breakpoint trap is no longer in memory.");
1874 // Set verify to true and so we can check if the original opcode has
1875 // already been restored
1876 verify = true;
1877 }
1878
1879 if (verify) {
1880 uint8_t verify_opcode[8];
1881 assert(break_op_size < sizeof(verify_opcode));
1882 // Verify that our original opcode made it back to the inferior
1883 if (DoReadMemory(bp_addr, verify_opcode, break_op_size, error) ==
1884 break_op_size) {
1885 // compare the memory we just read with the original opcode
1886 if (::memcmp(bp_site->GetSavedOpcodeBytes(), verify_opcode,
1887 break_op_size) == 0) {
1888 // SUCCESS
1889 bp_site->SetEnabled(false);
1890 LLDB_LOGF(log,
1891 "Process::DisableSoftwareBreakpoint (site_id = %d) "
1892 "addr = 0x%" PRIx64 " -- SUCCESS",
1893 bp_site->GetID(), (uint64_t)bp_addr);
1894 return error;
1895 } else {
1896 if (break_op_found)
1898 "Failed to restore original opcode.");
1899 }
1900 } else
1901 error =
1902 Status::FromErrorString("Failed to read memory to verify that "
1903 "breakpoint trap was restored.");
1904 }
1905 } else
1907 "Unable to read memory that should contain the breakpoint trap.");
1908 }
1909 } else {
1910 LLDB_LOGF(
1911 log,
1912 "Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64
1913 " -- already disabled",
1914 bp_site->GetID(), (uint64_t)bp_addr);
1915 return error;
1916 }
1917
1918 LLDB_LOGF(
1919 log,
1920 "Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64
1921 " -- FAILED: %s",
1922 bp_site->GetID(), (uint64_t)bp_addr, error.AsCString());
1923 return error;
1924}
1925
1926// Uncomment to verify memory caching works after making changes to caching
1927// code
1928//#define VERIFY_MEMORY_READS
1929
1930size_t Process::ReadMemory(addr_t addr, void *buf, size_t size, Status &error) {
1931 if (ABISP abi_sp = GetABI())
1932 addr = abi_sp->FixAnyAddress(addr);
1933
1934 error.Clear();
1935 if (!GetDisableMemoryCache()) {
1936#if defined(VERIFY_MEMORY_READS)
1937 // Memory caching is enabled, with debug verification
1938
1939 if (buf && size) {
1940 // Uncomment the line below to make sure memory caching is working.
1941 // I ran this through the test suite and got no assertions, so I am
1942 // pretty confident this is working well. If any changes are made to
1943 // memory caching, uncomment the line below and test your changes!
1944
1945 // Verify all memory reads by using the cache first, then redundantly
1946 // reading the same memory from the inferior and comparing to make sure
1947 // everything is exactly the same.
1948 std::string verify_buf(size, '\0');
1949 assert(verify_buf.size() == size);
1950 const size_t cache_bytes_read =
1951 m_memory_cache.Read(this, addr, buf, size, error);
1952 Status verify_error;
1953 const size_t verify_bytes_read =
1954 ReadMemoryFromInferior(addr, const_cast<char *>(verify_buf.data()),
1955 verify_buf.size(), verify_error);
1956 assert(cache_bytes_read == verify_bytes_read);
1957 assert(memcmp(buf, verify_buf.data(), verify_buf.size()) == 0);
1958 assert(verify_error.Success() == error.Success());
1959 return cache_bytes_read;
1960 }
1961 return 0;
1962#else // !defined(VERIFY_MEMORY_READS)
1963 // Memory caching is enabled, without debug verification
1964
1965 return m_memory_cache.Read(addr, buf, size, error);
1966#endif // defined (VERIFY_MEMORY_READS)
1967 } else {
1968 // Memory caching is disabled
1969
1970 return ReadMemoryFromInferior(addr, buf, size, error);
1971 }
1972}
1973
1974llvm::SmallVector<llvm::MutableArrayRef<uint8_t>>
1976 llvm::MutableArrayRef<uint8_t> buffer) {
1977 auto total_ranges_len = llvm::sum_of(
1978 llvm::map_range(ranges, [](auto range) { return range.size; }));
1979 // If the buffer is not large enough, this is a programmer error.
1980 // In production builds, gracefully fail by returning a length of 0 for all
1981 // ranges.
1982 assert(buffer.size() >= total_ranges_len && "provided buffer is too short");
1983 if (buffer.size() < total_ranges_len) {
1984 llvm::MutableArrayRef<uint8_t> empty;
1985 return {ranges.size(), empty};
1986 }
1987
1988 llvm::SmallVector<llvm::MutableArrayRef<uint8_t>> results;
1989
1990 // While `buffer` has space, take the next requested range and read
1991 // memory into a `buffer` piece, then slice it to remove the used memory.
1992 for (auto [addr, range_len] : ranges) {
1993 Status status;
1994 size_t num_bytes_read =
1995 ReadMemoryFromInferior(addr, buffer.data(), range_len, status);
1996 // FIXME: ReadMemoryFromInferior promises to return 0 in case of errors, but
1997 // it doesn't; it never checks for errors.
1998 if (status.Fail())
1999 num_bytes_read = 0;
2000
2001 assert(num_bytes_read <= range_len && "read more than requested bytes");
2002 if (num_bytes_read > range_len) {
2003 // In production builds, gracefully fail by returning length zero for this
2004 // range.
2005 results.emplace_back();
2006 continue;
2007 }
2008
2009 results.push_back(buffer.take_front(num_bytes_read));
2010 // Slice buffer to remove the used memory.
2011 buffer = buffer.drop_front(num_bytes_read);
2012 }
2013
2014 return results;
2015}
2016
2018 const uint8_t *buf, size_t size,
2019 AddressRanges &matches, size_t alignment,
2020 size_t max_matches) {
2021 // Inputs are already validated in FindInMemory() functions.
2022 assert(buf != nullptr);
2023 assert(size > 0);
2024 assert(alignment > 0);
2025 assert(max_matches > 0);
2026 assert(start_addr != LLDB_INVALID_ADDRESS);
2027 assert(end_addr != LLDB_INVALID_ADDRESS);
2028 assert(start_addr < end_addr);
2029
2030 lldb::addr_t start = llvm::alignTo(start_addr, alignment);
2031 while (matches.size() < max_matches && (start + size) < end_addr) {
2032 const lldb::addr_t found_addr = FindInMemory(start, end_addr, buf, size);
2033 if (found_addr == LLDB_INVALID_ADDRESS)
2034 break;
2035
2036 if (found_addr % alignment) {
2037 // We need to check the alignment because the FindInMemory uses a special
2038 // algorithm to efficiently search mememory but doesn't support alignment.
2039 start = llvm::alignTo(start + 1, alignment);
2040 continue;
2041 }
2042
2043 matches.emplace_back(found_addr, size);
2044 start = found_addr + alignment;
2045 }
2046}
2047
2048AddressRanges Process::FindRangesInMemory(const uint8_t *buf, uint64_t size,
2049 const AddressRanges &ranges,
2050 size_t alignment, size_t max_matches,
2051 Status &error) {
2052 AddressRanges matches;
2053 if (buf == nullptr) {
2054 error = Status::FromErrorString("buffer is null");
2055 return matches;
2056 }
2057 if (size == 0) {
2058 error = Status::FromErrorString("buffer size is zero");
2059 return matches;
2060 }
2061 if (ranges.empty()) {
2062 error = Status::FromErrorString("empty ranges");
2063 return matches;
2064 }
2065 if (alignment == 0) {
2066 error = Status::FromErrorString("alignment must be greater than zero");
2067 return matches;
2068 }
2069 if (max_matches == 0) {
2070 error = Status::FromErrorString("max_matches must be greater than zero");
2071 return matches;
2072 }
2073
2074 int resolved_ranges = 0;
2075 Target &target = GetTarget();
2076 for (size_t i = 0; i < ranges.size(); ++i) {
2077 if (matches.size() >= max_matches)
2078 break;
2079 const AddressRange &range = ranges[i];
2080 if (range.IsValid() == false)
2081 continue;
2082
2083 const lldb::addr_t start_addr =
2084 range.GetBaseAddress().GetLoadAddress(&target);
2085 if (start_addr == LLDB_INVALID_ADDRESS)
2086 continue;
2087
2088 ++resolved_ranges;
2089 const lldb::addr_t end_addr = start_addr + range.GetByteSize();
2090 DoFindInMemory(start_addr, end_addr, buf, size, matches, alignment,
2091 max_matches);
2092 }
2093
2094 if (resolved_ranges > 0)
2095 error.Clear();
2096 else
2097 error = Status::FromErrorString("unable to resolve any ranges");
2098
2099 return matches;
2100}
2101
2102lldb::addr_t Process::FindInMemory(const uint8_t *buf, uint64_t size,
2103 const AddressRange &range, size_t alignment,
2104 Status &error) {
2105 if (buf == nullptr) {
2106 error = Status::FromErrorString("buffer is null");
2107 return LLDB_INVALID_ADDRESS;
2108 }
2109 if (size == 0) {
2110 error = Status::FromErrorString("buffer size is zero");
2111 return LLDB_INVALID_ADDRESS;
2112 }
2113 if (!range.IsValid()) {
2114 error = Status::FromErrorString("range is invalid");
2115 return LLDB_INVALID_ADDRESS;
2116 }
2117 if (alignment == 0) {
2118 error = Status::FromErrorString("alignment must be greater than zero");
2119 return LLDB_INVALID_ADDRESS;
2120 }
2121
2122 Target &target = GetTarget();
2123 const lldb::addr_t start_addr =
2124 range.GetBaseAddress().GetLoadAddress(&target);
2125 if (start_addr == LLDB_INVALID_ADDRESS) {
2126 error = Status::FromErrorString("range load address is invalid");
2127 return LLDB_INVALID_ADDRESS;
2128 }
2129 const lldb::addr_t end_addr = start_addr + range.GetByteSize();
2130
2131 AddressRanges matches;
2132 DoFindInMemory(start_addr, end_addr, buf, size, matches, alignment, 1);
2133 if (matches.empty())
2134 return LLDB_INVALID_ADDRESS;
2135
2136 error.Clear();
2137 return matches[0].GetBaseAddress().GetLoadAddress(&target);
2138}
2139
2140llvm::SmallVector<std::optional<std::string>>
2141Process::ReadCStringsFromMemory(llvm::ArrayRef<lldb::addr_t> addresses) {
2142 llvm::SmallVector<std::optional<std::string>> output_strs(addresses.size(),
2143 "");
2144 llvm::SmallVector<Range<addr_t, size_t>> ranges{
2145 llvm::map_range(addresses, [=](addr_t ptr) {
2147 })};
2148
2149 std::vector<uint8_t> buffer(g_string_read_width * addresses.size(), 0);
2150 uint64_t num_completed_strings = 0;
2151
2152 while (num_completed_strings != addresses.size()) {
2153 llvm::SmallVector<llvm::MutableArrayRef<uint8_t>> read_results =
2154 ReadMemoryRanges(ranges, buffer);
2155
2156 // Each iteration of this loop either increments num_completed_strings or
2157 // updates the base pointer of some range, guaranteeing forward progress of
2158 // the outer loop.
2159 for (auto [range, read_result, output_str] :
2160 llvm::zip(ranges, read_results, output_strs)) {
2161 // A previously completed string.
2162 if (range.GetByteSize() == 0)
2163 continue;
2164
2165 // The read failed, set the range to 0 to avoid reading it again.
2166 if (read_result.empty()) {
2167 output_str = std::nullopt;
2168 range.SetByteSize(0);
2169 num_completed_strings++;
2170 continue;
2171 }
2172
2173 // Convert ArrayRef to StringRef so the pointers work with std::string.
2174 auto read_result_str = llvm::toStringRef(read_result);
2175
2176 const char *null_terminator_pos = llvm::find(read_result_str, '\0');
2177 output_str->append(read_result_str.begin(), null_terminator_pos);
2178
2179 // If the terminator was found, this string is complete.
2180 if (null_terminator_pos != read_result_str.end()) {
2181 range.SetByteSize(0);
2182 num_completed_strings++;
2183 }
2184 // Otherwise increment the base pointer for the next read.
2185 else {
2186 range.SetRangeBase(range.GetRangeBase() + read_result.size());
2187 }
2188 }
2189 }
2190
2191 return output_strs;
2192}
2193
2194size_t Process::ReadCStringFromMemory(addr_t addr, std::string &out_str,
2195 Status &error) {
2196 char buf[g_string_read_width];
2197 out_str.clear();
2198 addr_t curr_addr = addr;
2199 while (true) {
2200 size_t length = ReadCStringFromMemory(curr_addr, buf, sizeof(buf), error);
2201 if (length == 0)
2202 break;
2203 out_str.append(buf, length);
2204 // If we got "length - 1" bytes, we didn't get the whole C string, we need
2205 // to read some more characters
2206 if (length == sizeof(buf) - 1)
2207 curr_addr += length;
2208 else
2209 break;
2210 }
2211 return out_str.size();
2212}
2213
2214// Deprecated in favor of ReadStringFromMemory which has wchar support and
2215// correct code to find null terminators.
2217 size_t dst_max_len,
2218 Status &result_error) {
2219 size_t total_cstr_len = 0;
2220 if (dst && dst_max_len) {
2221 result_error.Clear();
2222 // NULL out everything just to be safe
2223 memset(dst, 0, dst_max_len);
2224 addr_t curr_addr = addr;
2225 const size_t cache_line_size = m_memory_cache.GetMemoryCacheLineSize();
2226 size_t bytes_left = dst_max_len - 1;
2227 char *curr_dst = dst;
2228
2229 while (bytes_left > 0) {
2230 addr_t cache_line_bytes_left =
2231 cache_line_size - (curr_addr % cache_line_size);
2232 addr_t bytes_to_read =
2233 std::min<addr_t>(bytes_left, cache_line_bytes_left);
2234 Status error;
2235 size_t bytes_read = ReadMemory(curr_addr, curr_dst, bytes_to_read, error);
2236
2237 if (bytes_read == 0) {
2238 result_error = std::move(error);
2239 dst[total_cstr_len] = '\0';
2240 break;
2241 }
2242 const size_t len = strlen(curr_dst);
2243
2244 total_cstr_len += len;
2245
2246 if (len < bytes_to_read)
2247 break;
2248
2249 curr_dst += bytes_read;
2250 curr_addr += bytes_read;
2251 bytes_left -= bytes_read;
2252 }
2253 } else {
2254 if (dst == nullptr)
2255 result_error = Status::FromErrorString("invalid arguments");
2256 else
2257 result_error.Clear();
2258 }
2259 return total_cstr_len;
2260}
2261
2262size_t Process::ReadMemoryFromInferior(addr_t addr, void *buf, size_t size,
2263 Status &error) {
2265
2266 if (ABISP abi_sp = GetABI())
2267 addr = abi_sp->FixAnyAddress(addr);
2268
2269 if (buf == nullptr || size == 0)
2270 return 0;
2271
2272 size_t bytes_read = 0;
2273 uint8_t *bytes = (uint8_t *)buf;
2274
2275 while (bytes_read < size) {
2276 const size_t curr_size = size - bytes_read;
2277 const size_t curr_bytes_read =
2278 DoReadMemory(addr + bytes_read, bytes + bytes_read, curr_size, error);
2279 bytes_read += curr_bytes_read;
2280 if (curr_bytes_read == curr_size || curr_bytes_read == 0)
2281 break;
2282 }
2283
2284 // Replace any software breakpoint opcodes that fall into this range back
2285 // into "buf" before we return
2286 if (bytes_read > 0)
2287 RemoveBreakpointOpcodesFromBuffer(addr, bytes_read, (uint8_t *)buf);
2288 return bytes_read;
2289}
2290
2292 lldb::addr_t chunk_size,
2293 lldb::offset_t size,
2294 ReadMemoryChunkCallback callback) {
2295 // Safety check to prevent an infinite loop.
2296 if (chunk_size == 0)
2297 return 0;
2298
2299 // Buffer for when a NULL buf is provided, initialized
2300 // to 0 bytes, we set it to chunk_size and then replace buf
2301 // with the new buffer.
2302 DataBufferHeap data_buffer;
2303 if (!buf) {
2304 data_buffer.SetByteSize(chunk_size);
2305 buf = data_buffer.GetBytes();
2306 }
2307
2308 uint64_t bytes_remaining = size;
2309 uint64_t bytes_read = 0;
2310 Status error;
2311 while (bytes_remaining > 0) {
2312 // Get the next read chunk size as the minimum of the remaining bytes and
2313 // the write chunk max size.
2314 const lldb::addr_t bytes_to_read = std::min(bytes_remaining, chunk_size);
2315 const lldb::addr_t current_addr = vm_addr + bytes_read;
2316 const lldb::addr_t bytes_read_for_chunk =
2317 ReadMemoryFromInferior(current_addr, buf, bytes_to_read, error);
2318
2319 bytes_read += bytes_read_for_chunk;
2320 // If the bytes read in this chunk would cause us to overflow, something
2321 // went wrong and we should fail fast.
2322 if (bytes_read_for_chunk > bytes_remaining)
2323 return 0;
2324 else
2325 bytes_remaining -= bytes_read_for_chunk;
2326
2327 if (callback(error, current_addr, buf, bytes_read_for_chunk) ==
2329 break;
2330 }
2331
2332 return bytes_read;
2333}
2334
2336 size_t integer_byte_size,
2337 uint64_t fail_value,
2338 Status &error) {
2339 Scalar scalar;
2340 if (ReadScalarIntegerFromMemory(vm_addr, integer_byte_size, false, scalar,
2341 error))
2342 return scalar.ULongLong(fail_value);
2343 return fail_value;
2344}
2345
2347 size_t integer_byte_size,
2348 int64_t fail_value,
2349 Status &error) {
2350 Scalar scalar;
2351 if (ReadScalarIntegerFromMemory(vm_addr, integer_byte_size, true, scalar,
2352 error))
2353 return scalar.SLongLong(fail_value);
2354 return fail_value;
2355}
2356
2358 Scalar scalar;
2359 if (ReadScalarIntegerFromMemory(vm_addr, GetAddressByteSize(), false, scalar,
2360 error))
2361 return scalar.ULongLong(LLDB_INVALID_ADDRESS);
2362 return LLDB_INVALID_ADDRESS;
2363}
2364
2366 Status &error) {
2367 Scalar scalar;
2368 const uint32_t addr_byte_size = GetAddressByteSize();
2369 if (addr_byte_size <= 4)
2370 scalar = (uint32_t)ptr_value;
2371 else
2372 scalar = ptr_value;
2373 return WriteScalarToMemory(vm_addr, scalar, addr_byte_size, error) ==
2374 addr_byte_size;
2375}
2376
2377size_t Process::WriteMemoryPrivate(addr_t addr, const void *buf, size_t size,
2378 Status &error) {
2379 size_t bytes_written = 0;
2380 const uint8_t *bytes = (const uint8_t *)buf;
2381
2382 while (bytes_written < size) {
2383 const size_t curr_size = size - bytes_written;
2384 const size_t curr_bytes_written = DoWriteMemory(
2385 addr + bytes_written, bytes + bytes_written, curr_size, error);
2386 bytes_written += curr_bytes_written;
2387 if (curr_bytes_written == curr_size || curr_bytes_written == 0)
2388 break;
2389 }
2390 return bytes_written;
2391}
2392
2393size_t Process::WriteMemory(addr_t addr, const void *buf, size_t size,
2394 Status &error) {
2395 if (ABISP abi_sp = GetABI())
2396 addr = abi_sp->FixAnyAddress(addr);
2397
2398 m_memory_cache.Flush(addr, size);
2399
2400 if (buf == nullptr || size == 0)
2401 return 0;
2402
2403 if (TrackMemoryCacheChanges() || !m_allocated_memory_cache.IsInCache(addr))
2404 m_mod_id.BumpMemoryID();
2405
2406 // We need to write any data that would go where any current software traps
2407 // (enabled software breakpoints) any software traps (breakpoints) that we
2408 // may have placed in our tasks memory.
2409
2410 StopPointSiteList<BreakpointSite> bp_sites_in_range;
2411 if (!m_breakpoint_site_list.FindInRange(addr, addr + size, bp_sites_in_range))
2412 return WriteMemoryPrivate(addr, buf, size, error);
2413
2414 // No breakpoint sites overlap
2415 if (bp_sites_in_range.IsEmpty())
2416 return WriteMemoryPrivate(addr, buf, size, error);
2417
2418 const uint8_t *ubuf = (const uint8_t *)buf;
2419 uint64_t bytes_written = 0;
2420
2421 bp_sites_in_range.ForEach([this, addr, size, &bytes_written, &ubuf,
2422 &error](BreakpointSite *bp) -> void {
2423 if (error.Fail())
2424 return;
2425
2427 return;
2428
2429 addr_t intersect_addr;
2430 size_t intersect_size;
2431 size_t opcode_offset;
2432 const bool intersects = bp->IntersectsRange(
2433 addr, size, &intersect_addr, &intersect_size, &opcode_offset);
2434 UNUSED_IF_ASSERT_DISABLED(intersects);
2435 assert(intersects);
2436 assert(addr <= intersect_addr && intersect_addr < addr + size);
2437 assert(addr < intersect_addr + intersect_size &&
2438 intersect_addr + intersect_size <= addr + size);
2439 assert(opcode_offset + intersect_size <= bp->GetByteSize());
2440
2441 // Check for bytes before this breakpoint
2442 const addr_t curr_addr = addr + bytes_written;
2443 if (intersect_addr > curr_addr) {
2444 // There are some bytes before this breakpoint that we need to just
2445 // write to memory
2446 size_t curr_size = intersect_addr - curr_addr;
2447 size_t curr_bytes_written =
2448 WriteMemoryPrivate(curr_addr, ubuf + bytes_written, curr_size, error);
2449 bytes_written += curr_bytes_written;
2450 if (curr_bytes_written != curr_size) {
2451 // We weren't able to write all of the requested bytes, we are
2452 // done looping and will return the number of bytes that we have
2453 // written so far.
2454 if (error.Success())
2455 error = Status::FromErrorString("could not write all bytes");
2456 }
2457 }
2458 // Now write any bytes that would cover up any software breakpoints
2459 // directly into the breakpoint opcode buffer
2460 ::memcpy(bp->GetSavedOpcodeBytes() + opcode_offset, ubuf + bytes_written,
2461 intersect_size);
2462 bytes_written += intersect_size;
2463 });
2464
2465 // Write any remaining bytes after the last breakpoint if we have any left
2466 if (bytes_written < size)
2467 bytes_written +=
2468 WriteMemoryPrivate(addr + bytes_written, ubuf + bytes_written,
2469 size - bytes_written, error);
2470
2471 return bytes_written;
2472}
2473
2474size_t Process::WriteScalarToMemory(addr_t addr, const Scalar &scalar,
2475 size_t byte_size, Status &error) {
2476 if (byte_size == UINT32_MAX)
2477 byte_size = scalar.GetByteSize();
2478 if (byte_size > 0) {
2479 uint8_t buf[32];
2480 const size_t mem_size =
2481 scalar.GetAsMemoryData(buf, byte_size, GetByteOrder(), error);
2482 if (mem_size > 0)
2483 return WriteMemory(addr, buf, mem_size, error);
2484 else
2485 error = Status::FromErrorString("failed to get scalar as memory data");
2486 } else {
2487 error = Status::FromErrorString("invalid scalar value");
2488 }
2489 return 0;
2490}
2491
2492size_t Process::ReadScalarIntegerFromMemory(addr_t addr, uint32_t byte_size,
2493 bool is_signed, Scalar &scalar,
2494 Status &error) {
2495 uint64_t uval = 0;
2496 if (byte_size == 0) {
2497 error = Status::FromErrorString("byte size is zero");
2498 } else if (byte_size & (byte_size - 1)) {
2500 "byte size %u is not a power of 2", byte_size);
2501 } else if (byte_size <= sizeof(uval)) {
2502 const size_t bytes_read = ReadMemory(addr, &uval, byte_size, error);
2503 if (bytes_read == byte_size) {
2504 DataExtractor data(&uval, sizeof(uval), GetByteOrder(),
2506 lldb::offset_t offset = 0;
2507 if (byte_size <= 4)
2508 scalar = data.GetMaxU32(&offset, byte_size);
2509 else
2510 scalar = data.GetMaxU64(&offset, byte_size);
2511 if (is_signed) {
2512 scalar.MakeSigned();
2513 scalar.SignExtend(byte_size * 8);
2514 }
2515 return bytes_read;
2516 }
2517 } else {
2519 "byte size of %u is too large for integer scalar type", byte_size);
2520 }
2521 return 0;
2522}
2523
2524Status Process::WriteObjectFile(std::vector<ObjectFile::LoadableData> entries) {
2525 Status error;
2526 for (const auto &Entry : entries) {
2527 WriteMemory(Entry.Dest, Entry.Contents.data(), Entry.Contents.size(),
2528 error);
2529 if (!error.Success())
2530 break;
2531 }
2532 return error;
2533}
2534
2535addr_t Process::AllocateMemory(size_t size, uint32_t permissions,
2536 Status &error) {
2537 if (GetPrivateState() != eStateStopped) {
2539 "cannot allocate memory while process is running");
2540 return LLDB_INVALID_ADDRESS;
2541 }
2542
2543 return m_allocated_memory_cache.AllocateMemory(size, permissions, error);
2544}
2545
2546addr_t Process::CallocateMemory(size_t size, uint32_t permissions,
2547 Status &error) {
2548 addr_t return_addr = AllocateMemory(size, permissions, error);
2549 if (error.Success()) {
2550 std::string buffer(size, 0);
2551 WriteMemory(return_addr, buffer.c_str(), size, error);
2552 }
2553 return return_addr;
2554}
2555
2557 if (m_can_jit == eCanJITDontKnow) {
2558 Log *log = GetLog(LLDBLog::Process);
2559 Status err;
2560
2561 uint64_t allocated_memory = AllocateMemory(
2562 8, ePermissionsReadable | ePermissionsWritable | ePermissionsExecutable,
2563 err);
2564
2565 if (err.Success()) {
2567 LLDB_LOGF(log,
2568 "Process::%s pid %" PRIu64
2569 " allocation test passed, CanJIT () is true",
2570 __FUNCTION__, GetID());
2571 } else {
2573 LLDB_LOGF(log,
2574 "Process::%s pid %" PRIu64
2575 " allocation test failed, CanJIT () is false: %s",
2576 __FUNCTION__, GetID(), err.AsCString());
2577 }
2578
2579 DeallocateMemory(allocated_memory);
2580 }
2581
2582 return m_can_jit == eCanJITYes;
2583}
2584
2585void Process::SetCanJIT(bool can_jit) {
2586 m_can_jit = (can_jit ? eCanJITYes : eCanJITNo);
2587}
2588
2589void Process::SetCanRunCode(bool can_run_code) {
2590 SetCanJIT(can_run_code);
2591 m_can_interpret_function_calls = can_run_code;
2592}
2593
2595 Status error;
2596 if (!m_allocated_memory_cache.DeallocateMemory(ptr)) {
2598 "deallocation of memory at 0x%" PRIx64 " failed.", (uint64_t)ptr);
2599 }
2600 return error;
2601}
2602
2604 if (std::optional<bool> subclass_override = DoGetWatchpointReportedAfter())
2605 return *subclass_override;
2606
2607 bool reported_after = true;
2608 const ArchSpec &arch = GetTarget().GetArchitecture();
2609 if (!arch.IsValid())
2610 return reported_after;
2611 llvm::Triple triple = arch.GetTriple();
2612
2613 if (triple.isMIPS() || triple.isPPC64() || triple.isRISCV() ||
2614 triple.isAArch64() || triple.isArmMClass() || triple.isARM() ||
2615 triple.isLoongArch())
2616 reported_after = false;
2617
2618 return reported_after;
2619}
2620
2622 lldb::addr_t header_addr,
2623 size_t size_to_read) {
2624 Log *log = GetLog(LLDBLog::Host);
2625 if (log) {
2626 LLDB_LOGF(log,
2627 "Process::ReadModuleFromMemory reading %s binary from memory",
2628 file_spec.GetPath().c_str());
2629 }
2630 ModuleSP module_sp(new Module(file_spec, ArchSpec()));
2631 if (module_sp) {
2632 Status error;
2633 std::unique_ptr<Progress> progress_up;
2634 // Reading an ObjectFile from a local corefile is very fast,
2635 // only print a progress update if we're reading from a
2636 // live session which might go over gdb remote serial protocol.
2637 if (IsLiveDebugSession())
2638 progress_up = std::make_unique<Progress>(
2639 "Reading binary from memory", file_spec.GetFilename().GetString());
2640
2641 ObjectFile *objfile = module_sp->GetMemoryObjectFile(
2642 shared_from_this(), header_addr, error, size_to_read);
2643 if (objfile)
2644 return module_sp;
2645 }
2646 return ModuleSP();
2647}
2648
2650 uint32_t &permissions) {
2651 MemoryRegionInfo range_info;
2652 permissions = 0;
2653 Status error(GetMemoryRegionInfo(load_addr, range_info));
2654 if (!error.Success())
2655 return false;
2656 if (range_info.GetReadable() == MemoryRegionInfo::eDontKnow ||
2657 range_info.GetWritable() == MemoryRegionInfo::eDontKnow ||
2659 return false;
2660 }
2661 permissions = range_info.GetLLDBPermissions();
2662 return true;
2663}
2664
2666 Status error;
2667 error = Status::FromErrorString("watchpoints are not supported");
2668 return error;
2669}
2670
2672 Status error;
2673 error = Status::FromErrorString("watchpoints are not supported");
2674 return error;
2675}
2676
2679 const Timeout<std::micro> &timeout) {
2680 StateType state;
2681
2682 while (true) {
2683 event_sp.reset();
2684 state = GetStateChangedEventsPrivate(event_sp, timeout);
2685
2686 if (StateIsStoppedState(state, false))
2687 break;
2688
2689 // If state is invalid, then we timed out
2690 if (state == eStateInvalid)
2691 break;
2692
2693 if (event_sp)
2694 HandlePrivateEvent(event_sp);
2695 }
2696 return state;
2697}
2698
2700 std::lock_guard<std::recursive_mutex> guard(m_thread_mutex);
2701 if (flush)
2702 m_thread_list.Clear();
2703 m_os_up.reset(OperatingSystem::FindPlugin(this, nullptr));
2704 if (flush)
2705 Flush();
2706}
2707
2709 StateType state_after_launch = eStateInvalid;
2710 EventSP first_stop_event_sp;
2711 Status status =
2712 LaunchPrivate(launch_info, state_after_launch, first_stop_event_sp);
2713 if (status.Fail())
2714 return status;
2715
2716 if (state_after_launch != eStateStopped &&
2717 state_after_launch != eStateCrashed)
2718 return Status();
2719
2720 // Note, the stop event was consumed above, but not handled. This
2721 // was done to give DidLaunch a chance to run. The target is either
2722 // stopped or crashed. Directly set the state. This is done to
2723 // prevent a stop message with a bunch of spurious output on thread
2724 // status, as well as not pop a ProcessIOHandler.
2725 SetPublicState(state_after_launch, false);
2726
2729 else
2731
2732 // Target was stopped at entry as was intended. Need to notify the
2733 // listeners about it.
2734 if (launch_info.GetFlags().Test(eLaunchFlagStopAtEntry))
2735 HandlePrivateEvent(first_stop_event_sp);
2736
2737 return Status();
2738}
2739
2741 EventSP &event_sp) {
2742 Status error;
2743 m_abi_sp.reset();
2744 m_dyld_up.reset();
2745 m_jit_loaders_up.reset();
2746 m_system_runtime_up.reset();
2747 m_os_up.reset();
2749
2750 {
2751 std::lock_guard<std::mutex> guard(m_process_input_reader_mutex);
2752 m_process_input_reader.reset();
2753 }
2754
2756
2757 // The "remote executable path" is hooked up to the local Executable
2758 // module. But we should be able to debug a remote process even if the
2759 // executable module only exists on the remote. However, there needs to
2760 // be a way to express this path, without actually having a module.
2761 // The way to do that is to set the ExecutableFile in the LaunchInfo.
2762 // Figure that out here:
2763
2764 FileSpec exe_spec_to_use;
2765 if (!exe_module) {
2766 if (!launch_info.GetExecutableFile() && !launch_info.IsScriptedProcess()) {
2767 error = Status::FromErrorString("executable module does not exist");
2768 return error;
2769 }
2770 exe_spec_to_use = launch_info.GetExecutableFile();
2771 } else
2772 exe_spec_to_use = exe_module->GetFileSpec();
2773
2774 if (exe_module && FileSystem::Instance().Exists(exe_module->GetFileSpec())) {
2775 // Install anything that might need to be installed prior to launching.
2776 // For host systems, this will do nothing, but if we are connected to a
2777 // remote platform it will install any needed binaries
2778 error = GetTarget().Install(&launch_info);
2779 if (error.Fail())
2780 return error;
2781 }
2782
2783 // Listen and queue events that are broadcasted during the process launch.
2784 ListenerSP listener_sp(Listener::MakeListener("LaunchEventHijack"));
2785 HijackProcessEvents(listener_sp);
2786 llvm::scope_exit on_exit([this]() { RestoreProcessEvents(); });
2787
2790
2791 error = WillLaunch(exe_module);
2792 if (error.Fail()) {
2793 std::string local_exec_file_path = exe_spec_to_use.GetPath();
2794 return Status::FromErrorStringWithFormat("file doesn't exist: '%s'",
2795 local_exec_file_path.c_str());
2796 }
2797
2798 const bool restarted = false;
2799 SetPublicState(eStateLaunching, restarted);
2800 m_should_detach = false;
2801
2802 m_public_run_lock.SetRunning();
2803 error = DoLaunch(exe_module, launch_info);
2804
2805 if (error.Fail()) {
2806 if (GetID() != LLDB_INVALID_PROCESS_ID) {
2808 const char *error_string = error.AsCString();
2809 if (error_string == nullptr)
2810 error_string = "launch failed";
2811 SetExitStatus(-1, error_string);
2812 }
2813 return error;
2814 }
2815
2816 // Now wait for the process to launch and return control to us, and then
2817 // call DidLaunch:
2818 state = WaitForProcessStopPrivate(event_sp, seconds(10));
2819
2820 if (state == eStateInvalid || !event_sp) {
2821 // We were able to launch the process, but we failed to catch the
2822 // initial stop.
2823 error = Status::FromErrorString("failed to catch stop after launch");
2824 SetExitStatus(0, error.AsCString());
2825 Destroy(false);
2826 return error;
2827 }
2828
2829 if (state == eStateExited) {
2830 // We exited while trying to launch somehow. Don't call DidLaunch
2831 // as that's not likely to work, and return an invalid pid.
2832 HandlePrivateEvent(event_sp);
2833 return Status();
2834 }
2835
2836 if (state == eStateStopped || state == eStateCrashed) {
2838
2839 // Now that we know the process type, update its signal responses from the
2840 // ones stored in the Target:
2843 m_unix_signals_sp, GetTarget().GetDebugger().GetAsyncErrorStream());
2844
2846 if (dyld)
2847 dyld->DidLaunch();
2848
2850
2851 SystemRuntime *system_runtime = GetSystemRuntime();
2852 if (system_runtime)
2853 system_runtime->DidLaunch();
2854
2855 if (!m_os_up)
2857
2858 // We successfully launched the process and stopped, now it the
2859 // right time to set up signal filters before resuming.
2861 return Status();
2862 }
2863
2865 "Unexpected process state after the launch: %s, expected %s, "
2866 "%s, %s or %s",
2870}
2871
2875 if (error.Success()) {
2876 ListenerSP listener_sp(
2877 Listener::MakeListener("lldb.process.load_core_listener"));
2878 HijackProcessEvents(listener_sp);
2879
2882 else
2884
2886 if (dyld)
2887 dyld->DidAttach();
2888
2890
2891 SystemRuntime *system_runtime = GetSystemRuntime();
2892 if (system_runtime)
2893 system_runtime->DidAttach();
2894
2895 if (!m_os_up)
2897
2898 // We successfully loaded a core file, now pretend we stopped so we can
2899 // show all of the threads in the core file and explore the crashed state.
2901
2902 // Wait for a stopped event since we just posted one above...
2903 lldb::EventSP event_sp;
2904 StateType state =
2905 WaitForProcessToStop(std::nullopt, &event_sp, true, listener_sp,
2906 nullptr, true, SelectMostRelevantFrame);
2907
2908 if (!StateIsStoppedState(state, false)) {
2909 Log *log = GetLog(LLDBLog::Process);
2910 LLDB_LOGF(log, "Process::Halt() failed to stop, state is: %s",
2911 StateAsCString(state));
2913 "Did not get stopped event after loading the core file.");
2914 }
2916 // Since we hijacked the event stream, we will have we won't have run the
2917 // stop hooks. Make sure we do that here:
2918 GetTarget().RunStopHooks(/* at_initial_stop= */ true);
2919 }
2920 return error;
2921}
2922
2924 if (!m_dyld_up)
2925 m_dyld_up.reset(DynamicLoader::FindPlugin(this, ""));
2926 return m_dyld_up.get();
2927}
2928
2930 m_dyld_up = std::move(dyld_up);
2931}
2932
2934
2935llvm::Expected<bool> Process::SaveCore(llvm::StringRef outfile) {
2936 return false;
2937}
2938
2940 if (!m_jit_loaders_up) {
2941 m_jit_loaders_up = std::make_unique<JITLoaderList>();
2943 }
2944 return *m_jit_loaders_up;
2945}
2946
2952
2954 uint32_t exec_count)
2955 : NextEventAction(process), m_exec_count(exec_count) {
2956 Log *log = GetLog(LLDBLog::Process);
2957 LLDB_LOGF(
2958 log,
2959 "Process::AttachCompletionHandler::%s process=%p, exec_count=%" PRIu32,
2960 __FUNCTION__, static_cast<void *>(process), exec_count);
2961}
2962
2965 Log *log = GetLog(LLDBLog::Process);
2966
2967 StateType state = ProcessEventData::GetStateFromEvent(event_sp.get());
2968 LLDB_LOGF(log,
2969 "Process::AttachCompletionHandler::%s called with state %s (%d)",
2970 __FUNCTION__, StateAsCString(state), static_cast<int>(state));
2971
2972 switch (state) {
2973 case eStateAttaching:
2974 return eEventActionSuccess;
2975
2976 case eStateRunning:
2977 case eStateConnected:
2978 return eEventActionRetry;
2979
2980 case eStateStopped:
2981 case eStateCrashed:
2982 // During attach, prior to sending the eStateStopped event,
2983 // lldb_private::Process subclasses must set the new process ID.
2984 assert(m_process->GetID() != LLDB_INVALID_PROCESS_ID);
2985 // We don't want these events to be reported, so go set the
2986 // ShouldReportStop here:
2987 m_process->GetThreadList().SetShouldReportStop(eVoteNo);
2988
2989 if (m_exec_count > 0) {
2990 --m_exec_count;
2991
2992 LLDB_LOGF(log,
2993 "Process::AttachCompletionHandler::%s state %s: reduced "
2994 "remaining exec count to %" PRIu32 ", requesting resume",
2995 __FUNCTION__, StateAsCString(state), m_exec_count);
2996
2997 RequestResume();
2998 return eEventActionRetry;
2999 } else {
3000 LLDB_LOGF(log,
3001 "Process::AttachCompletionHandler::%s state %s: no more "
3002 "execs expected to start, continuing with attach",
3003 __FUNCTION__, StateAsCString(state));
3004
3005 m_process->CompleteAttach();
3006 return eEventActionSuccess;
3007 }
3008 break;
3009
3010 default:
3011 case eStateExited:
3012 case eStateInvalid:
3013 break;
3014 }
3015
3016 m_exit_string.assign("No valid Process");
3017 return eEventActionExit;
3018}
3019
3024
3026 return m_exit_string.c_str();
3027}
3028
3030 if (m_listener_sp)
3031 return m_listener_sp;
3032 else
3033 return debugger.GetListener();
3034}
3035
3037 return DoWillLaunch(module);
3038}
3039
3043
3045 bool wait_for_launch) {
3046 return DoWillAttachToProcessWithName(process_name, wait_for_launch);
3047}
3048
3050 m_abi_sp.reset();
3051 {
3052 std::lock_guard<std::mutex> guard(m_process_input_reader_mutex);
3053 m_process_input_reader.reset();
3054 }
3055 m_dyld_up.reset();
3056 m_jit_loaders_up.reset();
3057 m_system_runtime_up.reset();
3058 m_os_up.reset();
3060
3061 lldb::pid_t attach_pid = attach_info.GetProcessID();
3062 Status error;
3063 if (attach_pid == LLDB_INVALID_PROCESS_ID) {
3064 char process_name[PATH_MAX];
3065
3066 if (attach_info.GetExecutableFile().GetPath(process_name,
3067 sizeof(process_name))) {
3068 const bool wait_for_launch = attach_info.GetWaitForLaunch();
3069
3070 if (wait_for_launch) {
3071 error = WillAttachToProcessWithName(process_name, wait_for_launch);
3072 if (error.Success()) {
3073 m_public_run_lock.SetRunning();
3074 m_should_detach = true;
3075 const bool restarted = false;
3076 SetPublicState(eStateAttaching, restarted);
3077 // Now attach using these arguments.
3078 error = DoAttachToProcessWithName(process_name, attach_info);
3079
3080 if (error.Fail()) {
3081 if (GetID() != LLDB_INVALID_PROCESS_ID) {
3083 if (error.AsCString() == nullptr)
3084 error = Status::FromErrorString("attach failed");
3085
3086 SetExitStatus(-1, error.AsCString());
3087 }
3088 } else {
3090 this, attach_info.GetResumeCount()));
3092 }
3093 return error;
3094 }
3095 } else {
3096 ProcessInstanceInfoList process_infos;
3097 PlatformSP platform_sp(GetTarget().GetPlatform());
3098
3099 if (platform_sp) {
3100 ProcessInstanceInfoMatch match_info;
3101 match_info.GetProcessInfo() = attach_info;
3103 platform_sp->FindProcesses(match_info, process_infos);
3104 const uint32_t num_matches = process_infos.size();
3105 if (num_matches == 1) {
3106 attach_pid = process_infos[0].GetProcessID();
3107 // Fall through and attach using the above process ID
3108 } else {
3110 process_name, sizeof(process_name));
3111 if (num_matches > 1) {
3112 StreamString s;
3114 for (size_t i = 0; i < num_matches; i++) {
3115 process_infos[i].DumpAsTableRow(
3116 s, platform_sp->GetUserIDResolver(), true, false);
3117 }
3119 "more than one process named %s:\n%s", process_name,
3120 s.GetData());
3121 } else
3123 "could not find a process named %s", process_name);
3124 }
3125 } else {
3127 "invalid platform, can't find processes by name");
3128 return error;
3129 }
3130 }
3131 } else {
3132 error = Status::FromErrorString("invalid process name");
3133 }
3134 }
3135
3136 if (attach_pid != LLDB_INVALID_PROCESS_ID) {
3137 error = WillAttachToProcessWithID(attach_pid);
3138 if (error.Success()) {
3139 m_public_run_lock.SetRunning();
3140
3141 // Now attach using these arguments.
3142 m_should_detach = true;
3143 const bool restarted = false;
3144 SetPublicState(eStateAttaching, restarted);
3145 error = DoAttachToProcessWithID(attach_pid, attach_info);
3146
3147 if (error.Success()) {
3149 this, attach_info.GetResumeCount()));
3151 } else {
3154
3155 const char *error_string = error.AsCString();
3156 if (error_string == nullptr)
3157 error_string = "attach failed";
3158
3159 SetExitStatus(-1, error_string);
3160 }
3161 }
3162 }
3163 return error;
3164}
3165
3168 LLDB_LOGF(log, "Process::%s()", __FUNCTION__);
3169
3170 // Let the process subclass figure out at much as it can about the process
3171 // before we go looking for a dynamic loader plug-in.
3172 ArchSpec process_arch;
3173 DidAttach(process_arch);
3174
3175 if (process_arch.IsValid()) {
3176 LLDB_LOG(log,
3177 "Process::{0} replacing process architecture with DidAttach() "
3178 "architecture: \"{1}\"",
3179 __FUNCTION__, process_arch.GetTriple().getTriple());
3180 GetTarget().SetArchitecture(process_arch);
3181 }
3182
3183 // We just attached. If we have a platform, ask it for the process
3184 // architecture, and if it isn't the same as the one we've already set,
3185 // switch architectures.
3186 PlatformSP platform_sp(GetTarget().GetPlatform());
3187 assert(platform_sp);
3188 ArchSpec process_host_arch = GetSystemArchitecture();
3189 if (platform_sp) {
3190 const ArchSpec &target_arch = GetTarget().GetArchitecture();
3191 if (target_arch.IsValid() && !platform_sp->IsCompatibleArchitecture(
3192 target_arch, process_host_arch,
3193 ArchSpec::CompatibleMatch, nullptr)) {
3194 ArchSpec platform_arch;
3196 target_arch, process_host_arch, &platform_arch);
3197 if (platform_sp) {
3198 GetTarget().SetPlatform(platform_sp);
3199 GetTarget().SetArchitecture(platform_arch);
3200 LLDB_LOG(log,
3201 "switching platform to {0} and architecture to {1} based on "
3202 "info from attach",
3203 platform_sp->GetName(), platform_arch.GetTriple().getTriple());
3204 }
3205 } else if (!process_arch.IsValid()) {
3206 ProcessInstanceInfo process_info;
3207 GetProcessInfo(process_info);
3208 const ArchSpec &process_arch = process_info.GetArchitecture();
3209 const ArchSpec &target_arch = GetTarget().GetArchitecture();
3210 if (process_arch.IsValid() &&
3211 target_arch.IsCompatibleMatch(process_arch) &&
3212 !target_arch.IsExactMatch(process_arch)) {
3213 GetTarget().SetArchitecture(process_arch);
3214 LLDB_LOGF(log,
3215 "Process::%s switching architecture to %s based on info "
3216 "the platform retrieved for pid %" PRIu64,
3217 __FUNCTION__, process_arch.GetTriple().getTriple().c_str(),
3218 GetID());
3219 }
3220 }
3221 }
3222 // Now that we know the process type, update its signal responses from the
3223 // ones stored in the Target:
3226 m_unix_signals_sp, GetTarget().GetDebugger().GetAsyncErrorStream());
3227
3228 // We have completed the attach, now it is time to find the dynamic loader
3229 // plug-in
3231 if (dyld) {
3232 dyld->DidAttach();
3233 if (log) {
3234 ModuleSP exe_module_sp = GetTarget().GetExecutableModule();
3235 LLDB_LOG(log,
3236 "after DynamicLoader::DidAttach(), target "
3237 "executable is {0} (using {1} plugin)",
3238 exe_module_sp ? exe_module_sp->GetFileSpec() : FileSpec(),
3239 dyld->GetPluginName());
3240 }
3241 }
3242
3244
3245 SystemRuntime *system_runtime = GetSystemRuntime();
3246 if (system_runtime) {
3247 system_runtime->DidAttach();
3248 if (log) {
3249 ModuleSP exe_module_sp = GetTarget().GetExecutableModule();
3250 LLDB_LOG(log,
3251 "after SystemRuntime::DidAttach(), target "
3252 "executable is {0} (using {1} plugin)",
3253 exe_module_sp ? exe_module_sp->GetFileSpec() : FileSpec(),
3254 system_runtime->GetPluginName());
3255 }
3256 }
3257
3258 // If we don't have an operating system plugin loaded yet, see if
3259 // LoadOperatingSystemPlugin can find one (and stuff it in m_os_up).
3260 if (!m_os_up)
3262
3263 if (m_os_up) {
3264 // Somebody might have gotten threads before we loaded the OS Plugin above,
3265 // so we need to force the update now or the newly loaded plugin won't get
3266 // a chance to process the threads.
3267 m_thread_list.Clear();
3269 }
3270
3271 // Figure out which one is the executable, and set that in our target:
3272 ModuleSP new_executable_module_sp;
3273 for (ModuleSP module_sp : GetTarget().GetImages().Modules()) {
3274 if (module_sp && module_sp->IsExecutable()) {
3275 if (GetTarget().GetExecutableModulePointer() != module_sp.get())
3276 new_executable_module_sp = module_sp;
3277 break;
3278 }
3279 }
3280 if (new_executable_module_sp) {
3281 GetTarget().SetExecutableModule(new_executable_module_sp,
3283 if (log) {
3284 ModuleSP exe_module_sp = GetTarget().GetExecutableModule();
3285 LLDB_LOGF(
3286 log,
3287 "Process::%s after looping through modules, target executable is %s",
3288 __FUNCTION__,
3289 exe_module_sp ? exe_module_sp->GetFileSpec().GetPath().c_str()
3290 : "<none>");
3291 }
3292 }
3293 // Since we hijacked the event stream, we will have we won't have run the
3294 // stop hooks. Make sure we do that here:
3295 GetTarget().RunStopHooks(/* at_initial_stop= */ true);
3296}
3297
3298Status Process::ConnectRemote(llvm::StringRef remote_url) {
3299 m_abi_sp.reset();
3300 {
3301 std::lock_guard<std::mutex> guard(m_process_input_reader_mutex);
3302 m_process_input_reader.reset();
3303 }
3304
3305 // Find the process and its architecture. Make sure it matches the
3306 // architecture of the current Target, and if not adjust it.
3307
3308 Status error(DoConnectRemote(remote_url));
3309 if (error.Success()) {
3310 if (GetID() != LLDB_INVALID_PROCESS_ID) {
3311 EventSP event_sp;
3312 StateType state = WaitForProcessStopPrivate(event_sp, std::nullopt);
3313
3314 if (state == eStateStopped || state == eStateCrashed) {
3315 // If we attached and actually have a process on the other end, then
3316 // this ended up being the equivalent of an attach.
3317 SetShouldDetach(true);
3319
3320 // This delays passing the stopped event to listeners till
3321 // CompleteAttach gets a chance to complete...
3322 HandlePrivateEvent(event_sp);
3323 }
3324 }
3325
3328 else
3330 }
3331 return error;
3332}
3333
3335 if (m_base_direction == direction)
3336 return;
3337 m_thread_list.DiscardThreadPlans();
3338 m_base_direction = direction;
3339}
3340
3343 LLDB_LOGF(log,
3344 "Process::PrivateResume() m_stop_id = %u, public state: %s "
3345 "private state: %s",
3346 m_mod_id.GetStopID(), StateAsCString(m_public_state.GetValue()),
3347 StateAsCString(m_private_state.GetValue()));
3348
3349 // If signals handing status changed we might want to update our signal
3350 // filters before resuming.
3352 // Clear any crash info we accumulated for this stop, but don't do so if we
3353 // are running functions; we don't want to wipe out the real stop's info.
3354 if (!GetModID().IsLastResumeForUserExpression())
3356
3358 // Tell the process it is about to resume before the thread list
3359 if (error.Success()) {
3360 // Now let the thread list know we are about to resume so it can let all of
3361 // our threads know that they are about to be resumed. Threads will each be
3362 // called with Thread::WillResume(StateType) where StateType contains the
3363 // state that they are supposed to have when the process is resumed
3364 // (suspended/running/stepping). Threads should also check their resume
3365 // signal in lldb::Thread::GetResumeSignal() to see if they are supposed to
3366 // start back up with a signal.
3367 RunDirection direction;
3368 if (m_thread_list.WillResume(direction)) {
3369 LLDB_LOGF(log, "Process::PrivateResume WillResume direction=%d",
3370 direction);
3371 // Last thing, do the PreResumeActions.
3372 if (!RunPreResumeActions()) {
3374 "Process::PrivateResume PreResumeActions failed, not resuming.");
3375 LLDB_LOGF(
3376 log,
3377 "Process::PrivateResume PreResumeActions failed, not resuming.");
3378 } else {
3379 m_mod_id.BumpResumeID();
3380 error = DoResume(direction);
3381 if (error.Success()) {
3382 DidResume();
3383 m_thread_list.DidResume();
3384 LLDB_LOGF(log,
3385 "Process::PrivateResume thinks the process has resumed.");
3386 } else {
3387 LLDB_LOGF(log, "Process::PrivateResume() DoResume failed.");
3388 return error;
3389 }
3390 }
3391 } else {
3392 // Somebody wanted to run without running (e.g. we were faking a step
3393 // from one frame of a set of inlined frames that share the same PC to
3394 // another.) So generate a continue & a stopped event, and let the world
3395 // handle them.
3396 LLDB_LOGF(log,
3397 "Process::PrivateResume() asked to simulate a start & stop.");
3398
3401 }
3402 } else
3403 LLDB_LOGF(log, "Process::PrivateResume() got an error \"%s\".",
3404 error.AsCString("<unknown error>"));
3405 return error;
3406}
3407
3408Status Process::Halt(bool clear_thread_plans, bool use_run_lock) {
3409 if (!StateIsRunningState(m_public_state.GetValue()))
3410 return Status::FromErrorString("Process is not running.");
3411
3412 // Don't clear the m_clear_thread_plans_on_stop, only set it to true if in
3413 // case it was already set and some thread plan logic calls halt on its own.
3414 m_clear_thread_plans_on_stop |= clear_thread_plans;
3415
3416 ListenerSP halt_listener_sp(
3417 Listener::MakeListener("lldb.process.halt_listener"));
3418 HijackProcessEvents(halt_listener_sp);
3419
3420 EventSP event_sp;
3421
3423
3424 if (m_public_state.GetValue() == eStateAttaching) {
3425 // Don't hijack and eat the eStateExited as the code that was doing the
3426 // attach will be waiting for this event...
3428 Destroy(false);
3429 SetExitStatus(SIGKILL, "Cancelled async attach.");
3430 return Status();
3431 }
3432
3433 // Wait for the process halt timeout seconds for the process to stop.
3434 // If we are going to use the run lock, that means we're stopping out to the
3435 // user, so we should also select the most relevant frame.
3436 SelectMostRelevant select_most_relevant =
3438 StateType state = WaitForProcessToStop(GetInterruptTimeout(), &event_sp, true,
3439 halt_listener_sp, nullptr,
3440 use_run_lock, select_most_relevant);
3442
3443 if (state == eStateInvalid || !event_sp) {
3444 // We timed out and didn't get a stop event...
3445 return Status::FromErrorStringWithFormat("Halt timed out. State = %s",
3447 }
3448
3449 BroadcastEvent(event_sp);
3450
3451 return Status();
3452}
3453
3455 const uint8_t *buf, size_t size) {
3456 const size_t region_size = high - low;
3457
3458 if (region_size < size)
3459 return LLDB_INVALID_ADDRESS;
3460
3461 // See "Boyer-Moore string search algorithm".
3462 std::vector<size_t> bad_char_heuristic(256, size);
3463 for (size_t idx = 0; idx < size - 1; idx++) {
3464 decltype(bad_char_heuristic)::size_type bcu_idx = buf[idx];
3465 bad_char_heuristic[bcu_idx] = size - idx - 1;
3466 }
3467
3468 // Memory we're currently searching through.
3469 llvm::SmallVector<uint8_t, 0> mem;
3470 // Position of the memory buffer.
3471 addr_t mem_pos = low;
3472 // Maximum number of bytes read (and buffered). We need to read at least
3473 // `size` bytes for a successful match.
3474 const size_t max_read_size = std::max<size_t>(size, 0x10000);
3475
3476 for (addr_t cur_addr = low; cur_addr <= (high - size);) {
3477 if (cur_addr + size > mem_pos + mem.size()) {
3478 // We need to read more data. We don't attempt to reuse the data we've
3479 // already read (up to `size-1` bytes from `cur_addr` to
3480 // `mem_pos+mem.size()`). This is fine for patterns much smaller than
3481 // max_read_size. For very
3482 // long patterns we may need to do something more elaborate.
3483 mem.resize_for_overwrite(max_read_size);
3484 Status error;
3485 mem.resize(ReadMemory(cur_addr, mem.data(),
3486 std::min<addr_t>(mem.size(), high - cur_addr),
3487 error));
3488 mem_pos = cur_addr;
3489 if (size > mem.size()) {
3490 // We didn't read enough data. Skip to the next memory region.
3491 MemoryRegionInfo info;
3492 error = GetMemoryRegionInfo(mem_pos + mem.size(), info);
3493 if (error.Fail())
3494 break;
3495 cur_addr = info.GetRange().GetRangeEnd();
3496 continue;
3497 }
3498 }
3499 int64_t j = size - 1;
3500 while (j >= 0 && buf[j] == mem[cur_addr + j - mem_pos])
3501 j--;
3502 if (j < 0)
3503 return cur_addr; // We have a match.
3504 cur_addr += bad_char_heuristic[mem[cur_addr + size - 1 - mem_pos]];
3505 }
3506
3507 return LLDB_INVALID_ADDRESS;
3508}
3509
3511 Status error;
3512
3513 // Check both the public & private states here. If we're hung evaluating an
3514 // expression, for instance, then the public state will be stopped, but we
3515 // still need to interrupt.
3516 if (m_public_state.GetValue() == eStateRunning ||
3517 m_private_state.GetValue() == eStateRunning) {
3518 Log *log = GetLog(LLDBLog::Process);
3519 LLDB_LOGF(log, "Process::%s() About to stop.", __FUNCTION__);
3520
3521 ListenerSP listener_sp(
3522 Listener::MakeListener("lldb.Process.StopForDestroyOrDetach.hijack"));
3523 HijackProcessEvents(listener_sp);
3524
3526
3527 // Consume the interrupt event.
3529 &exit_event_sp, true, listener_sp);
3530
3532
3533 // If the process exited while we were waiting for it to stop, put the
3534 // exited event into the shared pointer passed in and return. Our caller
3535 // doesn't need to do anything else, since they don't have a process
3536 // anymore...
3537
3538 if (state == eStateExited || m_private_state.GetValue() == eStateExited) {
3539 LLDB_LOGF(log, "Process::%s() Process exited while waiting to stop.",
3540 __FUNCTION__);
3541 return error;
3542 } else
3543 exit_event_sp.reset(); // It is ok to consume any non-exit stop events
3544
3545 if (state != eStateStopped) {
3546 LLDB_LOGF(log, "Process::%s() failed to stop, state is: %s", __FUNCTION__,
3547 StateAsCString(state));
3548 // If we really couldn't stop the process then we should just error out
3549 // here, but if the lower levels just bobbled sending the event and we
3550 // really are stopped, then continue on.
3551 StateType private_state = m_private_state.GetValue();
3552 if (private_state != eStateStopped) {
3554 "Attempt to stop the target in order to detach timed out. "
3555 "State = %s",
3557 }
3558 }
3559 }
3560 return error;
3561}
3562
3563Status Process::Detach(bool keep_stopped) {
3564 EventSP exit_event_sp;
3565 Status error;
3566 m_destroy_in_process = true;
3567
3568 error = WillDetach();
3569
3570 if (error.Success()) {
3571 if (DetachRequiresHalt()) {
3572 error = StopForDestroyOrDetach(exit_event_sp);
3573 if (!error.Success()) {
3574 m_destroy_in_process = false;
3575 return error;
3576 } else if (exit_event_sp) {
3577 // We shouldn't need to do anything else here. There's no process left
3578 // to detach from...
3580 m_destroy_in_process = false;
3581 return error;
3582 }
3583 }
3584
3585 m_thread_list.DiscardThreadPlans();
3587
3588 error = DoDetach(keep_stopped);
3589 if (error.Success()) {
3590 DidDetach();
3592 } else {
3593 return error;
3594 }
3595 }
3596 m_destroy_in_process = false;
3597
3598 // If we exited when we were waiting for a process to stop, then forward the
3599 // event here so we don't lose the event
3600 if (exit_event_sp) {
3601 // Directly broadcast our exited event because we shut down our private
3602 // state thread above
3603 BroadcastEvent(exit_event_sp);
3604 }
3605
3606 // If we have been interrupted (to kill us) in the middle of running, we may
3607 // not end up propagating the last events through the event system, in which
3608 // case we might strand the write lock. Unlock it here so when we do to tear
3609 // down the process we don't get an error destroying the lock.
3610
3611 m_public_run_lock.SetStopped();
3612 return error;
3613}
3614
3615Status Process::Destroy(bool force_kill) {
3616 // If we've already called Process::Finalize then there's nothing useful to
3617 // be done here. Finalize has actually called Destroy already.
3618 if (m_finalizing)
3619 return {};
3620 return DestroyImpl(force_kill);
3621}
3622
3624 // Tell ourselves we are in the process of destroying the process, so that we
3625 // don't do any unnecessary work that might hinder the destruction. Remember
3626 // to set this back to false when we are done. That way if the attempt
3627 // failed and the process stays around for some reason it won't be in a
3628 // confused state.
3629
3630 if (force_kill)
3631 m_should_detach = false;
3632
3633 if (GetShouldDetach()) {
3634 // FIXME: This will have to be a process setting:
3635 bool keep_stopped = false;
3636 Detach(keep_stopped);
3637 }
3638
3639 m_destroy_in_process = true;
3640
3642 if (error.Success()) {
3643 EventSP exit_event_sp;
3644 if (DestroyRequiresHalt()) {
3645 error = StopForDestroyOrDetach(exit_event_sp);
3646 }
3647
3648 if (m_public_state.GetValue() == eStateStopped) {
3649 // Ditch all thread plans, and remove all our breakpoints: in case we
3650 // have to restart the target to kill it, we don't want it hitting a
3651 // breakpoint... Only do this if we've stopped, however, since if we
3652 // didn't manage to halt it above, then we're not going to have much luck
3653 // doing this now.
3654 m_thread_list.DiscardThreadPlans();
3656 }
3657
3658 error = DoDestroy();
3659 if (error.Success()) {
3660 DidDestroy();
3662 }
3663 m_stdio_communication.StopReadThread();
3664 m_stdio_communication.Disconnect();
3665 m_stdin_forward = false;
3666
3667 {
3668 std::lock_guard<std::mutex> guard(m_process_input_reader_mutex);
3670 m_process_input_reader->SetIsDone(true);
3671 m_process_input_reader->Cancel();
3672 m_process_input_reader.reset();
3673 }
3674 }
3675
3676 // If we exited when we were waiting for a process to stop, then forward
3677 // the event here so we don't lose the event
3678 if (exit_event_sp) {
3679 // Directly broadcast our exited event because we shut down our private
3680 // state thread above
3681 BroadcastEvent(exit_event_sp);
3682 }
3683
3684 // If we have been interrupted (to kill us) in the middle of running, we
3685 // may not end up propagating the last events through the event system, in
3686 // which case we might strand the write lock. Unlock it here so when we do
3687 // to tear down the process we don't get an error destroying the lock.
3688 m_public_run_lock.SetStopped();
3689 }
3690
3691 m_destroy_in_process = false;
3692
3693 return error;
3694}
3695
3698 if (error.Success()) {
3699 error = DoSignal(signal);
3700 if (error.Success())
3701 DidSignal();
3702 }
3703 return error;
3704}
3705
3707 assert(signals_sp && "null signals_sp");
3708 m_unix_signals_sp = std::move(signals_sp);
3709}
3710
3712 assert(m_unix_signals_sp && "null m_unix_signals_sp");
3713 return m_unix_signals_sp;
3714}
3715
3719
3723
3725 const StateType state =
3727 bool return_value = true;
3729
3730 switch (state) {
3731 case eStateDetached:
3732 case eStateExited:
3733 case eStateUnloaded:
3734 m_stdio_communication.SynchronizeWithReadThread();
3735 m_stdio_communication.StopReadThread();
3736 m_stdio_communication.Disconnect();
3737 m_stdin_forward = false;
3738
3739 [[fallthrough]];
3740 case eStateConnected:
3741 case eStateAttaching:
3742 case eStateLaunching:
3743 // These events indicate changes in the state of the debugging session,
3744 // always report them.
3745 return_value = true;
3746 break;
3747 case eStateInvalid:
3748 // We stopped for no apparent reason, don't report it.
3749 return_value = false;
3750 break;
3751 case eStateRunning:
3752 case eStateStepping:
3753 // If we've started the target running, we handle the cases where we are
3754 // already running and where there is a transition from stopped to running
3755 // differently. running -> running: Automatically suppress extra running
3756 // events stopped -> running: Report except when there is one or more no
3757 // votes
3758 // and no yes votes.
3761 return_value = true;
3762 else {
3763 switch (m_last_broadcast_state) {
3764 case eStateRunning:
3765 case eStateStepping:
3766 // We always suppress multiple runnings with no PUBLIC stop in between.
3767 return_value = false;
3768 break;
3769 default:
3770 // TODO: make this work correctly. For now always report
3771 // run if we aren't running so we don't miss any running events. If I
3772 // run the lldb/test/thread/a.out file and break at main.cpp:58, run
3773 // and hit the breakpoints on multiple threads, then somehow during the
3774 // stepping over of all breakpoints no run gets reported.
3775
3776 // This is a transition from stop to run.
3777 switch (m_thread_list.ShouldReportRun(event_ptr)) {
3778 case eVoteYes:
3779 case eVoteNoOpinion:
3780 return_value = true;
3781 break;
3782 case eVoteNo:
3783 return_value = false;
3784 break;
3785 }
3786 break;
3787 }
3788 }
3789 break;
3790 case eStateStopped:
3791 case eStateCrashed:
3792 case eStateSuspended:
3793 // We've stopped. First see if we're going to restart the target. If we
3794 // are going to stop, then we always broadcast the event. If we aren't
3795 // going to stop, let the thread plans decide if we're going to report this
3796 // event. If no thread has an opinion, we don't report it.
3797
3798 m_stdio_communication.SynchronizeWithReadThread();
3801 LLDB_LOGF(log,
3802 "Process::ShouldBroadcastEvent (%p) stopped due to an "
3803 "interrupt, state: %s",
3804 static_cast<void *>(event_ptr), StateAsCString(state));
3805 // Even though we know we are going to stop, we should let the threads
3806 // have a look at the stop, so they can properly set their state.
3807 m_thread_list.ShouldStop(event_ptr);
3808 return_value = true;
3809 } else {
3810 bool was_restarted = ProcessEventData::GetRestartedFromEvent(event_ptr);
3811 bool should_resume = false;
3812
3813 // It makes no sense to ask "ShouldStop" if we've already been
3814 // restarted... Asking the thread list is also not likely to go well,
3815 // since we are running again. So in that case just report the event.
3816
3817 if (!was_restarted)
3818 should_resume = !m_thread_list.ShouldStop(event_ptr);
3819
3820 if (was_restarted || should_resume || m_resume_requested) {
3821 Vote report_stop_vote = m_thread_list.ShouldReportStop(event_ptr);
3822 LLDB_LOGF(log,
3823 "Process::ShouldBroadcastEvent: should_resume: %i state: "
3824 "%s was_restarted: %i report_stop_vote: %d.",
3825 should_resume, StateAsCString(state), was_restarted,
3826 report_stop_vote);
3827
3828 switch (report_stop_vote) {
3829 case eVoteYes:
3830 return_value = true;
3831 break;
3832 case eVoteNoOpinion:
3833 case eVoteNo:
3834 return_value = false;
3835 break;
3836 }
3837
3838 if (!was_restarted) {
3839 LLDB_LOGF(log,
3840 "Process::ShouldBroadcastEvent (%p) Restarting process "
3841 "from state: %s",
3842 static_cast<void *>(event_ptr), StateAsCString(state));
3844 PrivateResume();
3845 }
3846 } else {
3847 return_value = true;
3849 }
3850 }
3851 break;
3852 }
3853
3854 // Forcing the next event delivery is a one shot deal. So reset it here.
3856
3857 // We do some coalescing of events (for instance two consecutive running
3858 // events get coalesced.) But we only coalesce against events we actually
3859 // broadcast. So we use m_last_broadcast_state to track that. NB - you
3860 // can't use "m_public_state.GetValue()" for that purpose, as was originally
3861 // done, because the PublicState reflects the last event pulled off the
3862 // queue, and there may be several events stacked up on the queue unserviced.
3863 // So the PublicState may not reflect the last broadcasted event yet.
3864 // m_last_broadcast_state gets updated here.
3865
3866 if (return_value)
3867 m_last_broadcast_state = state;
3868
3869 LLDB_LOGF(log,
3870 "Process::ShouldBroadcastEvent (%p) => new state: %s, last "
3871 "broadcast state: %s - %s",
3872 static_cast<void *>(event_ptr), StateAsCString(state),
3874 return_value ? "YES" : "NO");
3875 return return_value;
3876}
3877
3878bool Process::StartPrivateStateThread(bool is_secondary_thread) {
3879 Log *log = GetLog(LLDBLog::Events);
3880
3881 bool already_running = PrivateStateThreadIsValid();
3882 LLDB_LOGF(log, "Process::%s()%s ", __FUNCTION__,
3883 already_running ? " already running"
3884 : " starting private state thread");
3885
3886 if (!is_secondary_thread && already_running)
3887 return true;
3888
3889 // Create a thread that watches our internal state and controls which events
3890 // make it to clients (into the DCProcess event queue).
3891 char thread_name[1024];
3892 uint32_t max_len = llvm::get_max_thread_name_length();
3893 if (max_len > 0 && max_len <= 30) {
3894 // On platforms with abbreviated thread name lengths, choose thread names
3895 // that fit within the limit.
3896 if (already_running)
3897 snprintf(thread_name, sizeof(thread_name), "intern-state-OV");
3898 else
3899 snprintf(thread_name, sizeof(thread_name), "intern-state");
3900 } else {
3901 if (already_running)
3902 snprintf(thread_name, sizeof(thread_name),
3903 "<lldb.process.internal-state-override(pid=%" PRIu64 ")>",
3904 GetID());
3905 else
3906 snprintf(thread_name, sizeof(thread_name),
3907 "<lldb.process.internal-state(pid=%" PRIu64 ")>", GetID());
3908 }
3909
3910 llvm::Expected<HostThread> private_state_thread =
3912 thread_name,
3913 [this, is_secondary_thread] {
3914 return RunPrivateStateThread(is_secondary_thread);
3915 },
3916 8 * 1024 * 1024);
3917 if (!private_state_thread) {
3918 LLDB_LOG_ERROR(GetLog(LLDBLog::Host), private_state_thread.takeError(),
3919 "failed to launch host thread: {0}");
3920 return false;
3921 }
3922
3923 assert(private_state_thread->IsJoinable());
3924 m_private_state_thread = *private_state_thread;
3926 return true;
3927}
3928
3932
3936
3938 if (m_private_state_thread.IsJoinable())
3940 else {
3941 Log *log = GetLog(LLDBLog::Process);
3942 LLDB_LOGF(
3943 log,
3944 "Went to stop the private state thread, but it was already invalid.");
3945 }
3946}
3947
3949 Log *log = GetLog(LLDBLog::Process);
3950
3951 assert(signal == eBroadcastInternalStateControlStop ||
3954
3955 LLDB_LOGF(log, "Process::%s (signal = %d)", __FUNCTION__, signal);
3956
3957 // Signal the private state thread
3958 if (m_private_state_thread.IsJoinable()) {
3959 // Broadcast the event.
3960 // It is important to do this outside of the if below, because it's
3961 // possible that the thread state is invalid but that the thread is waiting
3962 // on a control event instead of simply being on its way out (this should
3963 // not happen, but it apparently can).
3964 LLDB_LOGF(log, "Sending control event of type: %d.", signal);
3965 std::shared_ptr<EventDataReceipt> event_receipt_sp(new EventDataReceipt());
3966 m_private_state_control_broadcaster.BroadcastEvent(signal,
3967 event_receipt_sp);
3968
3969 // Wait for the event receipt or for the private state thread to exit
3970 bool receipt_received = false;
3972 while (!receipt_received) {
3973 // Check for a receipt for n seconds and then check if the private
3974 // state thread is still around.
3975 receipt_received =
3976 event_receipt_sp->WaitForEventReceived(GetUtilityExpressionTimeout());
3977 if (!receipt_received) {
3978 // Check if the private state thread is still around. If it isn't
3979 // then we are done waiting
3981 break; // Private state thread exited or is exiting, we are done
3982 }
3983 }
3984 }
3985
3986 if (signal == eBroadcastInternalStateControlStop) {
3987 thread_result_t result = {};
3988 m_private_state_thread.Join(&result);
3989 m_private_state_thread.Reset();
3990 }
3991 } else {
3992 LLDB_LOGF(
3993 log,
3994 "Private state thread already dead, no need to signal it to stop.");
3995 }
3996}
3997
3999 if (thread != nullptr)
4000 m_interrupt_tid = thread->GetProtocolID();
4001 else
4005 nullptr);
4006 else
4008}
4009
4011 Log *log = GetLog(LLDBLog::Process);
4012 m_resume_requested = false;
4013
4014 const StateType new_state =
4016
4017 // First check to see if anybody wants a shot at this event:
4020 m_next_event_action_up->PerformAction(event_sp);
4021 LLDB_LOGF(log, "Ran next event action, result was %d.", action_result);
4022
4023 switch (action_result) {
4025 SetNextEventAction(nullptr);
4026 break;
4027
4029 break;
4030
4032 // Handle Exiting Here. If we already got an exited event, we should
4033 // just propagate it. Otherwise, swallow this event, and set our state
4034 // to exit so the next event will kill us.
4035 if (new_state != eStateExited) {
4036 // FIXME: should cons up an exited event, and discard this one.
4037 SetExitStatus(0, m_next_event_action_up->GetExitString());
4038 SetNextEventAction(nullptr);
4039 return;
4040 }
4041 SetNextEventAction(nullptr);
4042 break;
4043 }
4044 }
4045
4046 // See if we should broadcast this state to external clients?
4047 const bool should_broadcast = ShouldBroadcastEvent(event_sp.get());
4048
4049 if (should_broadcast) {
4050 const bool is_hijacked = IsHijackedForEvent(eBroadcastBitStateChanged);
4051 if (log) {
4052 LLDB_LOGF(log,
4053 "Process::%s (pid = %" PRIu64
4054 ") broadcasting new state %s (old state %s) to %s",
4055 __FUNCTION__, GetID(), StateAsCString(new_state),
4057 is_hijacked ? "hijacked" : "public");
4058 }
4060 if (StateIsRunningState(new_state)) {
4061 // Only push the input handler if we aren't fowarding events, as this
4062 // means the curses GUI is in use... Or don't push it if we are launching
4063 // since it will come up stopped.
4064 if (!GetTarget().GetDebugger().IsForwardingEvents() &&
4065 new_state != eStateLaunching && new_state != eStateAttaching) {
4067 m_iohandler_sync.SetValue(m_iohandler_sync.GetValue() + 1,
4069 LLDB_LOGF(log, "Process::%s updated m_iohandler_sync to %d",
4070 __FUNCTION__, m_iohandler_sync.GetValue());
4071 }
4072 } else if (StateIsStoppedState(new_state, false)) {
4074 // If the lldb_private::Debugger is handling the events, we don't want
4075 // to pop the process IOHandler here, we want to do it when we receive
4076 // the stopped event so we can carefully control when the process
4077 // IOHandler is popped because when we stop we want to display some
4078 // text stating how and why we stopped, then maybe some
4079 // process/thread/frame info, and then we want the "(lldb) " prompt to
4080 // show up. If we pop the process IOHandler here, then we will cause
4081 // the command interpreter to become the top IOHandler after the
4082 // process pops off and it will update its prompt right away... See the
4083 // Debugger.cpp file where it calls the function as
4084 // "process_sp->PopProcessIOHandler()" to see where I am talking about.
4085 // Otherwise we end up getting overlapping "(lldb) " prompts and
4086 // garbled output.
4087 //
4088 // If we aren't handling the events in the debugger (which is indicated
4089 // by "m_target.GetDebugger().IsHandlingEvents()" returning false) or
4090 // we are hijacked, then we always pop the process IO handler manually.
4091 // Hijacking happens when the internal process state thread is running
4092 // thread plans, or when commands want to run in synchronous mode and
4093 // they call "process->WaitForProcessToStop()". An example of something
4094 // that will hijack the events is a simple expression:
4095 //
4096 // (lldb) expr (int)puts("hello")
4097 //
4098 // This will cause the internal process state thread to resume and halt
4099 // the process (and _it_ will hijack the eBroadcastBitStateChanged
4100 // events) and we do need the IO handler to be pushed and popped
4101 // correctly.
4102
4103 if (is_hijacked || !GetTarget().GetDebugger().IsHandlingEvents())
4105 }
4106 }
4107
4108 BroadcastEvent(event_sp);
4109 } else {
4110 if (log) {
4111 LLDB_LOGF(
4112 log,
4113 "Process::%s (pid = %" PRIu64
4114 ") suppressing state %s (old state %s): should_broadcast == false",
4115 __FUNCTION__, GetID(), StateAsCString(new_state),
4117 }
4118 }
4119}
4120
4122 EventSP event_sp;
4124 if (error.Fail())
4125 return error;
4126
4127 // Ask the process subclass to actually halt our process
4128 bool caused_stop;
4129 error = DoHalt(caused_stop);
4130
4131 DidHalt();
4132 return error;
4133}
4134
4136 bool control_only = true;
4137
4138 Log *log = GetLog(LLDBLog::Process);
4139 LLDB_LOGF(log, "Process::%s (arg = %p, pid = %" PRIu64 ") thread starting...",
4140 __FUNCTION__, static_cast<void *>(this), GetID());
4141
4142 bool exit_now = false;
4143 bool interrupt_requested = false;
4144 while (!exit_now) {
4145 EventSP event_sp;
4146 GetEventsPrivate(event_sp, std::nullopt, control_only);
4147 if (event_sp->BroadcasterIs(&m_private_state_control_broadcaster)) {
4148 LLDB_LOGF(log,
4149 "Process::%s (arg = %p, pid = %" PRIu64
4150 ") got a control event: %d",
4151 __FUNCTION__, static_cast<void *>(this), GetID(),
4152 event_sp->GetType());
4153
4154 switch (event_sp->GetType()) {
4156 exit_now = true;
4157 break; // doing any internal state management below
4158
4160 control_only = true;
4161 break;
4162
4164 control_only = false;
4165 break;
4166 }
4167
4168 continue;
4169 } else if (event_sp->GetType() == eBroadcastBitInterrupt) {
4170 if (m_public_state.GetValue() == eStateAttaching) {
4171 LLDB_LOGF(log,
4172 "Process::%s (arg = %p, pid = %" PRIu64
4173 ") woke up with an interrupt while attaching - "
4174 "forwarding interrupt.",
4175 __FUNCTION__, static_cast<void *>(this), GetID());
4176 // The server may be spinning waiting for a process to appear, in which
4177 // case we should tell it to stop doing that. Normally, we don't NEED
4178 // to do that because we will next close the communication to the stub
4179 // and that will get it to shut down. But there are remote debugging
4180 // cases where relying on that side-effect causes the shutdown to be
4181 // flakey, so we should send a positive signal to interrupt the wait.
4185 LLDB_LOGF(log,
4186 "Process::%s (arg = %p, pid = %" PRIu64
4187 ") woke up with an interrupt - Halting.",
4188 __FUNCTION__, static_cast<void *>(this), GetID());
4190 if (error.Fail() && log)
4191 LLDB_LOGF(log,
4192 "Process::%s (arg = %p, pid = %" PRIu64
4193 ") failed to halt the process: %s",
4194 __FUNCTION__, static_cast<void *>(this), GetID(),
4195 error.AsCString());
4196 // Halt should generate a stopped event. Make a note of the fact that
4197 // we were doing the interrupt, so we can set the interrupted flag
4198 // after we receive the event. We deliberately set this to true even if
4199 // HaltPrivate failed, so that we can interrupt on the next natural
4200 // stop.
4201 interrupt_requested = true;
4202 } else {
4203 // This can happen when someone (e.g. Process::Halt) sees that we are
4204 // running and sends an interrupt request, but the process actually
4205 // stops before we receive it. In that case, we can just ignore the
4206 // request. We use m_last_broadcast_state, because the Stopped event
4207 // may not have been popped of the event queue yet, which is when the
4208 // public state gets updated.
4209 LLDB_LOGF(log,
4210 "Process::%s ignoring interrupt as we have already stopped.",
4211 __FUNCTION__);
4212 }
4213 continue;
4214 }
4215
4216 const StateType internal_state =
4218
4219 if (internal_state != eStateInvalid) {
4221 StateIsStoppedState(internal_state, true)) {
4223 m_thread_list.DiscardThreadPlans();
4224 }
4225
4226 if (interrupt_requested) {
4227 if (StateIsStoppedState(internal_state, true)) {
4228 // Only mark interrupt event if it is not thread specific async
4229 // interrupt.
4231 // We requested the interrupt, so mark this as such in the stop
4232 // event so clients can tell an interrupted process from a natural
4233 // stop
4234 ProcessEventData::SetInterruptedInEvent(event_sp.get(), true);
4235 }
4236 interrupt_requested = false;
4237 } else if (log) {
4238 LLDB_LOGF(log,
4239 "Process::%s interrupt_requested, but a non-stopped "
4240 "state '%s' received.",
4241 __FUNCTION__, StateAsCString(internal_state));
4242 }
4243 }
4244
4245 HandlePrivateEvent(event_sp);
4246 }
4247
4248 if (internal_state == eStateInvalid || internal_state == eStateExited ||
4249 internal_state == eStateDetached) {
4250 LLDB_LOGF(log,
4251 "Process::%s (arg = %p, pid = %" PRIu64
4252 ") about to exit with internal state %s...",
4253 __FUNCTION__, static_cast<void *>(this), GetID(),
4254 StateAsCString(internal_state));
4255
4256 break;
4257 }
4258 }
4259
4260 // Verify log is still enabled before attempting to write to it...
4261 LLDB_LOGF(log, "Process::%s (arg = %p, pid = %" PRIu64 ") thread exiting...",
4262 __FUNCTION__, static_cast<void *>(this), GetID());
4263
4264 // If we are a secondary thread, then the primary thread we are working for
4265 // will have already acquired the public_run_lock, and isn't done with what
4266 // it was doing yet, so don't try to change it on the way out.
4267 if (!is_secondary_thread)
4268 m_public_run_lock.SetStopped();
4269 return {};
4270}
4271
4272// Process Event Data
4273
4275
4277 StateType state)
4278 : EventData(), m_process_wp(), m_state(state) {
4279 if (process_sp)
4280 m_process_wp = process_sp;
4281}
4282
4284
4286 return "Process::ProcessEventData";
4287}
4288
4292
4294 bool &found_valid_stopinfo) {
4295 found_valid_stopinfo = false;
4296
4297 ProcessSP process_sp(m_process_wp.lock());
4298 if (!process_sp)
4299 return false;
4300
4301 ThreadList &curr_thread_list = process_sp->GetThreadList();
4302 uint32_t num_threads = curr_thread_list.GetSize();
4303
4304 // The actions might change one of the thread's stop_info's opinions about
4305 // whether we should stop the process, so we need to query that as we go.
4306
4307 // One other complication here, is that we try to catch any case where the
4308 // target has run (except for expressions) and immediately exit, but if we
4309 // get that wrong (which is possible) then the thread list might have
4310 // changed, and that would cause our iteration here to crash. We could
4311 // make a copy of the thread list, but we'd really like to also know if it
4312 // has changed at all, so we store the original thread ID's of all threads and
4313 // check what we get back against this list & bag out if anything differs.
4314 std::vector<std::pair<ThreadSP, size_t>> not_suspended_threads;
4315 for (uint32_t idx = 0; idx < num_threads; ++idx) {
4316 lldb::ThreadSP thread_sp = curr_thread_list.GetThreadAtIndex(idx);
4317
4318 /*
4319 Filter out all suspended threads, they could not be the reason
4320 of stop and no need to perform any actions on them.
4321 */
4322 if (thread_sp->GetResumeState() != eStateSuspended)
4323 not_suspended_threads.emplace_back(thread_sp, thread_sp->GetIndexID());
4324 }
4325
4326 // Use this to track whether we should continue from here. We will only
4327 // continue the target running if no thread says we should stop. Of course
4328 // if some thread's PerformAction actually sets the target running, then it
4329 // doesn't matter what the other threads say...
4330
4331 bool still_should_stop = false;
4332
4333 // Sometimes - for instance if we have a bug in the stub we are talking to,
4334 // we stop but no thread has a valid stop reason. In that case we should
4335 // just stop, because we have no way of telling what the right thing to do
4336 // is, and it's better to let the user decide than continue behind their
4337 // backs.
4338
4339 for (auto [thread_sp, thread_index] : not_suspended_threads) {
4340 if (curr_thread_list.GetSize() != num_threads) {
4342 LLDB_LOGF(
4343 log,
4344 "Number of threads changed from %u to %u while processing event.",
4345 num_threads, curr_thread_list.GetSize());
4346 break;
4347 }
4348
4349 if (thread_sp->GetIndexID() != thread_index) {
4351 LLDB_LOG(log,
4352 "The thread {0} changed from {1} to {2} while processing event.",
4353 thread_sp.get(), thread_index, thread_sp->GetIndexID());
4354 break;
4355 }
4356
4357 StopInfoSP stop_info_sp = thread_sp->GetStopInfo();
4358 if (stop_info_sp && stop_info_sp->IsValid()) {
4359 found_valid_stopinfo = true;
4360 bool this_thread_wants_to_stop;
4361 if (stop_info_sp->GetOverrideShouldStop()) {
4362 this_thread_wants_to_stop =
4363 stop_info_sp->GetOverriddenShouldStopValue();
4364 } else {
4365 stop_info_sp->PerformAction(event_ptr);
4366 // The stop action might restart the target. If it does, then we
4367 // want to mark that in the event so that whoever is receiving it
4368 // will know to wait for the running event and reflect that state
4369 // appropriately. We also need to stop processing actions, since they
4370 // aren't expecting the target to be running.
4371
4372 // Clear the selected frame which may have been set as part of utility
4373 // expressions that have been run as part of this stop. If we didn't
4374 // clear this, then StopInfo::GetSuggestedStackFrameIndex would not
4375 // take affect when we next called SelectMostRelevantFrame.
4376 // PerformAction should not be the one setting a selected frame, instead
4377 // this should be done via GetSuggestedStackFrameIndex.
4378 thread_sp->ClearSelectedFrameIndex();
4379
4380 // FIXME: we might have run.
4381 if (stop_info_sp->HasTargetRunSinceMe()) {
4382 SetRestarted(true);
4383 break;
4384 }
4385
4386 this_thread_wants_to_stop = stop_info_sp->ShouldStop(event_ptr);
4387 }
4388
4389 if (!still_should_stop)
4390 still_should_stop = this_thread_wants_to_stop;
4391 }
4392 }
4393
4394 return still_should_stop;
4395}
4396
4398 Event *event_ptr) {
4399 // STDIO and the other async event notifications should always be forwarded.
4400 if (event_ptr->GetType() != Process::eBroadcastBitStateChanged)
4401 return true;
4402
4403 // For state changed events, if the update state is zero, we are handling
4404 // this on the private state thread. We should wait for the public event.
4405 return m_update_state == 1;
4406}
4407
4409 // We only have work to do for state changed events:
4410 if (event_ptr->GetType() != Process::eBroadcastBitStateChanged)
4411 return;
4412
4413 ProcessSP process_sp(m_process_wp.lock());
4414
4415 if (!process_sp)
4416 return;
4417
4418 // This function gets called twice for each event, once when the event gets
4419 // pulled off of the private process event queue, and then any number of
4420 // times, first when it gets pulled off of the public event queue, then other
4421 // times when we're pretending that this is where we stopped at the end of
4422 // expression evaluation. m_update_state is used to distinguish these three
4423 // cases; it is 0 when we're just pulling it off for private handling, and >
4424 // 1 for expression evaluation, and we don't want to do the breakpoint
4425 // command handling then.
4426 if (m_update_state != 1)
4427 return;
4428
4429 process_sp->SetPublicState(
4431
4432 if (m_state == eStateStopped && !m_restarted) {
4433 // Let process subclasses know we are about to do a public stop and do
4434 // anything they might need to in order to speed up register and memory
4435 // accesses.
4436 process_sp->WillPublicStop();
4437 }
4438
4439 // If this is a halt event, even if the halt stopped with some reason other
4440 // than a plain interrupt (e.g. we had already stopped for a breakpoint when
4441 // the halt request came through) don't do the StopInfo actions, as they may
4442 // end up restarting the process.
4443 if (m_interrupted)
4444 return;
4445
4446 // If we're not stopped or have restarted, then skip the StopInfo actions:
4447 if (m_state != eStateStopped || m_restarted) {
4448 return;
4449 }
4450
4451 bool does_anybody_have_an_opinion = false;
4452 bool still_should_stop = ShouldStop(event_ptr, does_anybody_have_an_opinion);
4453
4454 if (GetRestarted()) {
4455 return;
4456 }
4457
4458 if (!still_should_stop && does_anybody_have_an_opinion) {
4459 // We've been asked to continue, so do that here.
4460 SetRestarted(true);
4461 // Use the private resume method here, since we aren't changing the run
4462 // lock state.
4463 process_sp->PrivateResume();
4464 } else {
4465 bool hijacked = process_sp->IsHijackedForEvent(eBroadcastBitStateChanged) &&
4466 !process_sp->StateChangedIsHijackedForSynchronousResume();
4467
4468 if (!hijacked) {
4469 // If we didn't restart, run the Stop Hooks here.
4470 // Don't do that if state changed events aren't hooked up to the
4471 // public (or SyncResume) broadcasters. StopHooks are just for
4472 // real public stops. They might also restart the target,
4473 // so watch for that.
4474 if (process_sp->GetTarget().RunStopHooks())
4475 SetRestarted(true);
4476 }
4477 }
4478}
4479
4481 ProcessSP process_sp(m_process_wp.lock());
4482
4483 if (process_sp)
4484 s->Printf(" process = %p (pid = %" PRIu64 "), ",
4485 static_cast<void *>(process_sp.get()), process_sp->GetID());
4486 else
4487 s->PutCString(" process = NULL, ");
4488
4489 s->Printf("state = %s", StateAsCString(GetState()));
4490}
4491
4494 if (event_ptr) {
4495 const EventData *event_data = event_ptr->GetData();
4496 if (event_data &&
4498 return static_cast<const ProcessEventData *>(event_ptr->GetData());
4499 }
4500 return nullptr;
4501}
4502
4505 ProcessSP process_sp;
4506 const ProcessEventData *data = GetEventDataFromEvent(event_ptr);
4507 if (data)
4508 process_sp = data->GetProcessSP();
4509 return process_sp;
4510}
4511
4513 const ProcessEventData *data = GetEventDataFromEvent(event_ptr);
4514 if (data == nullptr)
4515 return eStateInvalid;
4516 else
4517 return data->GetState();
4518}
4519
4521 const ProcessEventData *data = GetEventDataFromEvent(event_ptr);
4522 if (data == nullptr)
4523 return false;
4524 else
4525 return data->GetRestarted();
4526}
4527
4529 bool new_value) {
4530 ProcessEventData *data =
4531 const_cast<ProcessEventData *>(GetEventDataFromEvent(event_ptr));
4532 if (data != nullptr)
4533 data->SetRestarted(new_value);
4534}
4535
4536size_t
4538 ProcessEventData *data =
4539 const_cast<ProcessEventData *>(GetEventDataFromEvent(event_ptr));
4540 if (data != nullptr)
4541 return data->GetNumRestartedReasons();
4542 else
4543 return 0;
4544}
4545
4546const char *
4548 size_t idx) {
4549 ProcessEventData *data =
4550 const_cast<ProcessEventData *>(GetEventDataFromEvent(event_ptr));
4551 if (data != nullptr)
4552 return data->GetRestartedReasonAtIndex(idx);
4553 else
4554 return nullptr;
4555}
4556
4558 const char *reason) {
4559 ProcessEventData *data =
4560 const_cast<ProcessEventData *>(GetEventDataFromEvent(event_ptr));
4561 if (data != nullptr)
4562 data->AddRestartedReason(reason);
4563}
4564
4566 const Event *event_ptr) {
4567 const ProcessEventData *data = GetEventDataFromEvent(event_ptr);
4568 if (data == nullptr)
4569 return false;
4570 else
4571 return data->GetInterrupted();
4572}
4573
4575 bool new_value) {
4576 ProcessEventData *data =
4577 const_cast<ProcessEventData *>(GetEventDataFromEvent(event_ptr));
4578 if (data != nullptr)
4579 data->SetInterrupted(new_value);
4580}
4581
4583 ProcessEventData *data =
4584 const_cast<ProcessEventData *>(GetEventDataFromEvent(event_ptr));
4585 if (data) {
4587 return true;
4588 }
4589 return false;
4590}
4591
4593
4595 exe_ctx.SetTargetPtr(&GetTarget());
4596 exe_ctx.SetProcessPtr(this);
4597 exe_ctx.SetThreadPtr(nullptr);
4598 exe_ctx.SetFramePtr(nullptr);
4599}
4600
4601// uint32_t
4602// Process::ListProcessesMatchingName (const char *name, StringList &matches,
4603// std::vector<lldb::pid_t> &pids)
4604//{
4605// return 0;
4606//}
4607//
4608// ArchSpec
4609// Process::GetArchSpecForExistingProcess (lldb::pid_t pid)
4610//{
4611// return Host::GetArchSpecForExistingProcess (pid);
4612//}
4613//
4614// ArchSpec
4615// Process::GetArchSpecForExistingProcess (const char *process_name)
4616//{
4617// return Host::GetArchSpecForExistingProcess (process_name);
4618//}
4619
4621 auto event_data_sp =
4622 std::make_shared<ProcessEventData>(shared_from_this(), GetState());
4623 return std::make_shared<Event>(event_type, event_data_sp);
4624}
4625
4626void Process::AppendSTDOUT(const char *s, size_t len) {
4627 std::lock_guard<std::recursive_mutex> guard(m_stdio_communication_mutex);
4628 m_stdout_data.append(s, len);
4630 BroadcastEventIfUnique(event_sp);
4631}
4632
4633void Process::AppendSTDERR(const char *s, size_t len) {
4634 std::lock_guard<std::recursive_mutex> guard(m_stdio_communication_mutex);
4635 m_stderr_data.append(s, len);
4637 BroadcastEventIfUnique(event_sp);
4638}
4639
4640void Process::BroadcastAsyncProfileData(const std::string &one_profile_data) {
4641 std::lock_guard<std::recursive_mutex> guard(m_profile_data_comm_mutex);
4642 m_profile_data.push_back(one_profile_data);
4644 BroadcastEventIfUnique(event_sp);
4645}
4646
4648 const StructuredDataPluginSP &plugin_sp) {
4649 auto data_sp = std::make_shared<EventDataStructuredData>(
4650 shared_from_this(), object_sp, plugin_sp);
4652}
4653
4655Process::GetStructuredDataPlugin(llvm::StringRef type_name) const {
4656 auto find_it = m_structured_data_plugin_map.find(type_name);
4657 if (find_it != m_structured_data_plugin_map.end())
4658 return find_it->second;
4659 else
4660 return StructuredDataPluginSP();
4661}
4662
4663size_t Process::GetAsyncProfileData(char *buf, size_t buf_size, Status &error) {
4664 std::lock_guard<std::recursive_mutex> guard(m_profile_data_comm_mutex);
4665 if (m_profile_data.empty())
4666 return 0;
4667
4668 std::string &one_profile_data = m_profile_data.front();
4669 size_t bytes_available = one_profile_data.size();
4670 if (bytes_available > 0) {
4671 Log *log = GetLog(LLDBLog::Process);
4672 LLDB_LOGF(log, "Process::GetProfileData (buf = %p, size = %" PRIu64 ")",
4673 static_cast<void *>(buf), static_cast<uint64_t>(buf_size));
4674 if (bytes_available > buf_size) {
4675 memcpy(buf, one_profile_data.c_str(), buf_size);
4676 one_profile_data.erase(0, buf_size);
4677 bytes_available = buf_size;
4678 } else {
4679 memcpy(buf, one_profile_data.c_str(), bytes_available);
4680 m_profile_data.erase(m_profile_data.begin());
4681 }
4682 }
4683 return bytes_available;
4684}
4685
4686// Process STDIO
4687
4688size_t Process::GetSTDOUT(char *buf, size_t buf_size, Status &error) {
4689 std::lock_guard<std::recursive_mutex> guard(m_stdio_communication_mutex);
4690 size_t bytes_available = m_stdout_data.size();
4691 if (bytes_available > 0) {
4692 Log *log = GetLog(LLDBLog::Process);
4693 LLDB_LOGF(log, "Process::GetSTDOUT (buf = %p, size = %" PRIu64 ")",
4694 static_cast<void *>(buf), static_cast<uint64_t>(buf_size));
4695 if (bytes_available > buf_size) {
4696 memcpy(buf, m_stdout_data.c_str(), buf_size);
4697 m_stdout_data.erase(0, buf_size);
4698 bytes_available = buf_size;
4699 } else {
4700 memcpy(buf, m_stdout_data.c_str(), bytes_available);
4701 m_stdout_data.clear();
4702 }
4703 }
4704 return bytes_available;
4705}
4706
4707size_t Process::GetSTDERR(char *buf, size_t buf_size, Status &error) {
4708 std::lock_guard<std::recursive_mutex> gaurd(m_stdio_communication_mutex);
4709 size_t bytes_available = m_stderr_data.size();
4710 if (bytes_available > 0) {
4711 Log *log = GetLog(LLDBLog::Process);
4712 LLDB_LOGF(log, "Process::GetSTDERR (buf = %p, size = %" PRIu64 ")",
4713 static_cast<void *>(buf), static_cast<uint64_t>(buf_size));
4714 if (bytes_available > buf_size) {
4715 memcpy(buf, m_stderr_data.c_str(), buf_size);
4716 m_stderr_data.erase(0, buf_size);
4717 bytes_available = buf_size;
4718 } else {
4719 memcpy(buf, m_stderr_data.c_str(), bytes_available);
4720 m_stderr_data.clear();
4721 }
4722 }
4723 return bytes_available;
4724}
4725
4726void Process::STDIOReadThreadBytesReceived(void *baton, const void *src,
4727 size_t src_len) {
4728 Process *process = (Process *)baton;
4729 process->AppendSTDOUT(static_cast<const char *>(src), src_len);
4730}
4731
4733public:
4734 IOHandlerProcessSTDIO(Process *process, int write_fd)
4735 : IOHandler(process->GetTarget().GetDebugger(),
4737 m_process(process),
4738 m_read_file(GetInputFD(), File::eOpenOptionReadOnly, false),
4739 m_write_file(write_fd, File::eOpenOptionWriteOnly, false) {
4740 m_pipe.CreateNew();
4741 }
4742
4743 ~IOHandlerProcessSTDIO() override = default;
4744
4745 void SetIsRunning(bool running) {
4746 std::lock_guard<std::mutex> guard(m_mutex);
4747 SetIsDone(!running);
4748 m_is_running = running;
4749 }
4750
4751 // Each IOHandler gets to run until it is done. It should read data from the
4752 // "in" and place output into "out" and "err and return when done.
4753 void Run() override {
4754 if (!m_read_file.IsValid() || !m_write_file.IsValid() ||
4755 !m_pipe.CanRead() || !m_pipe.CanWrite()) {
4756 SetIsDone(true);
4757 return;
4758 }
4759
4760 SetIsDone(false);
4761 const int read_fd = m_read_file.GetDescriptor();
4762 Terminal terminal(read_fd);
4763 TerminalState terminal_state(terminal, false);
4764 // FIXME: error handling?
4765 llvm::consumeError(terminal.SetCanonical(false));
4766 llvm::consumeError(terminal.SetEcho(false));
4767// FD_ZERO, FD_SET are not supported on windows
4768#ifndef _WIN32
4769 const int pipe_read_fd = m_pipe.GetReadFileDescriptor();
4770 SetIsRunning(true);
4771 while (true) {
4772 {
4773 std::lock_guard<std::mutex> guard(m_mutex);
4774 if (GetIsDone())
4775 break;
4776 }
4777
4778 SelectHelper select_helper;
4779 select_helper.FDSetRead(read_fd);
4780 select_helper.FDSetRead(pipe_read_fd);
4781 Status error = select_helper.Select();
4782
4783 if (error.Fail())
4784 break;
4785
4786 char ch = 0;
4787 size_t n;
4788 if (select_helper.FDIsSetRead(read_fd)) {
4789 n = 1;
4790 if (m_read_file.Read(&ch, n).Success() && n == 1) {
4791 if (m_write_file.Write(&ch, n).Fail() || n != 1)
4792 break;
4793 } else
4794 break;
4795 }
4796
4797 if (select_helper.FDIsSetRead(pipe_read_fd)) {
4798 // Consume the interrupt byte
4799 if (llvm::Expected<size_t> bytes_read = m_pipe.Read(&ch, 1)) {
4800 if (ch == 'q')
4801 break;
4802 if (ch == 'i')
4803 if (StateIsRunningState(m_process->GetState()))
4804 m_process->SendAsyncInterrupt();
4805 } else {
4806 LLDB_LOG_ERROR(GetLog(LLDBLog::Process), bytes_read.takeError(),
4807 "Pipe read failed: {0}");
4808 }
4809 }
4810 }
4811 SetIsRunning(false);
4812#endif
4813 }
4814
4815 void Cancel() override {
4816 std::lock_guard<std::mutex> guard(m_mutex);
4817 SetIsDone(true);
4818 // Only write to our pipe to cancel if we are in
4819 // IOHandlerProcessSTDIO::Run(). We can end up with a python command that
4820 // is being run from the command interpreter:
4821 //
4822 // (lldb) step_process_thousands_of_times
4823 //
4824 // In this case the command interpreter will be in the middle of handling
4825 // the command and if the process pushes and pops the IOHandler thousands
4826 // of times, we can end up writing to m_pipe without ever consuming the
4827 // bytes from the pipe in IOHandlerProcessSTDIO::Run() and end up
4828 // deadlocking when the pipe gets fed up and blocks until data is consumed.
4829 if (m_is_running) {
4830 char ch = 'q'; // Send 'q' for quit
4831 if (llvm::Error err = m_pipe.Write(&ch, 1).takeError()) {
4832 LLDB_LOG_ERROR(GetLog(LLDBLog::Process), std::move(err),
4833 "Pipe write failed: {0}");
4834 }
4835 }
4836 }
4837
4838 bool Interrupt() override {
4839 // Do only things that are safe to do in an interrupt context (like in a
4840 // SIGINT handler), like write 1 byte to a file descriptor. This will
4841 // interrupt the IOHandlerProcessSTDIO::Run() and we can look at the byte
4842 // that was written to the pipe and then call
4843 // m_process->SendAsyncInterrupt() from a much safer location in code.
4844 if (m_active) {
4845 char ch = 'i'; // Send 'i' for interrupt
4846 return !errorToBool(m_pipe.Write(&ch, 1).takeError());
4847 } else {
4848 // This IOHandler might be pushed on the stack, but not being run
4849 // currently so do the right thing if we aren't actively watching for
4850 // STDIN by sending the interrupt to the process. Otherwise the write to
4851 // the pipe above would do nothing. This can happen when the command
4852 // interpreter is running and gets a "expression ...". It will be on the
4853 // IOHandler thread and sending the input is complete to the delegate
4854 // which will cause the expression to run, which will push the process IO
4855 // handler, but not run it.
4856
4857 if (StateIsRunningState(m_process->GetState())) {
4858 m_process->SendAsyncInterrupt();
4859 return true;
4860 }
4861 }
4862 return false;
4863 }
4864
4865 void GotEOF() override {}
4866
4867protected:
4869 NativeFile m_read_file; // Read from this file (usually actual STDIN for LLDB
4870 NativeFile m_write_file; // Write to this file (usually the primary pty for
4871 // getting io to debuggee)
4873 std::mutex m_mutex;
4874 bool m_is_running = false;
4875};
4876
4878 // First set up the Read Thread for reading/handling process I/O
4879 m_stdio_communication.SetConnection(
4880 std::make_unique<ConnectionFileDescriptor>(fd, true));
4881 if (m_stdio_communication.IsConnected()) {
4882 m_stdio_communication.SetReadThreadBytesReceivedCallback(
4884 m_stdio_communication.StartReadThread();
4885
4886 // Now read thread is set up, set up input reader.
4887 {
4888 std::lock_guard<std::mutex> guard(m_process_input_reader_mutex);
4891 std::make_shared<IOHandlerProcessSTDIO>(this, fd);
4892 }
4893 }
4894}
4895
4897 std::lock_guard<std::mutex> guard(m_process_input_reader_mutex);
4898 IOHandlerSP io_handler_sp(m_process_input_reader);
4899 if (io_handler_sp)
4900 return GetTarget().GetDebugger().IsTopIOHandler(io_handler_sp);
4901 return false;
4902}
4903
4905 std::lock_guard<std::mutex> guard(m_process_input_reader_mutex);
4906 IOHandlerSP io_handler_sp(m_process_input_reader);
4907 if (io_handler_sp) {
4908 Log *log = GetLog(LLDBLog::Process);
4909 LLDB_LOGF(log, "Process::%s pushing IO handler", __FUNCTION__);
4910
4911 io_handler_sp->SetIsDone(false);
4912 // If we evaluate an utility function, then we don't cancel the current
4913 // IOHandler. Our IOHandler is non-interactive and shouldn't disturb the
4914 // existing IOHandler that potentially provides the user interface (e.g.
4915 // the IOHandler for Editline).
4916 bool cancel_top_handler = !m_mod_id.IsRunningUtilityFunction();
4917 GetTarget().GetDebugger().RunIOHandlerAsync(io_handler_sp,
4918 cancel_top_handler);
4919 return true;
4920 }
4921 return false;
4922}
4923
4925 std::lock_guard<std::mutex> guard(m_process_input_reader_mutex);
4926 IOHandlerSP io_handler_sp(m_process_input_reader);
4927 if (io_handler_sp)
4928 return GetTarget().GetDebugger().RemoveIOHandler(io_handler_sp);
4929 return false;
4930}
4931
4932// The process needs to know about installed plug-ins
4934
4936
4937namespace {
4938// RestorePlanState is used to record the "is private", "is controlling" and
4939// "okay
4940// to discard" fields of the plan we are running, and reset it on Clean or on
4941// destruction. It will only reset the state once, so you can call Clean and
4942// then monkey with the state and it won't get reset on you again.
4943
4944class RestorePlanState {
4945public:
4946 RestorePlanState(lldb::ThreadPlanSP thread_plan_sp)
4947 : m_thread_plan_sp(thread_plan_sp) {
4948 if (m_thread_plan_sp) {
4949 m_private = m_thread_plan_sp->GetPrivate();
4950 m_is_controlling = m_thread_plan_sp->IsControllingPlan();
4951 m_okay_to_discard = m_thread_plan_sp->OkayToDiscard();
4952 }
4953 }
4954
4955 ~RestorePlanState() { Clean(); }
4956
4957 void Clean() {
4958 if (!m_already_reset && m_thread_plan_sp) {
4959 m_already_reset = true;
4960 m_thread_plan_sp->SetPrivate(m_private);
4961 m_thread_plan_sp->SetIsControllingPlan(m_is_controlling);
4962 m_thread_plan_sp->SetOkayToDiscard(m_okay_to_discard);
4963 }
4964 }
4965
4966private:
4967 lldb::ThreadPlanSP m_thread_plan_sp;
4968 bool m_already_reset = false;
4969 bool m_private = false;
4970 bool m_is_controlling = false;
4971 bool m_okay_to_discard = false;
4972};
4973} // anonymous namespace
4974
4975static microseconds
4977 const milliseconds default_one_thread_timeout(250);
4978
4979 // If the overall wait is forever, then we don't need to worry about it.
4980 if (!options.GetTimeout()) {
4981 return options.GetOneThreadTimeout() ? *options.GetOneThreadTimeout()
4982 : default_one_thread_timeout;
4983 }
4984
4985 // If the one thread timeout is set, use it.
4986 if (options.GetOneThreadTimeout())
4987 return *options.GetOneThreadTimeout();
4988
4989 // Otherwise use half the total timeout, bounded by the
4990 // default_one_thread_timeout.
4991 return std::min<microseconds>(default_one_thread_timeout,
4992 *options.GetTimeout() / 2);
4993}
4994
4995static Timeout<std::micro>
4997 bool before_first_timeout) {
4998 // If we are going to run all threads the whole time, or if we are only going
4999 // to run one thread, we can just return the overall timeout.
5000 if (!options.GetStopOthers() || !options.GetTryAllThreads())
5001 return options.GetTimeout();
5002
5003 if (before_first_timeout)
5004 return GetOneThreadExpressionTimeout(options);
5005
5006 if (!options.GetTimeout())
5007 return std::nullopt;
5008 else
5009 return *options.GetTimeout() - GetOneThreadExpressionTimeout(options);
5010}
5011
5012static std::optional<ExpressionResults>
5013HandleStoppedEvent(lldb::tid_t thread_id, const ThreadPlanSP &thread_plan_sp,
5014 RestorePlanState &restorer, const EventSP &event_sp,
5015 EventSP &event_to_broadcast_sp,
5016 const EvaluateExpressionOptions &options,
5017 bool handle_interrupts) {
5019
5020 ThreadSP thread_sp = thread_plan_sp->GetTarget()
5021 .GetProcessSP()
5022 ->GetThreadList()
5023 .FindThreadByID(thread_id);
5024 if (!thread_sp) {
5025 LLDB_LOG(log,
5026 "The thread on which we were running the "
5027 "expression: tid = {0}, exited while "
5028 "the expression was running.",
5029 thread_id);
5031 }
5032
5033 ThreadPlanSP plan = thread_sp->GetCompletedPlan();
5034 if (plan == thread_plan_sp && plan->PlanSucceeded()) {
5035 LLDB_LOG(log, "execution completed successfully");
5036
5037 // Restore the plan state so it will get reported as intended when we are
5038 // done.
5039 restorer.Clean();
5040 return eExpressionCompleted;
5041 }
5042
5043 StopInfoSP stop_info_sp = thread_sp->GetStopInfo();
5044 if (stop_info_sp && stop_info_sp->GetStopReason() == eStopReasonBreakpoint &&
5045 stop_info_sp->ShouldNotify(event_sp.get())) {
5046 LLDB_LOG(log, "stopped for breakpoint: {0}.", stop_info_sp->GetDescription());
5047 if (!options.DoesIgnoreBreakpoints()) {
5048 // Restore the plan state and then force Private to false. We are going
5049 // to stop because of this plan so we need it to become a public plan or
5050 // it won't report correctly when we continue to its termination later
5051 // on.
5052 restorer.Clean();
5053 thread_plan_sp->SetPrivate(false);
5054 event_to_broadcast_sp = event_sp;
5055 }
5057 }
5058
5059 if (!handle_interrupts &&
5061 return std::nullopt;
5062
5063 LLDB_LOG(log, "thread plan did not successfully complete");
5064 if (!options.DoesUnwindOnError())
5065 event_to_broadcast_sp = event_sp;
5067}
5068
5071 lldb::ThreadPlanSP &thread_plan_sp,
5072 const EvaluateExpressionOptions &options,
5073 DiagnosticManager &diagnostic_manager) {
5075
5076 std::lock_guard<std::mutex> run_thread_plan_locker(m_run_thread_plan_lock);
5077
5078 if (!thread_plan_sp) {
5079 diagnostic_manager.PutString(
5080 lldb::eSeverityError, "RunThreadPlan called with empty thread plan.");
5081 return eExpressionSetupError;
5082 }
5083
5084 if (!thread_plan_sp->ValidatePlan(nullptr)) {
5085 diagnostic_manager.PutString(
5087 "RunThreadPlan called with an invalid thread plan.");
5088 return eExpressionSetupError;
5089 }
5090
5091 if (exe_ctx.GetProcessPtr() != this) {
5092 diagnostic_manager.PutString(lldb::eSeverityError,
5093 "RunThreadPlan called on wrong process.");
5094 return eExpressionSetupError;
5095 }
5096
5097 Thread *thread = exe_ctx.GetThreadPtr();
5098 if (thread == nullptr) {
5099 diagnostic_manager.PutString(lldb::eSeverityError,
5100 "RunThreadPlan called with invalid thread.");
5101 return eExpressionSetupError;
5102 }
5103
5104 // Record the thread's id so we can tell when a thread we were using
5105 // to run the expression exits during the expression evaluation.
5106 lldb::tid_t expr_thread_id = thread->GetID();
5107
5108 // We need to change some of the thread plan attributes for the thread plan
5109 // runner. This will restore them when we are done:
5110
5111 RestorePlanState thread_plan_restorer(thread_plan_sp);
5112
5113 // We rely on the thread plan we are running returning "PlanCompleted" if
5114 // when it successfully completes. For that to be true the plan can't be
5115 // private - since private plans suppress themselves in the GetCompletedPlan
5116 // call.
5117
5118 thread_plan_sp->SetPrivate(false);
5119
5120 // The plans run with RunThreadPlan also need to be terminal controlling plans
5121 // or when they are done we will end up asking the plan above us whether we
5122 // should stop, which may give the wrong answer.
5123
5124 thread_plan_sp->SetIsControllingPlan(true);
5125 thread_plan_sp->SetOkayToDiscard(false);
5126
5127 // If we are running some utility expression for LLDB, we now have to mark
5128 // this in the ProcesModID of this process. This RAII takes care of marking
5129 // and reverting the mark it once we are done running the expression.
5130 UtilityFunctionScope util_scope(options.IsForUtilityExpr() ? this : nullptr);
5131
5132 if (m_private_state.GetValue() != eStateStopped) {
5133 diagnostic_manager.PutString(
5135 "RunThreadPlan called while the private state was not stopped.");
5136 return eExpressionSetupError;
5137 }
5138
5139 // Save the thread & frame from the exe_ctx for restoration after we run
5140 const uint32_t thread_idx_id = thread->GetIndexID();
5141 StackFrameSP selected_frame_sp =
5142 thread->GetSelectedFrame(DoNoSelectMostRelevantFrame);
5143 if (!selected_frame_sp) {
5144 thread->SetSelectedFrame(nullptr);
5145 selected_frame_sp = thread->GetSelectedFrame(DoNoSelectMostRelevantFrame);
5146 if (!selected_frame_sp) {
5147 diagnostic_manager.Printf(
5149 "RunThreadPlan called without a selected frame on thread %d",
5150 thread_idx_id);
5151 return eExpressionSetupError;
5152 }
5153 }
5154
5155 // Make sure the timeout values make sense. The one thread timeout needs to
5156 // be smaller than the overall timeout.
5157 if (options.GetOneThreadTimeout() && options.GetTimeout() &&
5158 *options.GetTimeout() < *options.GetOneThreadTimeout()) {
5159 diagnostic_manager.PutString(lldb::eSeverityError,
5160 "RunThreadPlan called with one thread "
5161 "timeout greater than total timeout");
5162 return eExpressionSetupError;
5163 }
5164
5165 // If the ExecutionContext has a frame, we want to make sure to save/restore
5166 // that frame into exe_ctx. This can happen when we run expressions from a
5167 // non-selected SBFrame, in which case we don't want some thread-plan
5168 // to overwrite the ExecutionContext frame.
5169 StackID ctx_frame_id = exe_ctx.HasFrameScope()
5170 ? exe_ctx.GetFrameRef().GetStackID()
5171 : selected_frame_sp->GetStackID();
5172
5173 // N.B. Running the target may unset the currently selected thread and frame.
5174 // We don't want to do that either, so we should arrange to reset them as
5175 // well.
5176
5177 lldb::ThreadSP selected_thread_sp = GetThreadList().GetSelectedThread();
5178
5179 uint32_t selected_tid;
5180 StackID selected_stack_id;
5181 if (selected_thread_sp) {
5182 selected_tid = selected_thread_sp->GetIndexID();
5183 selected_stack_id =
5184 selected_thread_sp->GetSelectedFrame(DoNoSelectMostRelevantFrame)
5185 ->GetStackID();
5186 } else {
5187 selected_tid = LLDB_INVALID_THREAD_ID;
5188 }
5189
5190 HostThread backup_private_state_thread;
5191 lldb::StateType old_state = eStateInvalid;
5192 lldb::ThreadPlanSP stopper_base_plan_sp;
5193
5195 if (m_private_state_thread.EqualsThread(Host::GetCurrentThread())) {
5196 // Yikes, we are running on the private state thread! So we can't wait for
5197 // public events on this thread, since we are the thread that is generating
5198 // public events. The simplest thing to do is to spin up a temporary thread
5199 // to handle private state thread events while we are fielding public
5200 // events here.
5201 LLDB_LOGF(log, "Running thread plan on private state thread, spinning up "
5202 "another state thread to handle the events.");
5203
5204 backup_private_state_thread = m_private_state_thread;
5205
5206 // One other bit of business: we want to run just this thread plan and
5207 // anything it pushes, and then stop, returning control here. But in the
5208 // normal course of things, the plan above us on the stack would be given a
5209 // shot at the stop event before deciding to stop, and we don't want that.
5210 // So we insert a "stopper" base plan on the stack before the plan we want
5211 // to run. Since base plans always stop and return control to the user,
5212 // that will do just what we want.
5213 stopper_base_plan_sp.reset(new ThreadPlanBase(*thread));
5214 thread->QueueThreadPlan(stopper_base_plan_sp, false);
5215 // Have to make sure our public state is stopped, since otherwise the
5216 // reporting logic below doesn't work correctly.
5217 old_state = m_public_state.GetValue();
5218 m_public_state.SetValueNoLock(eStateStopped);
5219
5220 // Now spin up the private state thread:
5222 }
5223
5224 thread->QueueThreadPlan(
5225 thread_plan_sp, false); // This used to pass "true" does that make sense?
5226
5227 if (options.GetDebug()) {
5228 // In this case, we aren't actually going to run, we just want to stop
5229 // right away. Flush this thread so we will refetch the stacks and show the
5230 // correct backtrace.
5231 // FIXME: To make this prettier we should invent some stop reason for this,
5232 // but that
5233 // is only cosmetic, and this functionality is only of use to lldb
5234 // developers who can live with not pretty...
5235 thread->Flush();
5237 }
5238
5239 ListenerSP listener_sp(
5240 Listener::MakeListener("lldb.process.listener.run-thread-plan"));
5241
5242 lldb::EventSP event_to_broadcast_sp;
5243
5244 {
5245 // This process event hijacker Hijacks the Public events and its destructor
5246 // makes sure that the process events get restored on exit to the function.
5247 //
5248 // If the event needs to propagate beyond the hijacker (e.g., the process
5249 // exits during execution), then the event is put into
5250 // event_to_broadcast_sp for rebroadcasting.
5251
5252 ProcessEventHijacker run_thread_plan_hijacker(*this, listener_sp);
5253
5254 if (log) {
5255 StreamString s;
5256 thread_plan_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose);
5257 LLDB_LOGF(log,
5258 "Process::RunThreadPlan(): Resuming thread %u - 0x%4.4" PRIx64
5259 " to run thread plan \"%s\".",
5260 thread_idx_id, expr_thread_id, s.GetData());
5261 }
5262
5263 bool got_event;
5264 lldb::EventSP event_sp;
5266
5267 bool before_first_timeout = true; // This is set to false the first time
5268 // that we have to halt the target.
5269 bool do_resume = true;
5270 bool handle_running_event = true;
5271
5272 // This is just for accounting:
5273 uint32_t num_resumes = 0;
5274
5275 // If we are going to run all threads the whole time, or if we are only
5276 // going to run one thread, then we don't need the first timeout. So we
5277 // pretend we are after the first timeout already.
5278 if (!options.GetStopOthers() || !options.GetTryAllThreads())
5279 before_first_timeout = false;
5280
5281 LLDB_LOGF(log, "Stop others: %u, try all: %u, before_first: %u.\n",
5282 options.GetStopOthers(), options.GetTryAllThreads(),
5283 before_first_timeout);
5284
5285 // This isn't going to work if there are unfetched events on the queue. Are
5286 // there cases where we might want to run the remaining events here, and
5287 // then try to call the function? That's probably being too tricky for our
5288 // own good.
5289
5290 Event *other_events = listener_sp->PeekAtNextEvent();
5291 if (other_events != nullptr) {
5292 diagnostic_manager.PutString(
5294 "RunThreadPlan called with pending events on the queue.");
5295 return eExpressionSetupError;
5296 }
5297
5298 // We also need to make sure that the next event is delivered. We might be
5299 // calling a function as part of a thread plan, in which case the last
5300 // delivered event could be the running event, and we don't want event
5301 // coalescing to cause us to lose OUR running event...
5303
5304// This while loop must exit out the bottom, there's cleanup that we need to do
5305// when we are done. So don't call return anywhere within it.
5306
5307#ifdef LLDB_RUN_THREAD_HALT_WITH_EVENT
5308 // It's pretty much impossible to write test cases for things like: One
5309 // thread timeout expires, I go to halt, but the process already stopped on
5310 // the function call stop breakpoint. Turning on this define will make us
5311 // not fetch the first event till after the halt. So if you run a quick
5312 // function, it will have completed, and the completion event will be
5313 // waiting, when you interrupt for halt. The expression evaluation should
5314 // still succeed.
5315 bool miss_first_event = true;
5316#endif
5317 while (true) {
5318 // We usually want to resume the process if we get to the top of the
5319 // loop. The only exception is if we get two running events with no
5320 // intervening stop, which can happen, we will just wait for then next
5321 // stop event.
5322 LLDB_LOGF(log,
5323 "Top of while loop: do_resume: %i handle_running_event: %i "
5324 "before_first_timeout: %i.",
5325 do_resume, handle_running_event, before_first_timeout);
5326
5327 if (do_resume || handle_running_event) {
5328 // Do the initial resume and wait for the running event before going
5329 // further.
5330
5331 if (do_resume) {
5332 num_resumes++;
5333 Status resume_error = PrivateResume();
5334 if (!resume_error.Success()) {
5335 diagnostic_manager.Printf(
5337 "couldn't resume inferior the %d time: \"%s\".", num_resumes,
5338 resume_error.AsCString());
5339 return_value = eExpressionSetupError;
5340 break;
5341 }
5342 }
5343
5344 got_event =
5345 listener_sp->GetEvent(event_sp, GetUtilityExpressionTimeout());
5346 if (!got_event) {
5347 LLDB_LOGF(log,
5348 "Process::RunThreadPlan(): didn't get any event after "
5349 "resume %" PRIu32 ", exiting.",
5350 num_resumes);
5351
5352 diagnostic_manager.Printf(lldb::eSeverityError,
5353 "didn't get any event after resume %" PRIu32
5354 ", exiting.",
5355 num_resumes);
5356 return_value = eExpressionSetupError;
5357 break;
5358 }
5359
5360 stop_state =
5362
5363 if (stop_state != eStateRunning) {
5364 bool restarted = false;
5365
5366 if (stop_state == eStateStopped) {
5368 event_sp.get());
5369 LLDB_LOGF(
5370 log,
5371 "Process::RunThreadPlan(): didn't get running event after "
5372 "resume %d, got %s instead (restarted: %i, do_resume: %i, "
5373 "handle_running_event: %i).",
5374 num_resumes, StateAsCString(stop_state), restarted, do_resume,
5375 handle_running_event);
5376 }
5377
5378 if (restarted) {
5379 // This is probably an overabundance of caution, I don't think I
5380 // should ever get a stopped & restarted event here. But if I do,
5381 // the best thing is to Halt and then get out of here.
5382 const bool clear_thread_plans = false;
5383 const bool use_run_lock = false;
5384 Halt(clear_thread_plans, use_run_lock);
5385 }
5386
5387 diagnostic_manager.Printf(
5389 "didn't get running event after initial resume, got %s instead.",
5390 StateAsCString(stop_state));
5391 return_value = eExpressionSetupError;
5392 break;
5393 }
5394
5395 if (log)
5396 log->PutCString("Process::RunThreadPlan(): resuming succeeded.");
5397 // We need to call the function synchronously, so spin waiting for it
5398 // to return. If we get interrupted while executing, we're going to
5399 // lose our context, and won't be able to gather the result at this
5400 // point. We set the timeout AFTER the resume, since the resume takes
5401 // some time and we don't want to charge that to the timeout.
5402 } else {
5403 if (log)
5404 log->PutCString("Process::RunThreadPlan(): waiting for next event.");
5405 }
5406
5407 do_resume = true;
5408 handle_running_event = true;
5409
5410 // Now wait for the process to stop again:
5411 event_sp.reset();
5412
5413 Timeout<std::micro> timeout =
5414 GetExpressionTimeout(options, before_first_timeout);
5415 if (log) {
5416 if (timeout) {
5417 auto now = system_clock::now();
5418 LLDB_LOGF(log,
5419 "Process::RunThreadPlan(): about to wait - now is %s - "
5420 "endpoint is %s",
5421 llvm::to_string(now).c_str(),
5422 llvm::to_string(now + *timeout).c_str());
5423 } else {
5424 LLDB_LOGF(log, "Process::RunThreadPlan(): about to wait forever.");
5425 }
5426 }
5427
5428#ifdef LLDB_RUN_THREAD_HALT_WITH_EVENT
5429 // See comment above...
5430 if (miss_first_event) {
5431 std::this_thread::sleep_for(std::chrono::milliseconds(1));
5432 miss_first_event = false;
5433 got_event = false;
5434 } else
5435#endif
5436 got_event = listener_sp->GetEvent(event_sp, timeout);
5437
5438 if (got_event) {
5439 if (event_sp) {
5440 bool keep_going = false;
5441 if (event_sp->GetType() == eBroadcastBitInterrupt) {
5442 const bool clear_thread_plans = false;
5443 const bool use_run_lock = false;
5444 Halt(clear_thread_plans, use_run_lock);
5445 return_value = eExpressionInterrupted;
5446 diagnostic_manager.PutString(lldb::eSeverityInfo,
5447 "execution halted by user interrupt.");
5448 LLDB_LOGF(log, "Process::RunThreadPlan(): Got interrupted by "
5449 "eBroadcastBitInterrupted, exiting.");
5450 break;
5451 } else {
5452 stop_state =
5454 LLDB_LOGF(log,
5455 "Process::RunThreadPlan(): in while loop, got event: %s.",
5456 StateAsCString(stop_state));
5457
5458 switch (stop_state) {
5459 case lldb::eStateStopped: {
5461 event_sp.get())) {
5462 // If we were restarted, we just need to go back up to fetch
5463 // another event.
5464 LLDB_LOGF(log, "Process::RunThreadPlan(): Got a stop and "
5465 "restart, so we'll continue waiting.");
5466 keep_going = true;
5467 do_resume = false;
5468 handle_running_event = true;
5469 } else {
5470 const bool handle_interrupts = true;
5471 return_value = *HandleStoppedEvent(
5472 expr_thread_id, thread_plan_sp, thread_plan_restorer,
5473 event_sp, event_to_broadcast_sp, options,
5474 handle_interrupts);
5475 if (return_value == eExpressionThreadVanished)
5476 keep_going = false;
5477 }
5478 } break;
5479
5481 // This shouldn't really happen, but sometimes we do get two
5482 // running events without an intervening stop, and in that case
5483 // we should just go back to waiting for the stop.
5484 do_resume = false;
5485 keep_going = true;
5486 handle_running_event = false;
5487 break;
5488
5489 default:
5490 LLDB_LOGF(log,
5491 "Process::RunThreadPlan(): execution stopped with "
5492 "unexpected state: %s.",
5493 StateAsCString(stop_state));
5494
5495 if (stop_state == eStateExited)
5496 event_to_broadcast_sp = event_sp;
5497
5498 diagnostic_manager.PutString(
5500 "execution stopped with unexpected state.");
5501 return_value = eExpressionInterrupted;
5502 break;
5503 }
5504 }
5505
5506 if (keep_going)
5507 continue;
5508 else
5509 break;
5510 } else {
5511 if (log)
5512 log->PutCString("Process::RunThreadPlan(): got_event was true, but "
5513 "the event pointer was null. How odd...");
5514 return_value = eExpressionInterrupted;
5515 break;
5516 }
5517 } else {
5518 // If we didn't get an event that means we've timed out... We will
5519 // interrupt the process here. Depending on what we were asked to do
5520 // we will either exit, or try with all threads running for the same
5521 // timeout.
5522
5523 if (log) {
5524 if (options.GetTryAllThreads()) {
5525 if (before_first_timeout) {
5526 LLDB_LOG(log,
5527 "Running function with one thread timeout timed out.");
5528 } else
5529 LLDB_LOG(log, "Restarting function with all threads enabled and "
5530 "timeout: {0} timed out, abandoning execution.",
5531 timeout);
5532 } else
5533 LLDB_LOG(log, "Running function with timeout: {0} timed out, "
5534 "abandoning execution.",
5535 timeout);
5536 }
5537
5538 // It is possible that between the time we issued the Halt, and we get
5539 // around to calling Halt the target could have stopped. That's fine,
5540 // Halt will figure that out and send the appropriate Stopped event.
5541 // BUT it is also possible that we stopped & restarted (e.g. hit a
5542 // signal with "stop" set to false.) In
5543 // that case, we'll get the stopped & restarted event, and we should go
5544 // back to waiting for the Halt's stopped event. That's what this
5545 // while loop does.
5546
5547 bool back_to_top = true;
5548 uint32_t try_halt_again = 0;
5549 bool do_halt = true;
5550 const uint32_t num_retries = 5;
5551 while (try_halt_again < num_retries) {
5552 Status halt_error;
5553 if (do_halt) {
5554 LLDB_LOGF(log, "Process::RunThreadPlan(): Running Halt.");
5555 const bool clear_thread_plans = false;
5556 const bool use_run_lock = false;
5557 Halt(clear_thread_plans, use_run_lock);
5558 }
5559 if (halt_error.Success()) {
5560 if (log)
5561 log->PutCString("Process::RunThreadPlan(): Halt succeeded.");
5562
5563 got_event =
5564 listener_sp->GetEvent(event_sp, GetUtilityExpressionTimeout());
5565
5566 if (got_event) {
5567 stop_state =
5569 if (log) {
5570 LLDB_LOGF(log,
5571 "Process::RunThreadPlan(): Stopped with event: %s",
5572 StateAsCString(stop_state));
5573 if (stop_state == lldb::eStateStopped &&
5575 event_sp.get()))
5576 log->PutCString(" Event was the Halt interruption event.");
5577 }
5578
5579 if (stop_state == lldb::eStateStopped) {
5581 event_sp.get())) {
5582 if (log)
5583 log->PutCString("Process::RunThreadPlan(): Went to halt "
5584 "but got a restarted event, there must be "
5585 "an un-restarted stopped event so try "
5586 "again... "
5587 "Exiting wait loop.");
5588 try_halt_again++;
5589 do_halt = false;
5590 continue;
5591 }
5592
5593 // Between the time we initiated the Halt and the time we
5594 // delivered it, the process could have already finished its
5595 // job. Check that here:
5596 const bool handle_interrupts = false;
5597 if (auto result = HandleStoppedEvent(
5598 expr_thread_id, thread_plan_sp, thread_plan_restorer,
5599 event_sp, event_to_broadcast_sp, options,
5600 handle_interrupts)) {
5601 return_value = *result;
5602 back_to_top = false;
5603 break;
5604 }
5605
5606 if (!options.GetTryAllThreads()) {
5607 if (log)
5608 log->PutCString("Process::RunThreadPlan(): try_all_threads "
5609 "was false, we stopped so now we're "
5610 "quitting.");
5611 return_value = eExpressionInterrupted;
5612 back_to_top = false;
5613 break;
5614 }
5615
5616 if (before_first_timeout) {
5617 // Set all the other threads to run, and return to the top of
5618 // the loop, which will continue;
5619 before_first_timeout = false;
5620 thread_plan_sp->SetStopOthers(false);
5621 if (log)
5622 log->PutCString(
5623 "Process::RunThreadPlan(): about to resume.");
5624
5625 back_to_top = true;
5626 break;
5627 } else {
5628 // Running all threads failed, so return Interrupted.
5629 if (log)
5630 log->PutCString("Process::RunThreadPlan(): running all "
5631 "threads timed out.");
5632 return_value = eExpressionInterrupted;
5633 back_to_top = false;
5634 break;
5635 }
5636 }
5637 } else {
5638 if (log)
5639 log->PutCString("Process::RunThreadPlan(): halt said it "
5640 "succeeded, but I got no event. "
5641 "I'm getting out of here passing Interrupted.");
5642 return_value = eExpressionInterrupted;
5643 back_to_top = false;
5644 break;
5645 }
5646 } else {
5647 try_halt_again++;
5648 continue;
5649 }
5650 }
5651
5652 if (!back_to_top || try_halt_again > num_retries)
5653 break;
5654 else
5655 continue;
5656 }
5657 } // END WAIT LOOP
5658
5659 // If we had to start up a temporary private state thread to run this
5660 // thread plan, shut it down now.
5661 if (backup_private_state_thread.IsJoinable()) {
5663 Status error;
5664 m_private_state_thread = backup_private_state_thread;
5665 if (stopper_base_plan_sp) {
5666 thread->DiscardThreadPlansUpToPlan(stopper_base_plan_sp);
5667 }
5668 if (old_state != eStateInvalid)
5669 m_public_state.SetValueNoLock(old_state);
5670 }
5671
5672 // If our thread went away on us, we need to get out of here without
5673 // doing any more work. We don't have to clean up the thread plan, that
5674 // will have happened when the Thread was destroyed.
5675 if (return_value == eExpressionThreadVanished) {
5676 return return_value;
5677 }
5678
5679 if (return_value != eExpressionCompleted && log) {
5680 // Print a backtrace into the log so we can figure out where we are:
5681 StreamString s;
5682 s.PutCString("Thread state after unsuccessful completion: \n");
5683 thread->GetStackFrameStatus(s, 0, UINT32_MAX, true, UINT32_MAX,
5684 /*show_hidden*/ true);
5685 log->PutString(s.GetString());
5686 }
5687 // Restore the thread state if we are going to discard the plan execution.
5688 // There are three cases where this could happen: 1) The execution
5689 // successfully completed 2) We hit a breakpoint, and ignore_breakpoints
5690 // was true 3) We got some other error, and discard_on_error was true
5691 bool should_unwind = (return_value == eExpressionInterrupted &&
5692 options.DoesUnwindOnError()) ||
5693 (return_value == eExpressionHitBreakpoint &&
5694 options.DoesIgnoreBreakpoints());
5695
5696 if (return_value == eExpressionCompleted || should_unwind) {
5697 thread_plan_sp->RestoreThreadState();
5698 }
5699
5700 // Now do some processing on the results of the run:
5701 if (return_value == eExpressionInterrupted ||
5702 return_value == eExpressionHitBreakpoint) {
5703 if (log) {
5704 StreamString s;
5705 if (event_sp)
5706 event_sp->Dump(&s);
5707 else {
5708 log->PutCString("Process::RunThreadPlan(): Stop event that "
5709 "interrupted us is NULL.");
5710 }
5711
5712 StreamString ts;
5713
5714 const char *event_explanation = nullptr;
5715
5716 do {
5717 if (!event_sp) {
5718 event_explanation = "<no event>";
5719 break;
5720 } else if (event_sp->GetType() == eBroadcastBitInterrupt) {
5721 event_explanation = "<user interrupt>";
5722 break;
5723 } else {
5724 const Process::ProcessEventData *event_data =
5726 event_sp.get());
5727
5728 if (!event_data) {
5729 event_explanation = "<no event data>";
5730 break;
5731 }
5732
5733 Process *process = event_data->GetProcessSP().get();
5734
5735 if (!process) {
5736 event_explanation = "<no process>";
5737 break;
5738 }
5739
5740 ThreadList &thread_list = process->GetThreadList();
5741
5742 uint32_t num_threads = thread_list.GetSize();
5743 uint32_t thread_index;
5744
5745 ts.Printf("<%u threads> ", num_threads);
5746
5747 for (thread_index = 0; thread_index < num_threads; ++thread_index) {
5748 Thread *thread = thread_list.GetThreadAtIndex(thread_index).get();
5749
5750 if (!thread) {
5751 ts.Printf("<?> ");
5752 continue;
5753 }
5754
5755 ts.Printf("<0x%4.4" PRIx64 " ", thread->GetID());
5756 RegisterContext *register_context =
5757 thread->GetRegisterContext().get();
5758
5759 if (register_context)
5760 ts.Printf("[ip 0x%" PRIx64 "] ", register_context->GetPC());
5761 else
5762 ts.Printf("[ip unknown] ");
5763
5764 // Show the private stop info here, the public stop info will be
5765 // from the last natural stop.
5766 lldb::StopInfoSP stop_info_sp = thread->GetPrivateStopInfo();
5767 if (stop_info_sp) {
5768 const char *stop_desc = stop_info_sp->GetDescription();
5769 if (stop_desc)
5770 ts.PutCString(stop_desc);
5771 }
5772 ts.Printf(">");
5773 }
5774
5775 event_explanation = ts.GetData();
5776 }
5777 } while (false);
5778
5779 if (event_explanation)
5780 LLDB_LOGF(log,
5781 "Process::RunThreadPlan(): execution interrupted: %s %s",
5782 s.GetData(), event_explanation);
5783 else
5784 LLDB_LOGF(log, "Process::RunThreadPlan(): execution interrupted: %s",
5785 s.GetData());
5786 }
5787
5788 if (should_unwind) {
5789 LLDB_LOGF(log,
5790 "Process::RunThreadPlan: ExecutionInterrupted - "
5791 "discarding thread plans up to %p.",
5792 static_cast<void *>(thread_plan_sp.get()));
5793 thread->DiscardThreadPlansUpToPlan(thread_plan_sp);
5794 } else {
5795 LLDB_LOGF(log,
5796 "Process::RunThreadPlan: ExecutionInterrupted - for "
5797 "plan: %p not discarding.",
5798 static_cast<void *>(thread_plan_sp.get()));
5799 }
5800 } else if (return_value == eExpressionSetupError) {
5801 if (log)
5802 log->PutCString("Process::RunThreadPlan(): execution set up error.");
5803
5804 if (options.DoesUnwindOnError()) {
5805 thread->DiscardThreadPlansUpToPlan(thread_plan_sp);
5806 }
5807 } else {
5808 if (thread->IsThreadPlanDone(thread_plan_sp.get())) {
5809 if (log)
5810 log->PutCString("Process::RunThreadPlan(): thread plan is done");
5811 return_value = eExpressionCompleted;
5812 } else if (thread->WasThreadPlanDiscarded(thread_plan_sp.get())) {
5813 if (log)
5814 log->PutCString(
5815 "Process::RunThreadPlan(): thread plan was discarded");
5816 return_value = eExpressionDiscarded;
5817 } else {
5818 if (log)
5819 log->PutCString(
5820 "Process::RunThreadPlan(): thread plan stopped in mid course");
5821 if (options.DoesUnwindOnError() && thread_plan_sp) {
5822 if (log)
5823 log->PutCString("Process::RunThreadPlan(): discarding thread plan "
5824 "'cause unwind_on_error is set.");
5825 thread->DiscardThreadPlansUpToPlan(thread_plan_sp);
5826 }
5827 }
5828 }
5829
5830 // Thread we ran the function in may have gone away because we ran the
5831 // target Check that it's still there, and if it is put it back in the
5832 // context. Also restore the frame in the context if it is still present.
5833 thread = GetThreadList().FindThreadByIndexID(thread_idx_id, true).get();
5834 if (thread) {
5835 exe_ctx.SetFrameSP(thread->GetFrameWithStackID(ctx_frame_id));
5836 }
5837
5838 // Also restore the current process'es selected frame & thread, since this
5839 // function calling may be done behind the user's back.
5840
5841 if (selected_tid != LLDB_INVALID_THREAD_ID) {
5842 if (GetThreadList().SetSelectedThreadByIndexID(selected_tid) &&
5843 selected_stack_id.IsValid()) {
5844 // We were able to restore the selected thread, now restore the frame:
5845 std::lock_guard<std::recursive_mutex> guard(GetThreadList().GetMutex());
5846 StackFrameSP old_frame_sp =
5847 GetThreadList().GetSelectedThread()->GetFrameWithStackID(
5848 selected_stack_id);
5849 if (old_frame_sp)
5850 GetThreadList().GetSelectedThread()->SetSelectedFrame(
5851 old_frame_sp.get());
5852 }
5853 }
5854 }
5855
5856 // If the process exited during the run of the thread plan, notify everyone.
5857
5858 if (event_to_broadcast_sp) {
5859 if (log)
5860 log->PutCString("Process::RunThreadPlan(): rebroadcasting event.");
5861 BroadcastEvent(event_to_broadcast_sp);
5862 }
5863
5864 return return_value;
5865}
5866
5868 const StateType state = GetState();
5869 if (StateIsStoppedState(state, false)) {
5870 if (state == eStateExited) {
5871 int exit_status = GetExitStatus();
5872 const char *exit_description = GetExitDescription();
5873 strm.Printf("Process %" PRIu64 " exited with status = %i (0x%8.8x) %s\n",
5874 GetID(), exit_status, exit_status,
5875 exit_description ? exit_description : "");
5876 } else {
5877 if (state == eStateConnected)
5878 strm.Printf("Connected to remote target.\n");
5879 else
5880 strm.Printf("Process %" PRIu64 " %s\n", GetID(), StateAsCString(state));
5881 }
5882 } else {
5883 strm.Printf("Process %" PRIu64 " is running.\n", GetID());
5884 }
5885}
5886
5888 bool only_threads_with_stop_reason,
5889 uint32_t start_frame, uint32_t num_frames,
5890 uint32_t num_frames_with_source,
5891 bool stop_format) {
5892 size_t num_thread_infos_dumped = 0;
5893
5894 // You can't hold the thread list lock while calling Thread::GetStatus. That
5895 // very well might run code (e.g. if we need it to get return values or
5896 // arguments.) For that to work the process has to be able to acquire it.
5897 // So instead copy the thread ID's, and look them up one by one:
5898
5899 uint32_t num_threads;
5900 std::vector<lldb::tid_t> thread_id_array;
5901 // Scope for thread list locker;
5902 {
5903 std::lock_guard<std::recursive_mutex> guard(GetThreadList().GetMutex());
5904 ThreadList &curr_thread_list = GetThreadList();
5905 num_threads = curr_thread_list.GetSize();
5906 uint32_t idx;
5907 thread_id_array.resize(num_threads);
5908 for (idx = 0; idx < num_threads; ++idx)
5909 thread_id_array[idx] = curr_thread_list.GetThreadAtIndex(idx)->GetID();
5910 }
5911
5912 for (uint32_t i = 0; i < num_threads; i++) {
5913 ThreadSP thread_sp(GetThreadList().FindThreadByID(thread_id_array[i]));
5914 if (thread_sp) {
5915 if (only_threads_with_stop_reason) {
5916 StopInfoSP stop_info_sp = thread_sp->GetStopInfo();
5917 if (!stop_info_sp || !stop_info_sp->ShouldShow())
5918 continue;
5919 }
5920 thread_sp->GetStatus(strm, start_frame, num_frames,
5921 num_frames_with_source, stop_format,
5922 /*show_hidden*/ num_frames <= 1);
5923 ++num_thread_infos_dumped;
5924 } else {
5925 Log *log = GetLog(LLDBLog::Process);
5926 LLDB_LOGF(log, "Process::GetThreadStatus - thread 0x" PRIu64
5927 " vanished while running Thread::GetStatus.");
5928 }
5929 }
5930 return num_thread_infos_dumped;
5931}
5932
5934 m_memory_cache.AddInvalidRange(region.GetRangeBase(), region.GetByteSize());
5935}
5936
5938 return m_memory_cache.RemoveInvalidRange(region.GetRangeBase(),
5939 region.GetByteSize());
5940}
5941
5943 void *baton) {
5944 m_pre_resume_actions.push_back(PreResumeCallbackAndBaton(callback, baton));
5945}
5946
5948 bool result = true;
5949 while (!m_pre_resume_actions.empty()) {
5950 struct PreResumeCallbackAndBaton action = m_pre_resume_actions.back();
5951 m_pre_resume_actions.pop_back();
5952 bool this_result = action.callback(action.baton);
5953 if (result)
5954 result = this_result;
5955 }
5956 return result;
5957}
5958
5960
5962{
5963 PreResumeCallbackAndBaton element(callback, baton);
5964 auto found_iter = llvm::find(m_pre_resume_actions, element);
5965 if (found_iter != m_pre_resume_actions.end())
5966 {
5967 m_pre_resume_actions.erase(found_iter);
5968 }
5969}
5970
5976
5981
5983 // If we haven't started up the private state thread yet, then whatever thread
5984 // is fetching this event should be temporarily the private state thread.
5985 if (!m_private_state_thread.HasThread())
5986 return true;
5987 return m_private_state_thread.EqualsThread(Host::GetCurrentThread());
5988}
5989
5991 m_thread_list.Flush();
5992 m_extended_thread_list.Flush();
5994 m_queue_list.Clear();
5996}
5997
5999 if (uint32_t num_bits_setting = GetVirtualAddressableBits())
6000 return AddressableBits::AddressableBitToMask(num_bits_setting);
6001
6002 return m_code_address_mask;
6003}
6004
6006 if (uint32_t num_bits_setting = GetVirtualAddressableBits())
6007 return AddressableBits::AddressableBitToMask(num_bits_setting);
6008
6009 return m_data_address_mask;
6010}
6011
6020
6029
6032 "Setting Process code address mask to {0:x}", code_address_mask);
6033 m_code_address_mask = code_address_mask;
6034}
6035
6038 "Setting Process data address mask to {0:x}", data_address_mask);
6039 m_data_address_mask = data_address_mask;
6040}
6041
6044 "Setting Process highmem code address mask to {0:x}",
6045 code_address_mask);
6046 m_highmem_code_address_mask = code_address_mask;
6047}
6048
6051 "Setting Process highmem data address mask to {0:x}",
6052 data_address_mask);
6053 m_highmem_data_address_mask = data_address_mask;
6054}
6055
6057 if (ABISP abi_sp = GetABI())
6058 addr = abi_sp->FixCodeAddress(addr);
6059 return addr;
6060}
6061
6063 if (ABISP abi_sp = GetABI())
6064 addr = abi_sp->FixDataAddress(addr);
6065 return addr;
6066}
6067
6069 if (ABISP abi_sp = GetABI())
6070 addr = abi_sp->FixAnyAddress(addr);
6071 return addr;
6072}
6073
6075 Log *log = GetLog(LLDBLog::Process);
6076 LLDB_LOGF(log, "Process::%s()", __FUNCTION__);
6077
6078 Target &target = GetTarget();
6079 target.CleanupProcess();
6080 target.ClearModules(false);
6081 m_dynamic_checkers_up.reset();
6082 m_abi_sp.reset();
6083 m_system_runtime_up.reset();
6084 m_os_up.reset();
6085 m_dyld_up.reset();
6086 m_jit_loaders_up.reset();
6087 m_image_tokens.clear();
6088 // After an exec, the inferior is a new process and these memory regions are
6089 // no longer allocated.
6090 m_allocated_memory_cache.Clear(/*deallocte_memory=*/false);
6091 {
6092 std::lock_guard<std::recursive_mutex> guard(m_language_runtimes_mutex);
6093 m_language_runtimes.clear();
6094 }
6096 m_thread_list.DiscardThreadPlans();
6097 m_memory_cache.Clear(true);
6098 DoDidExec();
6100 // Flush the process (threads and all stack frames) after running
6101 // CompleteAttach() in case the dynamic loader loaded things in new
6102 // locations.
6103 Flush();
6104
6105 // After we figure out what was loaded/unloaded in CompleteAttach, we need to
6106 // let the target know so it can do any cleanup it needs to.
6107 target.DidExec();
6108}
6109
6111 if (address == nullptr) {
6112 error = Status::FromErrorString("Invalid address argument");
6113 return LLDB_INVALID_ADDRESS;
6114 }
6115
6116 addr_t function_addr = LLDB_INVALID_ADDRESS;
6117
6118 addr_t addr = address->GetLoadAddress(&GetTarget());
6119 std::map<addr_t, addr_t>::const_iterator iter =
6121 if (iter != m_resolved_indirect_addresses.end()) {
6122 function_addr = (*iter).second;
6123 } else {
6124 if (!CallVoidArgVoidPtrReturn(address, function_addr)) {
6125 Symbol *symbol = address->CalculateSymbolContextSymbol();
6127 "Unable to call resolver for indirect function %s",
6128 symbol ? symbol->GetName().AsCString() : "<UNKNOWN>");
6129 function_addr = LLDB_INVALID_ADDRESS;
6130 } else {
6131 if (ABISP abi_sp = GetABI())
6132 function_addr = abi_sp->FixCodeAddress(function_addr);
6134 std::pair<addr_t, addr_t>(addr, function_addr));
6135 }
6136 }
6137 return function_addr;
6138}
6139
6141 // Inform the system runtime of the modified modules.
6142 SystemRuntime *sys_runtime = GetSystemRuntime();
6143 if (sys_runtime)
6144 sys_runtime->ModulesDidLoad(module_list);
6145
6146 GetJITLoaders().ModulesDidLoad(module_list);
6147
6148 // Give the instrumentation runtimes a chance to be created before informing
6149 // them of the modified modules.
6152 for (auto &runtime : m_instrumentation_runtimes)
6153 runtime.second->ModulesDidLoad(module_list);
6154
6155 // Give the language runtimes a chance to be created before informing them of
6156 // the modified modules.
6157 for (const lldb::LanguageType lang_type : Language::GetSupportedLanguages()) {
6158 if (LanguageRuntime *runtime = GetLanguageRuntime(lang_type))
6159 runtime->ModulesDidLoad(module_list);
6160 }
6161
6162 // If we don't have an operating system plug-in, try to load one since
6163 // loading shared libraries might cause a new one to try and load
6164 if (!m_os_up)
6166
6167 // Inform the structured-data plugins of the modified modules.
6168 for (auto &pair : m_structured_data_plugin_map) {
6169 if (pair.second)
6170 pair.second->ModulesDidLoad(*this, module_list);
6171 }
6172}
6173
6176 return;
6177 if (!sc.module_sp || !sc.function || !sc.function->GetIsOptimized())
6178 return;
6179 sc.module_sp->ReportWarningOptimization(GetTarget().GetDebugger().GetID());
6180}
6181
6184 return;
6185 if (!sc.module_sp)
6186 return;
6187 LanguageType language = sc.GetLanguage();
6188 if (language == eLanguageTypeUnknown ||
6189 language == lldb::eLanguageTypeAssembly ||
6191 return;
6192 LanguageSet plugins =
6194 if (plugins[language])
6195 return;
6196 sc.module_sp->ReportWarningUnsupportedLanguage(
6197 language, GetTarget().GetDebugger().GetID());
6198}
6199
6201 info.Clear();
6202
6203 PlatformSP platform_sp = GetTarget().GetPlatform();
6204 if (!platform_sp)
6205 return false;
6206
6207 return platform_sp->GetProcessInfo(GetID(), info);
6208}
6209
6210lldb_private::UUID Process::FindModuleUUID(const llvm::StringRef path) {
6211 return lldb_private::UUID();
6212}
6213
6215 ThreadCollectionSP threads;
6216
6217 const MemoryHistorySP &memory_history =
6218 MemoryHistory::FindPlugin(shared_from_this());
6219
6220 if (!memory_history) {
6221 return threads;
6222 }
6223
6224 threads = std::make_shared<ThreadCollection>(
6225 memory_history->GetHistoryThreads(addr));
6226
6227 return threads;
6228}
6229
6232 InstrumentationRuntimeCollection::iterator pos;
6233 pos = m_instrumentation_runtimes.find(type);
6234 if (pos == m_instrumentation_runtimes.end()) {
6235 return InstrumentationRuntimeSP();
6236 } else
6237 return (*pos).second;
6238}
6239
6240bool Process::GetModuleSpec(const FileSpec &module_file_spec,
6241 const ArchSpec &arch, ModuleSpec &module_spec) {
6242 module_spec.Clear();
6243 return false;
6244}
6245
6247 m_image_tokens.push_back(image_ptr);
6248 return m_image_tokens.size() - 1;
6249}
6250
6252 if (token < m_image_tokens.size())
6253 return m_image_tokens[token];
6255}
6256
6257void Process::ResetImageToken(size_t token) {
6258 if (token < m_image_tokens.size())
6260}
6261
6262Address
6264 AddressRange range_bounds) {
6265 Target &target = GetTarget();
6266 DisassemblerSP disassembler_sp;
6267 InstructionList *insn_list = nullptr;
6268
6269 Address retval = default_stop_addr;
6270
6271 if (!target.GetUseFastStepping())
6272 return retval;
6273 if (!default_stop_addr.IsValid())
6274 return retval;
6275
6276 const char *plugin_name = nullptr;
6277 const char *flavor = nullptr;
6278 const char *cpu = nullptr;
6279 const char *features = nullptr;
6280 disassembler_sp = Disassembler::DisassembleRange(
6281 target.GetArchitecture(), plugin_name, flavor, cpu, features, GetTarget(),
6282 range_bounds);
6283 if (disassembler_sp)
6284 insn_list = &disassembler_sp->GetInstructionList();
6285
6286 if (insn_list == nullptr) {
6287 return retval;
6288 }
6289
6290 size_t insn_offset =
6291 insn_list->GetIndexOfInstructionAtAddress(default_stop_addr);
6292 if (insn_offset == UINT32_MAX) {
6293 return retval;
6294 }
6295
6296 uint32_t branch_index = insn_list->GetIndexOfNextBranchInstruction(
6297 insn_offset, false /* ignore_calls*/, nullptr);
6298 if (branch_index == UINT32_MAX) {
6299 return retval;
6300 }
6301
6302 if (branch_index > insn_offset) {
6303 Address next_branch_insn_address =
6304 insn_list->GetInstructionAtIndex(branch_index)->GetAddress();
6305 if (next_branch_insn_address.IsValid() &&
6306 range_bounds.ContainsFileAddress(next_branch_insn_address)) {
6307 retval = next_branch_insn_address;
6308 }
6309 }
6310
6311 return retval;
6312}
6313
6315 MemoryRegionInfo &range_info) {
6316 if (const lldb::ABISP &abi = GetABI())
6317 load_addr = abi->FixAnyAddress(load_addr);
6318 Status error = DoGetMemoryRegionInfo(load_addr, range_info);
6319 // Reject a region that does not contain the requested address.
6320 if (error.Success() && !range_info.GetRange().Contains(load_addr))
6321 error = Status::FromErrorString("Invalid memory region");
6322
6323 return error;
6324}
6325
6327 Status error;
6328
6329 lldb::addr_t range_end = 0;
6330 const lldb::ABISP &abi = GetABI();
6331
6332 region_list.clear();
6333 do {
6335 error = GetMemoryRegionInfo(range_end, region_info);
6336 // GetMemoryRegionInfo should only return an error if it is unimplemented.
6337 if (error.Fail()) {
6338 region_list.clear();
6339 break;
6340 }
6341
6342 // We only check the end address, not start and end, because we assume that
6343 // the start will not have non-address bits until the first unmappable
6344 // region. We will have exited the loop by that point because the previous
6345 // region, the last mappable region, will have non-address bits in its end
6346 // address.
6347 range_end = region_info.GetRange().GetRangeEnd();
6348 if (region_info.GetMapped() == MemoryRegionInfo::eYes) {
6349 region_list.push_back(std::move(region_info));
6350 }
6351 } while (
6352 // For a process with no non-address bits, all address bits
6353 // set means the end of memory.
6354 range_end != LLDB_INVALID_ADDRESS &&
6355 // If we have non-address bits and some are set then the end
6356 // is at or beyond the end of mappable memory.
6357 !(abi && (abi->FixAnyAddress(range_end) != range_end)));
6358
6359 return error;
6360}
6361
6362Status
6363Process::ConfigureStructuredData(llvm::StringRef type_name,
6364 const StructuredData::ObjectSP &config_sp) {
6365 // If you get this, the Process-derived class needs to implement a method to
6366 // enable an already-reported asynchronous structured data feature. See
6367 // ProcessGDBRemote for an example implementation over gdb-remote.
6368 return Status::FromErrorString("unimplemented");
6369}
6370
6372 const StructuredData::Array &supported_type_names) {
6373 Log *log = GetLog(LLDBLog::Process);
6374
6375 // Bail out early if there are no type names to map.
6376 if (supported_type_names.GetSize() == 0) {
6377 LLDB_LOG(log, "no structured data types supported");
6378 return;
6379 }
6380
6381 // These StringRefs are backed by the input parameter.
6382 std::set<llvm::StringRef> type_names;
6383
6384 LLDB_LOG(log,
6385 "the process supports the following async structured data types:");
6386
6387 supported_type_names.ForEach(
6388 [&type_names, &log](StructuredData::Object *object) {
6389 // There shouldn't be null objects in the array.
6390 if (!object)
6391 return false;
6392
6393 // All type names should be strings.
6394 const llvm::StringRef type_name = object->GetStringValue();
6395 if (type_name.empty())
6396 return false;
6397
6398 type_names.insert(type_name);
6399 LLDB_LOG(log, "- {0}", type_name);
6400 return true;
6401 });
6402
6403 // For each StructuredDataPlugin, if the plugin handles any of the types in
6404 // the supported_type_names, map that type name to that plugin. Stop when
6405 // we've consumed all the type names.
6406 // FIXME: should we return an error if there are type names nobody
6407 // supports?
6408 for (uint32_t plugin_index = 0; !type_names.empty(); plugin_index++) {
6409 auto create_instance =
6411 plugin_index);
6412 if (!create_instance)
6413 break;
6414
6415 // Create the plugin.
6416 StructuredDataPluginSP plugin_sp = (*create_instance)(*this);
6417 if (!plugin_sp) {
6418 // This plugin doesn't think it can work with the process. Move on to the
6419 // next.
6420 continue;
6421 }
6422
6423 // For any of the remaining type names, map any that this plugin supports.
6424 std::vector<llvm::StringRef> names_to_remove;
6425 for (llvm::StringRef type_name : type_names) {
6426 if (plugin_sp->SupportsStructuredDataType(type_name)) {
6428 std::make_pair(type_name, plugin_sp));
6429 names_to_remove.push_back(type_name);
6430 LLDB_LOG(log, "using plugin {0} for type name {1}",
6431 plugin_sp->GetPluginName(), type_name);
6432 }
6433 }
6434
6435 // Remove the type names that were consumed by this plugin.
6436 for (llvm::StringRef type_name : names_to_remove)
6437 type_names.erase(type_name);
6438 }
6439}
6440
6442 const StructuredData::ObjectSP object_sp) {
6443 // Nothing to do if there's no data.
6444 if (!object_sp)
6445 return false;
6446
6447 // The contract is this must be a dictionary, so we can look up the routing
6448 // key via the top-level 'type' string value within the dictionary.
6449 StructuredData::Dictionary *dictionary = object_sp->GetAsDictionary();
6450 if (!dictionary)
6451 return false;
6452
6453 // Grab the async structured type name (i.e. the feature/plugin name).
6454 llvm::StringRef type_name;
6455 if (!dictionary->GetValueForKeyAsString("type", type_name))
6456 return false;
6457
6458 // Check if there's a plugin registered for this type name.
6459 auto find_it = m_structured_data_plugin_map.find(type_name);
6460 if (find_it == m_structured_data_plugin_map.end()) {
6461 // We don't have a mapping for this structured data type.
6462 return false;
6463 }
6464
6465 // Route the structured data to the plugin.
6466 find_it->second->HandleArrivalOfStructuredData(*this, type_name, object_sp);
6467 return true;
6468}
6469
6471 // Default implementation does nothign.
6472 // No automatic signal filtering to speak of.
6473 return Status();
6474}
6475
6477 Platform *platform,
6478 llvm::function_ref<std::unique_ptr<UtilityFunction>()> factory) {
6479 if (platform != GetTarget().GetPlatform().get())
6480 return nullptr;
6481 llvm::call_once(m_dlopen_utility_func_flag_once,
6482 [&] { m_dlopen_utility_func_up = factory(); });
6483 return m_dlopen_utility_func_up.get();
6484}
6485
6486llvm::Expected<TraceSupportedResponse> Process::TraceSupported() {
6487 if (!IsLiveDebugSession())
6488 return llvm::createStringError(llvm::inconvertibleErrorCode(),
6489 "Can't trace a non-live process.");
6490 return llvm::make_error<UnimplementedError>();
6491}
6492
6494 addr_t &returned_func,
6495 bool trap_exceptions) {
6497 if (thread == nullptr || address == nullptr)
6498 return false;
6499
6501 options.SetStopOthers(true);
6502 options.SetUnwindOnError(true);
6503 options.SetIgnoreBreakpoints(true);
6504 options.SetTryAllThreads(true);
6505 options.SetDebug(false);
6507 options.SetTrapExceptions(trap_exceptions);
6508
6509 auto type_system_or_err =
6511 if (!type_system_or_err) {
6512 llvm::consumeError(type_system_or_err.takeError());
6513 return false;
6514 }
6515 auto ts = *type_system_or_err;
6516 if (!ts)
6517 return false;
6518 CompilerType void_ptr_type =
6521 *thread, *address, void_ptr_type, llvm::ArrayRef<addr_t>(), options));
6522 if (call_plan_sp) {
6523 DiagnosticManager diagnostics;
6524
6525 StackFrame *frame = thread->GetStackFrameAtIndex(0).get();
6526 if (frame) {
6527 ExecutionContext exe_ctx;
6528 frame->CalculateExecutionContext(exe_ctx);
6529 ExpressionResults result =
6530 RunThreadPlan(exe_ctx, call_plan_sp, options, diagnostics);
6531 if (result == eExpressionCompleted) {
6532 returned_func =
6533 call_plan_sp->GetReturnValueObject()->GetValueAsUnsigned(
6535
6536 if (GetAddressByteSize() == 4) {
6537 if (returned_func == UINT32_MAX)
6538 return false;
6539 } else if (GetAddressByteSize() == 8) {
6540 if (returned_func == UINT64_MAX)
6541 return false;
6542 }
6543 return true;
6544 }
6545 }
6546 }
6547
6548 return false;
6549}
6550
6551llvm::Expected<const MemoryTagManager *> Process::GetMemoryTagManager() {
6553 const MemoryTagManager *tag_manager =
6554 arch ? arch->GetMemoryTagManager() : nullptr;
6555 if (!arch || !tag_manager) {
6556 return llvm::createStringError(
6557 llvm::inconvertibleErrorCode(),
6558 "This architecture does not support memory tagging");
6559 }
6560
6561 if (!SupportsMemoryTagging()) {
6562 return llvm::createStringError(llvm::inconvertibleErrorCode(),
6563 "Process does not support memory tagging");
6564 }
6565
6566 return tag_manager;
6567}
6568
6569llvm::Expected<std::vector<lldb::addr_t>>
6571 llvm::Expected<const MemoryTagManager *> tag_manager_or_err =
6573 if (!tag_manager_or_err)
6574 return tag_manager_or_err.takeError();
6575
6576 const MemoryTagManager *tag_manager = *tag_manager_or_err;
6577 llvm::Expected<std::vector<uint8_t>> tag_data =
6578 DoReadMemoryTags(addr, len, tag_manager->GetAllocationTagType());
6579 if (!tag_data)
6580 return tag_data.takeError();
6581
6582 return tag_manager->UnpackTagsData(*tag_data,
6583 len / tag_manager->GetGranuleSize());
6584}
6585
6587 const std::vector<lldb::addr_t> &tags) {
6588 llvm::Expected<const MemoryTagManager *> tag_manager_or_err =
6590 if (!tag_manager_or_err)
6591 return Status::FromError(tag_manager_or_err.takeError());
6592
6593 const MemoryTagManager *tag_manager = *tag_manager_or_err;
6594 llvm::Expected<std::vector<uint8_t>> packed_tags =
6595 tag_manager->PackTags(tags);
6596 if (!packed_tags) {
6597 return Status::FromError(packed_tags.takeError());
6598 }
6599
6600 return DoWriteMemoryTags(addr, len, tag_manager->GetAllocationTagType(),
6601 *packed_tags);
6602}
6603
6604// Create a CoreFileMemoryRange from a MemoryRegionInfo
6607 const addr_t addr = region.GetRange().GetRangeBase();
6608 llvm::AddressRange range(addr, addr + region.GetRange().GetByteSize());
6609 return {range, region.GetLLDBPermissions()};
6610}
6611
6612// Add dirty pages to the core file ranges and return true if dirty pages
6613// were added. Return false if the dirty page information is not valid or in
6614// the region.
6616 CoreFileMemoryRanges &ranges) {
6617 const auto &dirty_page_list = region.GetDirtyPageList();
6618 if (!dirty_page_list)
6619 return false;
6620 const uint32_t lldb_permissions = region.GetLLDBPermissions();
6621 const addr_t page_size = region.GetPageSize();
6622 if (page_size == 0)
6623 return false;
6624 llvm::AddressRange range(0, 0);
6625 for (addr_t page_addr : *dirty_page_list) {
6626 if (range.empty()) {
6627 // No range yet, initialize the range with the current dirty page.
6628 range = llvm::AddressRange(page_addr, page_addr + page_size);
6629 } else {
6630 if (range.end() == page_addr) {
6631 // Combine consective ranges.
6632 range = llvm::AddressRange(range.start(), page_addr + page_size);
6633 } else {
6634 // Add previous contiguous range and init the new range with the
6635 // current dirty page.
6636 ranges.Append(range.start(), range.size(), {range, lldb_permissions});
6637 range = llvm::AddressRange(page_addr, page_addr + page_size);
6638 }
6639 }
6640 }
6641 // The last range
6642 if (!range.empty())
6643 ranges.Append(range.start(), range.size(), {range, lldb_permissions});
6644 return true;
6645}
6646
6647// Given a region, add the region to \a ranges.
6648//
6649// Only add the region if it isn't empty and if it has some permissions.
6650// If \a try_dirty_pages is true, then try to add only the dirty pages for a
6651// given region. If the region has dirty page information, only dirty pages
6652// will be added to \a ranges, else the entire range will be added to \a
6653// ranges.
6655 bool try_dirty_pages, CoreFileMemoryRanges &ranges) {
6656 // Don't add empty ranges.
6657 if (region.GetRange().GetByteSize() == 0)
6658 return;
6659 // Don't add ranges with no read permissions.
6660 if ((region.GetLLDBPermissions() & lldb::ePermissionsReadable) == 0)
6661 return;
6662 if (try_dirty_pages && AddDirtyPages(region, ranges))
6663 return;
6664
6665 ranges.Append(region.GetRange().GetRangeBase(),
6666 region.GetRange().GetByteSize(),
6668}
6669
6671 const SaveCoreOptions &options,
6672 CoreFileMemoryRanges &ranges,
6673 std::set<addr_t> &stack_ends) {
6674 DynamicLoader *dyld = process.GetDynamicLoader();
6675 if (!dyld)
6676 return;
6677
6678 std::vector<lldb_private::MemoryRegionInfo> dynamic_loader_mem_regions;
6679 std::function<bool(const lldb_private::Thread &)> save_thread_predicate =
6680 [&](const lldb_private::Thread &t) -> bool {
6681 return options.ShouldThreadBeSaved(t.GetID());
6682 };
6683 dyld->CalculateDynamicSaveCoreRanges(process, dynamic_loader_mem_regions,
6684 save_thread_predicate);
6685 for (const auto &region : dynamic_loader_mem_regions) {
6686 // The Dynamic Loader can give us regions that could include a truncated
6687 // stack
6688 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0)
6689 AddRegion(region, true, ranges);
6690 }
6691}
6692
6694 const SaveCoreOptions &core_options,
6695 const MemoryRegionInfos &regions,
6696 CoreFileMemoryRanges &ranges,
6697 std::set<addr_t> &stack_ends) {
6698 const bool try_dirty_pages = true;
6699
6700 // Before we take any dump, we want to save off the used portions of the
6701 // stacks and mark those memory regions as saved. This prevents us from saving
6702 // the unused portion of the stack below the stack pointer. Saving space on
6703 // the dump.
6704 for (lldb::ThreadSP thread_sp : process.GetThreadList().Threads()) {
6705 if (!thread_sp)
6706 continue;
6707 StackFrameSP frame_sp = thread_sp->GetStackFrameAtIndex(0);
6708 if (!frame_sp)
6709 continue;
6710 RegisterContextSP reg_ctx_sp = frame_sp->GetRegisterContext();
6711 if (!reg_ctx_sp)
6712 continue;
6713 const addr_t sp = reg_ctx_sp->GetSP();
6714 const size_t red_zone = process.GetABI()->GetRedZoneSize();
6716 if (process.GetMemoryRegionInfo(sp, sp_region).Success()) {
6717 const size_t stack_head = (sp - red_zone);
6718 const size_t stack_size = sp_region.GetRange().GetRangeEnd() - stack_head;
6719 // Even if the SaveCoreOption doesn't want us to save the stack
6720 // we still need to populate the stack_ends set so it doesn't get saved
6721 // off in other calls
6722 sp_region.GetRange().SetRangeBase(stack_head);
6723 sp_region.GetRange().SetByteSize(stack_size);
6724 const addr_t range_end = sp_region.GetRange().GetRangeEnd();
6725 stack_ends.insert(range_end);
6726 // This will return true if the threadlist the user specified is empty,
6727 // or contains the thread id from thread_sp.
6728 if (core_options.ShouldThreadBeSaved(thread_sp->GetID())) {
6729 AddRegion(sp_region, try_dirty_pages, ranges);
6730 }
6731 }
6732 }
6733}
6734
6735// Save all memory regions that are not empty or have at least some permissions
6736// for a full core file style.
6738 const MemoryRegionInfos &regions,
6739 CoreFileMemoryRanges &ranges,
6740 std::set<addr_t> &stack_ends) {
6741
6742 // Don't add only dirty pages, add full regions.
6743 const bool try_dirty_pages = false;
6744 for (const auto &region : regions)
6745 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0)
6746 AddRegion(region, try_dirty_pages, ranges);
6747}
6748
6749// Save only the dirty pages to the core file. Make sure the process has at
6750// least some dirty pages, as some OS versions don't support reporting what
6751// pages are dirty within an memory region. If no memory regions have dirty
6752// page information fall back to saving out all ranges with write permissions.
6754 const MemoryRegionInfos &regions,
6755 CoreFileMemoryRanges &ranges,
6756 std::set<addr_t> &stack_ends) {
6757
6758 // Iterate over the regions and find all dirty pages.
6759 bool have_dirty_page_info = false;
6760 for (const auto &region : regions) {
6761 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0 &&
6762 AddDirtyPages(region, ranges))
6763 have_dirty_page_info = true;
6764 }
6765
6766 if (!have_dirty_page_info) {
6767 // We didn't find support for reporting dirty pages from the process
6768 // plug-in so fall back to any region with write access permissions.
6769 const bool try_dirty_pages = false;
6770 for (const auto &region : regions)
6771 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0 &&
6772 region.GetWritable() == MemoryRegionInfo::eYes)
6773 AddRegion(region, try_dirty_pages, ranges);
6774 }
6775}
6776
6777// Save all thread stacks to the core file. Some OS versions support reporting
6778// when a memory region is stack related. We check on this information, but we
6779// also use the stack pointers of each thread and add those in case the OS
6780// doesn't support reporting stack memory. This function also attempts to only
6781// emit dirty pages from the stack if the memory regions support reporting
6782// dirty regions as this will make the core file smaller. If the process
6783// doesn't support dirty regions, then it will fall back to adding the full
6784// stack region.
6786 const MemoryRegionInfos &regions,
6787 CoreFileMemoryRanges &ranges,
6788 std::set<addr_t> &stack_ends) {
6789 const bool try_dirty_pages = true;
6790 // Some platforms support annotating the region information that tell us that
6791 // it comes from a thread stack. So look for those regions first.
6792
6793 for (const auto &region : regions) {
6794 // Save all the stack memory ranges not associated with a stack pointer.
6795 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0 &&
6796 region.IsStackMemory() == MemoryRegionInfo::eYes)
6797 AddRegion(region, try_dirty_pages, ranges);
6798 }
6799}
6800
6801// TODO: We should refactor CoreFileMemoryRanges to use the lldb range type, and
6802// then add an intersect method on it, or MemoryRegionInfo.
6803static lldb_private::MemoryRegionInfo
6806
6808 region_info.SetLLDBPermissions(lhs.GetLLDBPermissions());
6809 region_info.GetRange() = lhs.GetRange().Intersect(rhs);
6810
6811 return region_info;
6812}
6813
6815 const MemoryRegionInfos &regions,
6816 const SaveCoreOptions &options,
6817 CoreFileMemoryRanges &ranges) {
6818 const auto &option_ranges = options.GetCoreFileMemoryRanges();
6819 if (option_ranges.IsEmpty())
6820 return;
6821
6822 for (const auto &range : regions) {
6823 auto *entry = option_ranges.FindEntryThatIntersects(range.GetRange());
6824 if (entry) {
6825 if (*entry != range.GetRange()) {
6826 AddRegion(Intersect(range, *entry), true, ranges);
6827 } else {
6828 // If they match, add the range directly.
6829 AddRegion(range, true, ranges);
6830 }
6831 }
6832 }
6833}
6834
6836 CoreFileMemoryRanges &ranges) {
6838 Status err = GetMemoryRegions(regions);
6839 SaveCoreStyle core_style = options.GetStyle();
6840 if (err.Fail())
6841 return err;
6842 if (regions.empty())
6844 "failed to get any valid memory regions from the process");
6845 if (core_style == eSaveCoreUnspecified)
6847 "callers must set the core_style to something other than "
6848 "eSaveCoreUnspecified");
6849
6850 GetUserSpecifiedCoreFileSaveRanges(*this, regions, options, ranges);
6851
6852 std::set<addr_t> stack_ends;
6853 // For fully custom set ups, we don't want to even look at threads if there
6854 // are no threads specified.
6855 if (core_style != lldb::eSaveCoreCustomOnly ||
6856 options.HasSpecifiedThreads()) {
6857 SaveOffRegionsWithStackPointers(*this, options, regions, ranges,
6858 stack_ends);
6859 // Save off the dynamic loader sections, so if we are on an architecture
6860 // that supports Thread Locals, that we include those as well.
6861 SaveDynamicLoaderSections(*this, options, ranges, stack_ends);
6862 }
6863
6864 switch (core_style) {
6867 break;
6868
6869 case eSaveCoreFull:
6870 GetCoreFileSaveRangesFull(*this, regions, ranges, stack_ends);
6871 break;
6872
6873 case eSaveCoreDirtyOnly:
6874 GetCoreFileSaveRangesDirtyOnly(*this, regions, ranges, stack_ends);
6875 break;
6876
6877 case eSaveCoreStackOnly:
6878 GetCoreFileSaveRangesStackOnly(*this, regions, ranges, stack_ends);
6879 break;
6880 }
6881
6882 if (err.Fail())
6883 return err;
6884
6885 if (ranges.IsEmpty())
6887 "no valid address ranges found for core style");
6888
6889 return ranges.FinalizeCoreFileSaveRanges();
6890}
6891
6892std::vector<ThreadSP>
6894 std::vector<ThreadSP> thread_list;
6895 for (const lldb::ThreadSP &thread_sp : m_thread_list.Threads()) {
6896 if (core_options.ShouldThreadBeSaved(thread_sp->GetID())) {
6897 thread_list.push_back(thread_sp);
6898 }
6899 }
6900
6901 return thread_list;
6902}
6903
6905 uint32_t low_memory_addr_bits = bit_masks.GetLowmemAddressableBits();
6906 uint32_t high_memory_addr_bits = bit_masks.GetHighmemAddressableBits();
6907
6908 if (low_memory_addr_bits == 0 && high_memory_addr_bits == 0)
6909 return;
6910
6911 if (low_memory_addr_bits != 0) {
6912 addr_t low_addr_mask =
6913 AddressableBits::AddressableBitToMask(low_memory_addr_bits);
6914 SetCodeAddressMask(low_addr_mask);
6915 SetDataAddressMask(low_addr_mask);
6916 }
6917
6918 if (high_memory_addr_bits != 0) {
6919 addr_t high_addr_mask =
6920 AddressableBits::AddressableBitToMask(high_memory_addr_bits);
6921 SetHighmemCodeAddressMask(high_addr_mask);
6922 SetHighmemDataAddressMask(high_addr_mask);
6923 }
6924}
static llvm::raw_ostream & error(Stream &strm)
FormatEntity::Entry Entry
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
Definition Log.h:369
#define LLDB_LOGF(log,...)
Definition Log.h:376
#define LLDB_LOG_ERROR(log, error,...)
Definition Log.h:392
static void GetCoreFileSaveRangesFull(Process &process, const MemoryRegionInfos &regions, CoreFileMemoryRanges &ranges, std::set< addr_t > &stack_ends)
Definition Process.cpp:6737
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)
Definition Process.cpp:5013
static void SaveDynamicLoaderSections(Process &process, const SaveCoreOptions &options, CoreFileMemoryRanges &ranges, std::set< addr_t > &stack_ends)
Definition Process.cpp:6670
static CoreFileMemoryRange CreateCoreFileMemoryRange(const lldb_private::MemoryRegionInfo &region)
Definition Process.cpp:6606
static constexpr unsigned g_string_read_width
Definition Process.cpp:120
static bool AddDirtyPages(const lldb_private::MemoryRegionInfo &region, CoreFileMemoryRanges &ranges)
Definition Process.cpp:6615
static constexpr OptionEnumValueElement g_follow_fork_mode_values[]
Definition Process.cpp:107
static void GetUserSpecifiedCoreFileSaveRanges(Process &process, const MemoryRegionInfos &regions, const SaveCoreOptions &options, CoreFileMemoryRanges &ranges)
Definition Process.cpp:6814
static void GetCoreFileSaveRangesDirtyOnly(Process &process, const MemoryRegionInfos &regions, CoreFileMemoryRanges &ranges, std::set< addr_t > &stack_ends)
Definition Process.cpp:6753
static void AddRegion(const lldb_private::MemoryRegionInfo &region, bool try_dirty_pages, CoreFileMemoryRanges &ranges)
Definition Process.cpp:6654
static Timeout< std::micro > GetExpressionTimeout(const EvaluateExpressionOptions &options, bool before_first_timeout)
Definition Process.cpp:4996
static microseconds GetOneThreadExpressionTimeout(const EvaluateExpressionOptions &options)
Definition Process.cpp:4976
static lldb_private::MemoryRegionInfo Intersect(const lldb_private::MemoryRegionInfo &lhs, const lldb_private::MemoryRegionInfo::RangeType &rhs)
Definition Process.cpp:6804
static void SaveOffRegionsWithStackPointers(Process &process, const SaveCoreOptions &core_options, const MemoryRegionInfos &regions, CoreFileMemoryRanges &ranges, std::set< addr_t > &stack_ends)
Definition Process.cpp:6693
static void GetCoreFileSaveRangesStackOnly(Process &process, const MemoryRegionInfos &regions, CoreFileMemoryRanges &ranges, std::set< addr_t > &stack_ends)
Definition Process.cpp:6785
@ ePropertyExperimental
Definition Process.cpp:128
#define LLDB_SCOPED_TIMER()
Definition Timer.h:83
void Run() override
Definition Process.cpp:4753
void SetIsRunning(bool running)
Definition Process.cpp:4745
void Cancel() override
Definition Process.cpp:4815
~IOHandlerProcessSTDIO() override=default
void GotEOF() override
Definition Process.cpp:4865
bool Interrupt() override
Definition Process.cpp:4838
NativeFile m_write_file
Definition Process.cpp:4870
IOHandlerProcessSTDIO(Process *process, int write_fd)
Definition Process.cpp:4734
const Property * GetPropertyAtIndex(size_t idx, const ExecutionContext *exe_ctx) const override
Definition Process.cpp:88
ProcessOptionValueProperties(llvm::StringRef name)
Definition Process.cpp:85
lldb_private::Status Select()
void FDSetRead(lldb::socket_t fd)
bool FDIsSetRead(lldb::socket_t fd) const
static lldb::ABISP FindPlugin(lldb::ProcessSP process_sp, const ArchSpec &arch)
Definition ABI.cpp:27
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.
Definition Address.h:62
lldb::addr_t GetLoadAddress(Target *target) const
Get the load address.
Definition Address.cpp:301
lldb::addr_t GetOpcodeLoadAddress(Target *target, AddressClass addr_class=AddressClass::eInvalid) const
Get the load address as an opcode load address.
Definition Address.cpp:358
bool IsValid() const
Check if the object state is valid.
Definition Address.h:355
Symbol * CalculateSymbolContextSymbol() const
Definition Address.cpp:888
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.
Definition ArchSpec.h:31
uint32_t GetAddressByteSize() const
Returns the size in bytes of an address of the current architecture.
Definition ArchSpec.cpp:685
bool IsValid() const
Tests if this ArchSpec is valid.
Definition ArchSpec.h:366
llvm::Triple & GetTriple()
Architecture triple accessor.
Definition ArchSpec.h:468
bool IsCompatibleMatch(const ArchSpec &rhs) const
Shorthand for IsMatch(rhs, CompatibleMatch).
Definition ArchSpec.h:520
bool IsExactMatch(const ArchSpec &rhs) const
Shorthand for IsMatch(rhs, ExactMatch).
Definition ArchSpec.h:515
lldb::ByteOrder GetByteOrder() const
Returns the byte order for the architecture specification.
Definition ArchSpec.cpp:732
virtual const MemoryTagManager * GetMemoryTagManager() const
A command line argument class.
Definition Args.h:33
Class that manages the actual breakpoint that will be inserted into the running program.
BreakpointSite::Type GetType() const
void SetType(BreakpointSite::Type type)
bool IntersectsRange(lldb::addr_t addr, size_t size, lldb::addr_t *intersect_addr, size_t *intersect_size, size_t *opcode_offset) const
Says whether addr and size size intersects with the address intersect_addr.
uint8_t * GetTrapOpcodeBytes()
Returns the Opcode Bytes for this breakpoint.
uint8_t * GetSavedOpcodeBytes()
Gets the original instruction bytes that were overwritten by the trap.
bool IsHardware() const override
bool IsEnabled() const
Tells whether the current breakpoint site is enabled or not.
void SetEnabled(bool enabled)
Sets whether the current breakpoint site is enabled or not.
Broadcaster(lldb::BroadcasterManagerSP manager_sp, std::string name)
Construct with a broadcaster with a name.
lldb::ListenerSP GetPrimaryListener()
void RestoreBroadcaster()
Restore the state of the Broadcaster from a previous hijack attempt.
void SetEventName(uint32_t event_mask, const char *name)
Set the name for an event bit.
bool HijackBroadcaster(const lldb::ListenerSP &listener_sp, uint32_t event_mask=UINT32_MAX)
Provides a simple mechanism to temporarily redirect events from broadcaster.
void BroadcastEventIfUnique(lldb::EventSP &event_sp)
void SetPrimaryListener(lldb::ListenerSP listener_sp)
const char * GetHijackingListenerName()
void BroadcastEvent(lldb::EventSP &event_sp)
Broadcast an event which has no associated data.
bool IsHijackedForEvent(uint32_t event_mask)
A class that implements CRTP-based "virtual constructor" idiom.
Definition Cloneable.h:40
Generic representation of a type in a programming language.
CompilerType GetBasicTypeFromAST(lldb::BasicType basic_type) const
Create related types using the current type's AST.
CompilerType GetPointerType() const
Return a new CompilerType that is a pointer to this type.
std::string GetString() const
Get the string value as a std::string.
const char * AsCString(const char *value_if_empty=nullptr) const
Get the string value as a C string.
Status FinalizeCoreFileSaveRanges()
Finalize and merge all overlapping ranges in this collection.
A subclass of DataBuffer that stores a data buffer on the heap.
lldb::offset_t SetByteSize(lldb::offset_t byte_size)
Set the number of bytes in the data buffer.
An data extractor class.
uint32_t GetMaxU32(lldb::offset_t *offset_ptr, size_t byte_size) const
Extract an integer of size byte_size from *offset_ptr.
uint64_t GetMaxU64(lldb::offset_t *offset_ptr, size_t byte_size) const
Extract an unsigned integer of size byte_size from *offset_ptr.
A class to manage flag bits.
Definition Debugger.h:80
static lldb::TargetSP FindTargetWithProcessID(lldb::pid_t pid)
Definition Debugger.cpp:934
lldb::StreamUP GetAsyncErrorStream()
TargetList & GetTargetList()
Get accessor for the target list.
Definition Debugger.h:204
bool IsTopIOHandler(const lldb::IOHandlerSP &reader_sp)
bool RemoveIOHandler(const lldb::IOHandlerSP &reader_sp)
Remove the given IO handler if it's currently active.
void RunIOHandlerAsync(const lldb::IOHandlerSP &reader_sp, bool cancel_top_handler=true)
Run the given IO handler and return immediately.
PlatformList & GetPlatformList()
Definition Debugger.h:206
lldb::ListenerSP GetListener()
Definition Debugger.h:175
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)
Definition Target.h:372
void SetTryAllThreads(bool try_others=true)
Definition Target.h:405
void SetTimeout(const Timeout< std::micro > &timeout)
Definition Target.h:393
void SetStopOthers(bool stop_others=true)
Definition Target.h:409
const Timeout< std::micro > & GetTimeout() const
Definition Target.h:391
void SetIgnoreBreakpoints(bool ignore=false)
Definition Target.h:376
const Timeout< std::micro > & GetOneThreadTimeout() const
Definition Target.h:395
friend class Event
Definition Event.h:36
virtual llvm::StringRef GetFlavor() const =0
EventData * GetData()
Definition Event.h:199
uint32_t GetType() const
Definition Event.h:205
"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.
A file utility class.
Definition FileSpec.h:57
const ConstString & GetFilename() const
Filename string const get accessor.
Definition FileSpec.h:251
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
Definition FileSpec.cpp:374
static FileSystem & Instance()
An abstract base class for files.
Definition File.h:36
bool Test(ValueType bit) const
Test a single flag bit.
Definition Flags.h:96
bool GetIsOptimized()
Get whether compiler optimizations were enabled for this function.
Definition Function.cpp:512
static lldb::thread_t GetCurrentThread()
Get the thread token (the one returned by ThreadCreate when the thread was created) for the calling t...
Debugger & GetDebugger()
Definition IOHandler.h:130
IOHandler(Debugger &debugger, IOHandler::Type type)
Definition IOHandler.cpp:55
void SetIsDone(bool b)
Definition IOHandler.h:81
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.
Definition JITLoader.cpp:18
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)
Definition Language.cpp:412
static std::set< lldb::LanguageType > GetSupportedLanguages()
Definition Language.cpp:462
static lldb::ListenerSP MakeListener(const char *name)
Definition Listener.cpp:375
void PutCString(const char *cstr)
Definition Log.cpp:145
void PutString(llvm::StringRef str)
Definition Log.cpp:147
static lldb::MemoryHistorySP FindPlugin(const lldb::ProcessSP process)
OptionalBool GetWritable() const
int GetPageSize() const
Get the target system's VM page size in bytes.
Range< lldb::addr_t, lldb::addr_t > RangeType
const std::optional< std::vector< lldb::addr_t > > & GetDirtyPageList() const
Get a vector of target VM pages that are dirty – that have been modified – within this memory region.
OptionalBool GetReadable() const
OptionalBool GetExecutable() const
void SetLLDBPermissions(uint32_t permissions)
virtual llvm::Expected< std::vector< lldb::addr_t > > UnpackTagsData(const std::vector< uint8_t > &tags, size_t granules=0) const =0
virtual lldb::addr_t GetGranuleSize() const =0
virtual llvm::Expected< std::vector< uint8_t > > PackTags(const std::vector< lldb::addr_t > &tags) const =0
virtual int32_t GetAllocationTagType() const =0
A collection class for Module objects.
Definition ModuleList.h:104
A class that describes an executable image and its associated object and symbol files.
Definition Module.h:90
const FileSpec & GetFileSpec() const
Get const accessor for the module file specification.
Definition Module.h:446
A plug-in interface definition class for object file parsers.
Definition ObjectFile.h:46
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)
lldb::PlatformSP GetOrCreate(llvm::StringRef name)
A plug-in interface definition class for debug platform that includes many platform abilities such as...
Definition Platform.h:77
virtual llvm::StringRef GetPluginName()=0
static ProcessCreateInstance GetProcessCreateCallbackAtIndex(uint32_t idx)
static ProcessCreateInstance GetProcessCreateCallbackForPluginName(llvm::StringRef name)
static StructuredDataPluginCreateInstance GetStructuredDataPluginCreateCallbackAtIndex(uint32_t idx)
static LanguageSet GetAllTypeSystemSupportedLanguagesForTypes()
uint32_t GetResumeCount() const
Definition Process.h:153
lldb::ListenerSP GetListenerForProcess(Debugger &debugger)
Definition Process.cpp:3029
lldb::pid_t GetProcessID() const
Definition ProcessInfo.h:68
lldb::ListenerSP m_listener_sp
FileSpec & GetExecutableFile()
Definition ProcessInfo.h:43
ArchSpec & GetArchitecture()
Definition ProcessInfo.h:62
void SetNameMatchType(NameMatch name_match_type)
ProcessInstanceInfo & GetProcessInfo()
static void DumpTableHeader(Stream &s, bool show_args, bool verbose)
bool GetSteppingRunsAllThreads() const
Definition Process.cpp:339
void SetStopOnSharedLibraryEvents(bool stop)
Definition Process.cpp:270
std::unique_ptr< ProcessExperimentalProperties > m_experimental_properties_up
Definition Process.h:119
FollowForkMode GetFollowForkMode() const
Definition Process.cpp:369
uint32_t GetVirtualAddressableBits() const
Definition Process.cpp:215
void SetIgnoreBreakpointsInExpressions(bool ignore)
Definition Process.cpp:248
bool GetUnwindOnErrorInExpressions() const
Definition Process.cpp:253
std::chrono::seconds GetInterruptTimeout() const
Definition Process.cpp:332
bool GetDisableLangRuntimeUnwindPlans() const
Definition Process.cpp:275
void SetDetachKeepsStopped(bool keep_stopped)
Definition Process.cpp:302
void SetDisableLangRuntimeUnwindPlans(bool disable)
Definition Process.cpp:281
std::chrono::seconds GetUtilityExpressionTimeout() const
Definition Process.cpp:325
void SetVirtualAddressableBits(uint32_t bits)
Definition Process.cpp:221
bool GetStopOnSharedLibraryEvents() const
Definition Process.cpp:264
void SetHighmemVirtualAddressableBits(uint32_t bits)
Definition Process.cpp:232
void SetOSPluginReportsAllThreads(bool does_report)
Definition Process.cpp:359
void SetUnwindOnErrorInExpressions(bool ignore)
Definition Process.cpp:259
FileSpec GetPythonOSPluginPath() const
Definition Process.cpp:210
void SetPythonOSPluginPath(const FileSpec &file)
Definition Process.cpp:237
void SetExtraStartupCommands(const Args &args)
Definition Process.cpp:205
bool GetOSPluginReportsAllThreads() const
Definition Process.cpp:345
bool GetWarningsUnsupportedLanguage() const
Definition Process.cpp:313
uint32_t GetHighmemVirtualAddressableBits() const
Definition Process.cpp:226
bool GetIgnoreBreakpointsInExpressions() const
Definition Process.cpp:242
uint64_t GetMemoryCacheLineSize() const
Definition Process.cpp:192
ProcessProperties(lldb_private::Process *process)
Definition Process.cpp:153
A class used to prevent the process from starting while other threads are accessing its data,...
EventActionResult HandleBeingInterrupted() override
Definition Process.cpp:3021
EventActionResult PerformAction(lldb::EventSP &event_sp) override
Definition Process.cpp:2964
AttachCompletionHandler(Process *process, uint32_t exec_count)
Definition Process.cpp:2953
static bool GetRestartedFromEvent(const Event *event_ptr)
Definition Process.cpp:4520
virtual bool ShouldStop(Event *event_ptr, bool &found_valid_stopinfo)
Definition Process.cpp:4293
static void AddRestartedReason(Event *event_ptr, const char *reason)
Definition Process.cpp:4557
void SetInterrupted(bool new_value)
Definition Process.h:487
lldb::ProcessSP GetProcessSP() const
Definition Process.h:435
void SetRestarted(bool new_value)
Definition Process.h:485
static void SetRestartedInEvent(Event *event_ptr, bool new_value)
Definition Process.cpp:4528
static lldb::ProcessSP GetProcessFromEvent(const Event *event_ptr)
Definition Process.cpp:4504
static void SetInterruptedInEvent(Event *event_ptr, bool new_value)
Definition Process.cpp:4574
bool ForwardEventToPendingListeners(Event *event_ptr) override
This will be queried for a Broadcaster with a primary and some secondary listeners after the primary ...
Definition Process.cpp:4397
llvm::StringRef GetFlavor() const override
Definition Process.cpp:4289
static bool GetInterruptedFromEvent(const Event *event_ptr)
Definition Process.cpp:4565
const char * GetRestartedReasonAtIndex(size_t idx)
Definition Process.h:442
static bool SetUpdateStateOnRemoval(Event *event_ptr)
Definition Process.cpp:4582
static lldb::StateType GetStateFromEvent(const Event *event_ptr)
Definition Process.cpp:4512
lldb::StateType GetState() const
Definition Process.h:437
static const Process::ProcessEventData * GetEventDataFromEvent(const Event *event_ptr)
Definition Process.cpp:4493
static llvm::StringRef GetFlavorString()
Definition Process.cpp:4285
void DoOnRemoval(Event *event_ptr) override
Definition Process.cpp:4408
void Dump(Stream *s) const override
Definition Process.cpp:4480
A plug-in interface definition class for debugging a process.
Definition Process.h:354
virtual Status EnableBreakpointSite(BreakpointSite *bp_site)
Definition Process.h:2210
Status WillAttachToProcessWithName(const char *process_name, bool wait_for_launch)
Called before attaching to a process.
Definition Process.cpp:3044
virtual llvm::Expected< TraceSupportedResponse > TraceSupported()
Get the processor tracing type supported for this process.
Definition Process.cpp:6486
lldb::IOHandlerSP m_process_input_reader
Definition Process.h:3259
friend class ProcessProperties
Definition Process.h:2394
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.
Definition Process.cpp:6476
virtual Status DoSignal(int signal)
Sends a process a UNIX signal signal.
Definition Process.h:1214
virtual Status WillResume()
Called before resuming to a process.
Definition Process.h:1101
std::mutex m_process_input_reader_mutex
Definition Process.h:3260
lldb::addr_t m_code_address_mask
Mask for code an data addresses.
Definition Process.h:3311
StopPointSiteList< lldb_private::BreakpointSite > & GetBreakpointSiteList()
Definition Process.cpp:1560
std::vector< lldb::addr_t > m_image_tokens
Definition Process.h:3242
bool PrivateStateThreadIsValid() const
Definition Process.h:3067
virtual Status DoHalt(bool &caused_stop)
Halts a running process.
Definition Process.h:1161
virtual void DidLaunch()
Called after launching a process.
Definition Process.h:1093
virtual Status DisableSoftwareBreakpoint(BreakpointSite *bp_site)
Definition Process.cpp:1833
lldb::pid_t GetID() const
Returns the pid of the process or LLDB_INVALID_PROCESS_ID if there is no known pid.
Definition Process.h:553
lldb::break_id_t CreateBreakpointSite(const lldb::BreakpointLocationSP &owner, bool use_hardware)
Definition Process.cpp:1613
virtual Status WillSignal()
Called before sending a signal to a process.
Definition Process.h:1208
void ResetImageToken(size_t token)
Definition Process.cpp:6257
lldb::JITLoaderListUP m_jit_loaders_up
Definition Process.h:3248
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.
Definition Process.cpp:2546
void SetNextEventAction(Process::NextEventAction *next_event_action)
Definition Process.h:3044
Status Destroy(bool force_kill)
Kills the process and shuts down all threads that were spawned to track and monitor the process.
Definition Process.cpp:3615
virtual Status WillDetach()
Called before detaching from a process.
Definition Process.h:1178
virtual Status DoLaunch(Module *exe_module, ProcessLaunchInfo &launch_info)
Launch a new process.
Definition Process.h:1085
StopPointSiteList< lldb_private::BreakpointSite > m_breakpoint_site_list
This is the list of breakpoint locations we intend to insert in the target.
Definition Process.h:3244
void ControlPrivateStateThread(uint32_t signal)
Definition Process.cpp:3948
ThreadList & GetThreadList()
Definition Process.h:2275
void SetAddressableBitMasks(AddressableBits bit_masks)
Definition Process.cpp:6904
virtual DataExtractor GetAuxvData()
Definition Process.cpp:2933
Process(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp)
Construct with a shared pointer to a target, and the Process listener.
Definition Process.cpp:428
lldb::ExpressionResults RunThreadPlan(ExecutionContext &exe_ctx, lldb::ThreadPlanSP &thread_plan_sp, const EvaluateExpressionOptions &options, DiagnosticManager &diagnostic_manager)
Definition Process.cpp:5070
void PrintWarningUnsupportedLanguage(const SymbolContext &sc)
Print a user-visible warning about a function written in a language that this version of LLDB doesn't...
Definition Process.cpp:6182
lldb::StateType GetPrivateState()
Definition Process.cpp:1402
Status LaunchPrivate(ProcessLaunchInfo &launch_info, lldb::StateType &state, lldb::EventSP &event_sp)
Definition Process.cpp:2740
std::vector< std::string > m_profile_data
Definition Process.h:3268
bool m_can_interpret_function_calls
Definition Process.h:3324
Status Resume()
Resumes all of a process's threads as configured using the Thread run control functions.
Definition Process.cpp:1332
void PruneThreadPlans()
Prune ThreadPlanStacks for all unreported threads.
Definition Process.cpp:1229
void SetUnixSignals(lldb::UnixSignalsSP &&signals_sp)
Definition Process.cpp:3706
virtual void DidExit()
Definition Process.h:1420
std::string m_stdout_data
Remember if stdin must be forwarded to remote debug server.
Definition Process.h:3265
bool RemoveInvalidMemoryRange(const LoadRange &region)
Definition Process.cpp:5937
uint32_t GetNextThreadIndexID(uint64_t thread_id)
Definition Process.cpp:1267
Status PrivateResume()
The "private" side of resuming a process.
Definition Process.cpp:3341
void SetDynamicCheckers(DynamicCheckerFunctions *dynamic_checkers)
Definition Process.cpp:1556
void SendAsyncInterrupt(Thread *thread=nullptr)
Send an async interrupt request.
Definition Process.cpp:3998
void AddInvalidMemoryRegion(const LoadRange &region)
Definition Process.cpp:5933
virtual void ModulesDidLoad(ModuleList &module_list)
Definition Process.cpp:6140
InstrumentationRuntimeCollection m_instrumentation_runtimes
Definition Process.h:3276
std::atomic< bool > m_destructing
Definition Process.h:3299
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...
Definition Process.h:2967
@ eBroadcastInternalStateControlResume
Definition Process.h:383
@ eBroadcastInternalStateControlStop
Definition Process.h:381
@ eBroadcastInternalStateControlPause
Definition Process.h:382
int GetExitStatus()
Get the exit status for a process.
Definition Process.cpp:1008
OperatingSystem * GetOperatingSystem()
Definition Process.h:2420
Status WillAttachToProcessWithID(lldb::pid_t pid)
Called before attaching to a process.
Definition Process.cpp:3040
virtual Status DoDetach(bool keep_stopped)
Detaches from a running or stopped process.
Definition Process.h:1185
std::unique_ptr< UtilityFunction > m_dlopen_utility_func_up
Definition Process.h:3332
void SetRunningUtilityFunction(bool on)
Definition Process.cpp:1475
void DisableAllBreakpointSites()
Definition Process.cpp:1569
uint32_t m_process_unique_id
Each lldb_private::Process class that is created gets a unique integer ID that increments with each n...
Definition Process.h:3207
int64_t ReadSignedIntegerFromMemory(lldb::addr_t load_addr, size_t byte_size, int64_t fail_value, Status &error)
Definition Process.cpp:2346
Address AdvanceAddressToNextBranchInstruction(Address default_stop_addr, AddressRange range_bounds)
Find the next branch instruction to set a breakpoint on.
Definition Process.cpp:6263
virtual bool GetLoadAddressPermissions(lldb::addr_t load_addr, uint32_t &permissions)
Attempt to get the attributes for a region of memory in the process.
Definition Process.cpp:2649
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.
Definition Process.cpp:733
virtual size_t GetAsyncProfileData(char *buf, size_t buf_size, Status &error)
Get any available profile data.
Definition Process.cpp:4663
lldb::addr_t FixDataAddress(lldb::addr_t pc)
Definition Process.cpp:6062
lldb::addr_t AllocateMemory(size_t size, uint32_t permissions, Status &error)
The public interface to allocating memory in the process.
Definition Process.cpp:2535
std::unique_ptr< NextEventAction > m_next_event_action_up
Definition Process.h:3277
void SetHighmemDataAddressMask(lldb::addr_t data_address_mask)
Definition Process.cpp:6049
bool PruneThreadPlansForTID(lldb::tid_t tid)
Prune ThreadPlanStacks for unreported threads.
Definition Process.cpp:1225
virtual void DidDetach()
Called after detaching from a process.
Definition Process.h:1195
std::function< IterationAction(lldb_private::Status &error, lldb::addr_t bytes_addr, const void *bytes, lldb::offset_t bytes_size)> ReadMemoryChunkCallback
Definition Process.h:1633
HostThread m_private_state_thread
Thread ID for the thread that watches internal state events.
Definition Process.h:3203
Status EnableBreakpointSiteByID(lldb::user_id_t break_id)
Definition Process.cpp:1599
ProcessModID GetModID() const
Get the Modification ID of the process.
Definition Process.h:1468
size_t ReadMemoryFromInferior(lldb::addr_t vm_addr, void *buf, size_t size, Status &error)
Read of memory from a process.
Definition Process.cpp:2262
size_t ReadScalarIntegerFromMemory(lldb::addr_t addr, uint32_t byte_size, bool is_signed, Scalar &scalar, Status &error)
Definition Process.cpp:2492
virtual Status Launch(ProcessLaunchInfo &launch_info)
Launch a new process.
Definition Process.cpp:2708
std::mutex m_run_thread_plan_lock
Definition Process.h:3327
static void SettingsInitialize()
Definition Process.cpp:4933
void BroadcastStructuredData(const StructuredData::ObjectSP &object_sp, const lldb::StructuredDataPluginSP &plugin_sp)
Broadcasts the given structured data object from the given plugin.
Definition Process.cpp:4647
void Flush()
Flush all data in the process.
Definition Process.cpp:5990
bool m_clear_thread_plans_on_stop
Definition Process.h:3317
ProcessRunLock m_public_run_lock
Definition Process.h:3279
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.
Definition Process.cpp:2216
void ResumePrivateStateThread()
Definition Process.cpp:3933
void MapSupportedStructuredDataPlugins(const StructuredData::Array &supported_type_names)
Loads any plugins associated with asynchronous structured data and maps the relevant supported type n...
Definition Process.cpp:6371
bool GetEventsPrivate(lldb::EventSP &event_sp, const Timeout< std::micro > &timeout, bool control_only)
Definition Process.cpp:991
lldb::ABISP m_abi_sp
This is the current signal set for this process.
Definition Process.h:3258
virtual void DidSignal()
Called after sending a signal to a process.
Definition Process.h:1232
virtual SystemRuntime * GetSystemRuntime()
Get the system runtime plug-in for this process.
Definition Process.cpp:2947
std::map< uint64_t, uint32_t > m_thread_id_to_index_id_map
Definition Process.h:3212
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.
Definition Process.cpp:1233
lldb::ListenerSP m_private_state_listener_sp
Definition Process.h:3201
uint32_t m_extended_thread_stop_id
The natural stop id when extended_thread_list was last updated.
Definition Process.h:3232
bool PreResumeActionCallback(void *)
Definition Process.h:2605
lldb::RunDirection m_base_direction
ThreadPlanBase run direction.
Definition Process.h:3231
Range< lldb::addr_t, lldb::addr_t > LoadRange
Definition Process.h:386
static constexpr llvm::StringRef ResumeSynchronousHijackListenerName
Definition Process.h:403
bool WritePointerToMemory(lldb::addr_t vm_addr, lldb::addr_t ptr_value, Status &error)
Definition Process.cpp:2365
QueueList m_queue_list
The list of libdispatch queues at a given stop point.
Definition Process.h:3235
void ClearPreResumeAction(PreResumeActionCallback callback, void *baton)
Definition Process.cpp:5961
virtual Status WillDestroy()
Definition Process.h:1220
lldb::ThreadSP CreateOSPluginThread(lldb::tid_t tid, lldb::addr_t context)
Definition Process.cpp:1260
std::vector< PreResumeCallbackAndBaton > m_pre_resume_actions
Definition Process.h:3278
void SetCanJIT(bool can_jit)
Sets whether executing JIT-compiled code in this process is possible.
Definition Process.cpp:2585
lldb::StateType GetStateChangedEventsPrivate(lldb::EventSP &event_sp, const Timeout< std::micro > &timeout)
Definition Process.cpp:973
void LoadOperatingSystemPlugin(bool flush)
Definition Process.cpp:2699
lldb::StructuredDataPluginSP GetStructuredDataPlugin(llvm::StringRef type_name) const
Returns the StructuredDataPlugin associated with a given type name, if there is one.
Definition Process.cpp:4655
lldb::DynamicLoaderUP m_dyld_up
Definition Process.h:3247
friend class ProcessEventData
Definition Process.h:358
void ResetExtendedCrashInfoDict()
Definition Process.h:2689
AddressRanges FindRangesInMemory(const uint8_t *buf, uint64_t size, const AddressRanges &ranges, size_t alignment, size_t max_matches, Status &error)
Definition Process.cpp:2048
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.
Definition Process.cpp:6240
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.
Definition Process.h:1741
virtual Status WriteObjectFile(std::vector< ObjectFile::LoadableData > entries)
Definition Process.cpp:2524
std::recursive_mutex m_stdio_communication_mutex
Definition Process.h:3262
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.
Definition Process.cpp:382
StopPointSiteList< lldb_private::WatchpointResource > m_watchpoint_resource_list
Watchpoint resources currently in use.
Definition Process.h:3239
Status DisableBreakpointSiteByID(lldb::user_id_t break_id)
Definition Process.cpp:1585
llvm::Expected< const MemoryTagManager * > GetMemoryTagManager()
If this architecture and process supports memory tagging, return a tag manager that can be used to ma...
Definition Process.cpp:6551
~Process() override
Destructor.
Definition Process.cpp:519
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.
Definition Process.h:3167
std::recursive_mutex m_profile_data_comm_mutex
Definition Process.h:3267
lldb::InstrumentationRuntimeSP GetInstrumentationRuntime(lldb::InstrumentationRuntimeType type)
Definition Process.cpp:6231
Status ResumeSynchronous(Stream *stream)
Resume a process, and wait for it to stop.
Definition Process.cpp:1349
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.
Definition Process.cpp:6068
lldb::thread_result_t RunPrivateStateThread(bool is_secondary_thread)
Definition Process.cpp:4135
virtual Status DoWillLaunch(Module *module)
Called before launching to a process.
Definition Process.h:1066
virtual Status ConnectRemote(llvm::StringRef remote_url)
Attach to a remote system via a URL.
Definition Process.cpp:3298
void AppendSTDOUT(const char *s, size_t len)
Definition Process.cpp:4626
llvm::StringMap< lldb::StructuredDataPluginSP > m_structured_data_plugin_map
Definition Process.h:3328
virtual Status DisableBreakpointSite(BreakpointSite *bp_site)
Definition Process.h:2215
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)
Definition Process.cpp:5887
void CalculateExecutionContext(ExecutionContext &exe_ctx) override
Reconstruct the object's execution context into sc.
Definition Process.cpp:4594
virtual size_t ReadMemory(lldb::addr_t vm_addr, void *buf, size_t size, Status &error)
Read of memory from a process.
Definition Process.cpp:1930
Event * PeekAtStateChangedEvents()
Definition Process.cpp:953
std::vector< Notifications > m_notifications
The list of notifications that this process can deliver.
Definition Process.h:3240
bool HasAssignedIndexIDToThread(uint64_t sb_thread_id)
Definition Process.cpp:1271
ThreadSafeValue< lldb::StateType > m_private_state
Definition Process.h:3193
size_t AddImageToken(lldb::addr_t image_ptr)
Definition Process.cpp:6246
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)
Definition Process.cpp:2017
virtual bool DestroyRequiresHalt()
Definition Process.h:1226
lldb::EventSP CreateEventFromProcessState(uint32_t event_type)
Definition Process.cpp:4620
StructuredData::DictionarySP m_crash_info_dict_sp
A repository for extra crash information, consulted in GetExtendedCrashInformation.
Definition Process.h:3340
Status CalculateCoreFileSaveRanges(const SaveCoreOptions &core_options, CoreFileMemoryRanges &ranges)
Helper function for Process::SaveCore(...) that calculates the address ranges that should be saved.
Definition Process.cpp:6835
lldb::TargetSP CalculateTarget() override
Definition Process.cpp:4592
void SetHighmemCodeAddressMask(lldb::addr_t code_address_mask)
Definition Process.cpp:6042
lldb::ByteOrder GetByteOrder() const
Definition Process.cpp:3716
Status Detach(bool keep_stopped)
Detaches from a running or stopped process.
Definition Process.cpp:3563
void UpdateThreadListIfNeeded()
Definition Process.cpp:1134
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.
Definition Process.cpp:6570
virtual void DidResume()
Called after resuming a process.
Definition Process.h:1136
virtual void DidExec()
Called after a process re-execs itself.
Definition Process.cpp:6074
void SetCodeAddressMask(lldb::addr_t code_address_mask)
Definition Process.cpp:6030
AllocatedMemoryCache m_allocated_memory_cache
Definition Process.h:3271
virtual Status LoadCore()
Definition Process.cpp:2872
std::mutex m_exit_status_mutex
Mutex so m_exit_status m_exit_string can be safely accessed from multiple threads.
Definition Process.h:3215
Status Signal(int signal)
Sends a process a UNIX signal signal.
Definition Process.cpp:3696
void SetDynamicLoader(lldb::DynamicLoaderUP dyld)
Definition Process.cpp:2929
ThreadPlanStackMap m_thread_plans
This is the list of thread plans for threads in m_thread_list, as well as threads we knew existed,...
Definition Process.h:3224
std::recursive_mutex m_thread_mutex
Definition Process.h:3217
virtual Status ConfigureStructuredData(llvm::StringRef type_name, const StructuredData::ObjectSP &config_sp)
Configure asynchronous structured data feature.
Definition Process.cpp:6363
virtual Status DoWillAttachToProcessWithName(const char *process_name, bool wait_for_launch)
Called before attaching to a process.
Definition Process.h:968
bool m_currently_handling_do_on_removals
Definition Process.h:3281
bool StartPrivateStateThread(bool is_secondary_thread=false)
Definition Process.cpp:3878
void HandlePrivateEvent(lldb::EventSP &event_sp)
Definition Process.cpp:4010
void BroadcastAsyncProfileData(const std::string &one_profile_data)
Definition Process.cpp:4640
lldb::StateType GetState()
Get accessor for the current process state.
Definition Process.cpp:1285
virtual Status DoWillAttachToProcessWithID(lldb::pid_t pid)
Called before attaching to a process.
Definition Process.h:951
ProcessRunLock & GetRunLock()
Definition Process.cpp:5971
virtual Status DoLoadCore()
Definition Process.h:631
Predicate< uint32_t > m_iohandler_sync
Definition Process.h:3269
LanguageRuntimeCollection m_language_runtimes
Should we detach if the process object goes away with an explicit call to Kill or Detach?
Definition Process.h:3274
virtual Status GetMemoryRegions(lldb_private::MemoryRegionInfos &region_list)
Obtain all the mapped memory regions within this process.
Definition Process.cpp:6326
size_t WriteMemoryPrivate(lldb::addr_t addr, const void *buf, size_t size, Status &error)
Definition Process.cpp:2377
void GetStatus(Stream &ostrm)
Definition Process.cpp:5867
void SetRunningUserExpression(bool on)
Definition Process.cpp:1471
enum lldb_private::Process::@120260360120067272255351105340035202127223005263 m_can_jit
bool IsPossibleDynamicValue(ValueObject &in_value)
Definition Process.cpp:1535
bool CurrentThreadPosesAsPrivateStateThread()
Definition Process.cpp:5982
static bool SetProcessExitStatus(lldb::pid_t pid, bool exited, int signo, int status)
Static function that can be used with the host function Host::StartMonitoringChildProcess ().
Definition Process.cpp:1102
void RemoveConstituentFromBreakpointSite(lldb::user_id_t site_id, lldb::user_id_t constituent_id, lldb::BreakpointSiteSP &bp_site_sp)
Definition Process.cpp:1703
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.
Definition Process.cpp:3454
lldb::OperatingSystemUP m_os_up
Definition Process.h:3254
uint32_t GetLastNaturalStopID() const
Definition Process.h:1480
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)
Definition Process.cpp:665
lldb::UnixSignalsSP m_unix_signals_sp
Definition Process.h:3257
bool StateChangedIsHijackedForSynchronousResume()
Definition Process.cpp:1393
const char * GetExitDescription()
Get a textual description of what the process exited.
Definition Process.cpp:1016
void SetPublicState(lldb::StateType new_state, bool restarted)
Definition Process.cpp:1292
lldb::tid_t m_interrupt_tid
Definition Process.h:3287
void SetDataAddressMask(lldb::addr_t data_address_mask)
Definition Process.cpp:6036
virtual Status DoConnectRemote(llvm::StringRef remote_url)
Attach to a remote system via a URL.
Definition Process.h:980
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.
Definition Process.cpp:2335
llvm::once_flag m_dlopen_utility_func_flag_once
Definition Process.h:3333
virtual void UpdateQueueListIfNeeded()
Definition Process.cpp:1247
virtual Status UpdateAutomaticSignalFiltering()
Definition Process.cpp:6470
virtual lldb::addr_t GetImageInfoAddress()
Get the image information address for the current process.
Definition Process.cpp:1479
std::map< lldb::addr_t, lldb::addr_t > m_resolved_indirect_addresses
This helps with the Public event coalescing in ShouldBroadcastEvent.
Definition Process.h:3322
virtual Status DoAttachToProcessWithID(lldb::pid_t pid, const ProcessAttachInfo &attach_info)
Attach to an existing process using a process ID.
Definition Process.h:998
llvm::SmallVector< std::optional< std::string > > ReadCStringsFromMemory(llvm::ArrayRef< lldb::addr_t > addresses)
Definition Process.cpp:2141
void SetCanRunCode(bool can_run_code)
Sets whether executing code in this process is possible.
Definition Process.cpp:2589
Status ClearBreakpointSiteByID(lldb::user_id_t break_id)
Definition Process.cpp:1576
virtual Status EnableSoftwareBreakpoint(BreakpointSite *bp_site)
Definition Process.cpp:1753
void AppendSTDERR(const char *s, size_t len)
Definition Process.cpp:4633
bool GetShouldDetach() const
Definition Process.h:777
static llvm::StringRef GetStaticBroadcasterClass()
Definition Process.cpp:423
uint32_t m_thread_index_id
Each thread is created with a 1 based index that won't get re-used.
Definition Process.h:3210
bool ProcessIOHandlerExists() const
Definition Process.h:3403
virtual Status DoResume(lldb::RunDirection direction)
Resumes all of a process's threads as configured using the Thread run control functions.
Definition Process.h:1125
bool RouteAsyncStructuredData(const StructuredData::ObjectSP object_sp)
Route the incoming structured data dictionary to the right plugin.
Definition Process.cpp:6441
virtual void DidDestroy()
Definition Process.h:1224
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,...
Definition Process.cpp:2291
lldb::addr_t ReadPointerFromMemory(lldb::addr_t vm_addr, Status &error)
Definition Process.cpp:2357
Broadcaster m_private_state_control_broadcaster
Definition Process.h:3197
lldb::addr_t GetHighmemCodeAddressMask()
The highmem masks are for targets where we may have different masks for low memory versus high memory...
Definition Process.cpp:6012
bool IsRunning() const
Definition Process.cpp:1004
size_t RemoveBreakpointOpcodesFromBuffer(lldb::addr_t addr, size_t size, uint8_t *buf) const
Definition Process.cpp:1716
Broadcaster m_private_state_broadcaster
Definition Process.h:3194
virtual bool DetachRequiresHalt()
Definition Process.h:1197
virtual bool IsAlive()
Check if a process is still alive.
Definition Process.cpp:1082
ThreadList m_thread_list_real
The threads for this process as are known to the protocol we are debugging with.
Definition Process.h:3218
ThreadSafeValue< lldb::StateType > m_public_state
Definition Process.h:3191
lldb::addr_t m_data_address_mask
Definition Process.h:3312
virtual ArchSpec GetSystemArchitecture()
Get the system architecture for this process.
Definition Process.h:743
Status DeallocateMemory(lldb::addr_t ptr)
The public interface to deallocating memory in the process.
Definition Process.cpp:2594
virtual Status DisableWatchpoint(lldb::WatchpointSP wp_sp, bool notify=true)
Definition Process.cpp:2671
void RegisterNotificationCallbacks(const Process::Notifications &callbacks)
Register for process and thread notifications.
Definition Process.cpp:593
virtual void DidAttach(ArchSpec &process_arch)
Called after attaching a process.
Definition Process.h:1032
virtual lldb::addr_t ResolveIndirectFunction(const Address *address, Status &error)
Resolve dynamically loaded indirect functions.
Definition Process.cpp:6110
lldb::StateType m_last_broadcast_state
Definition Process.h:3319
LanguageRuntime * GetLanguageRuntime(lldb::LanguageType language)
Definition Process.cpp:1507
ProcessModID m_mod_id
Tracks the state of the process over stops and other alterations.
Definition Process.h:3205
void SetID(lldb::pid_t new_pid)
Sets the stored pid.
Definition Process.h:558
friend class Target
Definition Process.h:360
virtual JITLoaderList & GetJITLoaders()
Definition Process.cpp:2939
uint32_t AssignIndexIDToThread(uint64_t thread_id)
Definition Process.cpp:1276
virtual bool SetExitStatus(int exit_status, llvm::StringRef exit_string)
Set accessor for the process exit status (return code).
Definition Process.cpp:1024
uint32_t m_queue_list_stop_id
The natural stop id when queue list was last fetched.
Definition Process.h:3236
void PrintWarningOptimization(const SymbolContext &sc)
Print a user-visible warning about a module being built with optimization.
Definition Process.cpp:6174
ProcessRunLock m_private_run_lock
Definition Process.h:3280
virtual std::optional< bool > DoGetWatchpointReportedAfter()
Provide an override value in the subclass for lldb's CPU-based logic for whether watchpoint exception...
Definition Process.h:2987
static ProcessProperties & GetGlobalProperties()
Definition Process.cpp:530
lldb::addr_t m_highmem_code_address_mask
Definition Process.h:3313
lldb::addr_t GetImagePtrFromToken(size_t token) const
Definition Process.cpp:6251
int m_exit_status
The exit status of the process, or -1 if not set.
Definition Process.h:3213
std::vector< LanguageRuntime * > GetLanguageRuntimes()
Definition Process.cpp:1487
void SetShouldDetach(bool b)
Definition Process.h:779
MemoryCache m_memory_cache
Definition Process.h:3270
static void STDIOReadThreadBytesReceived(void *baton, const void *src, size_t src_len)
Definition Process.cpp:4726
virtual bool GetProcessInfo(ProcessInstanceInfo &info)
Definition Process.cpp:6200
virtual void DidHalt()
Called after halting a process.
Definition Process.h:1169
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...
Definition Process.cpp:6056
lldb::StateType WaitForProcessStopPrivate(lldb::EventSP &event_sp, const Timeout< std::micro > &timeout)
Definition Process.cpp:2678
void RestoreProcessEvents()
Restores the process event broadcasting to its normal state.
Definition Process.cpp:927
virtual bool SupportsMemoryTagging()
Check whether the process supports memory tagging.
Definition Process.h:3123
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.
Definition Process.cpp:1240
uint32_t GetAddressByteSize() const
Definition Process.cpp:3720
uint32_t GetStopID() const
Definition Process.h:1472
void SetPrivateState(lldb::StateType state)
Definition Process.cpp:1404
lldb::addr_t m_highmem_data_address_mask
Definition Process.h:3314
virtual Status DoDestroy()=0
Status StopForDestroyOrDetach(lldb::EventSP &exit_event_sp)
Definition Process.cpp:3510
bool GetWatchpointReportedAfter()
Whether lldb will be notified about watchpoints after the instruction has completed executing,...
Definition Process.cpp:2603
lldb::StateType GetNextEvent(lldb::EventSP &event_sp)
Definition Process.cpp:633
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.
Definition Process.h:3142
bool StateChangedIsExternallyHijacked()
Definition Process.cpp:1384
virtual size_t GetSTDERR(char *buf, size_t buf_size, Status &error)
Get any available STDERR.
Definition Process.cpp:4707
size_t WriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size, Status &error)
Write memory to a process.
Definition Process.cpp:2393
virtual llvm::Expected< bool > SaveCore(llvm::StringRef outfile)
Save core dump into the specified file.
Definition Process.cpp:2935
bool ProcessIOHandlerIsActive()
Definition Process.cpp:4896
Status DestroyImpl(bool force_kill)
Definition Process.cpp:3623
bool m_force_next_event_delivery
Definition Process.h:3318
lldb::SystemRuntimeUP m_system_runtime_up
Definition Process.h:3255
virtual Status WillHalt()
Called before halting to a process.
Definition Process.h:1144
bool ShouldBroadcastEvent(Event *event_ptr)
This is the part of the event handling that for a process event.
Definition Process.cpp:3724
virtual DynamicLoader * GetDynamicLoader()
Get the dynamic loader plug-in for this process.
Definition Process.cpp:2923
std::string m_exit_string
A textual description of why a process exited.
Definition Process.h:3214
lldb::DynamicCheckerFunctionsUP m_dynamic_checkers_up
The functions used by the expression parser to validate data that expressions use.
Definition Process.h:3249
void SyncIOHandler(uint32_t iohandler_id, const Timeout< std::micro > &timeout)
Waits for the process state to be running within a given msec timeout.
Definition Process.cpp:644
void ForceNextEventDelivery()
Definition Process.h:3073
ThreadPlanStack * FindThreadPlans(lldb::tid_t tid)
Find the thread plan stack associated with thread with tid.
Definition Process.cpp:1221
void SetSTDIOFileDescriptor(int file_descriptor)
Associates a file descriptor with the process' STDIO handling and configures an asynchronous reading ...
Definition Process.cpp:4877
virtual Status Attach(ProcessAttachInfo &attach_info)
Attach to an existing process using the process attach info.
Definition Process.cpp:3049
virtual void Finalize(bool destructing)
This object is about to be destroyed, do any necessary cleanup.
Definition Process.cpp:538
lldb::addr_t GetDataAddressMask()
Definition Process.cpp:6005
void SynchronouslyNotifyStateChanged(lldb::StateType state)
Definition Process.cpp:612
bool CanJIT()
Determines whether executing JIT-compiled code in this process is possible.
Definition Process.cpp:2556
virtual lldb_private::UUID FindModuleUUID(const llvm::StringRef path)
Definition Process.cpp:6210
virtual Status DoAttachToProcessWithName(const char *process_name, const ProcessAttachInfo &attach_info)
Attach to an existing process using a partial process name.
Definition Process.h:1019
ThreadList m_thread_list
The threads for this process as the user will see them.
Definition Process.h:3220
bool UpdateThreadList(ThreadList &old_thread_list, ThreadList &new_thread_list)
Update the thread list.
Definition Process.cpp:1128
const lldb::UnixSignalsSP & GetUnixSignals()
Definition Process.cpp:3711
void SetBaseDirection(lldb::RunDirection direction)
Set the base run direction for the process.
Definition Process.cpp:3334
Status WriteMemoryTags(lldb::addr_t addr, size_t len, const std::vector< lldb::addr_t > &tags)
Write memory tags for a range of memory.
Definition Process.cpp:6586
virtual size_t DoReadMemory(lldb::addr_t vm_addr, void *buf, size_t size, Status &error)=0
Actually do the reading of memory from a process.
virtual bool IsLiveDebugSession() const
Check if a process is a live debug session, or a corefile/post-mortem.
Definition Process.h:1516
std::weak_ptr< Target > m_target_wp
The target that owns this process.
Definition Process.h:3189
virtual void DoDidExec()
Subclasses of Process should implement this function if they need to do anything after a process exec...
Definition Process.h:1044
virtual void RefreshStateAfterStop()=0
Currently called as part of ShouldStop.
virtual llvm::SmallVector< llvm::MutableArrayRef< uint8_t > > ReadMemoryRanges(llvm::ArrayRef< Range< lldb::addr_t, size_t > > ranges, llvm::MutableArrayRef< uint8_t > buffer)
Read from multiple memory ranges and write the results into buffer.
Definition Process.cpp:1975
lldb::addr_t GetCodeAddressMask()
Get the current address mask in the Process.
Definition Process.cpp:5998
bool UnregisterNotificationCallbacks(const Process::Notifications &callbacks)
Unregister for process and thread notifications.
Definition Process.cpp:599
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...
Definition Process.cpp:919
Status GetMemoryRegionInfo(lldb::addr_t load_addr, MemoryRegionInfo &range_info)
Locate the memory region that contains load_addr.
Definition Process.cpp:6314
friend class DynamicLoader
Definition Process.h:357
static void SettingsTerminate()
Definition Process.cpp:4935
lldb::addr_t GetHighmemDataAddressMask()
Definition Process.cpp:6021
ThreadList m_extended_thread_list
Constituent for extended threads that may be generated, cleared on natural stops.
Definition Process.h:3229
bool CallVoidArgVoidPtrReturn(const Address *address, lldb::addr_t &returned_func, bool trap_exceptions=false)
Definition Process.cpp:6493
bool CurrentThreadIsPrivateStateThread()
Definition Process.cpp:5977
void AddPreResumeAction(PreResumeActionCallback callback, void *baton)
Definition Process.cpp:5942
size_t GetSoftwareBreakpointTrapOpcode(BreakpointSite *bp_site)
Definition Process.cpp:1746
Status Halt(bool clear_thread_plans=false, bool use_run_lock=true)
Halts a running process.
Definition Process.cpp:3408
lldb::pid_t m_pid
Definition Process.h:3190
const lldb::ABISP & GetABI()
Definition Process.cpp:1481
friend class Debugger
Definition Process.h:356
Status WillLaunch(Module *module)
Called before launching to a process.
Definition Process.cpp:3036
lldb::ModuleSP ReadModuleFromMemory(const FileSpec &file_spec, lldb::addr_t header_addr, size_t size_to_read=512)
Definition Process.cpp:2621
std::vector< lldb::ThreadSP > CalculateCoreFileThreadList(const SaveCoreOptions &core_options)
Helper function for Process::SaveCore(...) that calculates the thread list based upon options set wit...
Definition Process.cpp:6893
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.
Definition Process.cpp:2474
virtual size_t GetSTDOUT(char *buf, size_t buf_size, Status &error)
Get any available STDOUT.
Definition Process.cpp:4688
lldb::ThreadCollectionSP GetHistoryThreads(lldb::addr_t addr)
Definition Process.cpp:6214
lldb::StateType GetStateChangedEvents(lldb::EventSP &event_sp, const Timeout< std::micro > &timeout, lldb::ListenerSP hijack_listener)
Definition Process.cpp:929
ThreadedCommunication m_stdio_communication
Definition Process.h:3261
std::atomic< bool > m_finalizing
The tid of the thread that issued the async interrupt, used by thread plan timeout.
Definition Process.h:3294
std::recursive_mutex m_language_runtimes_mutex
Definition Process.h:3275
std::string m_stderr_data
Definition Process.h:3266
friend class ThreadList
Definition Process.h:361
Target & GetTarget()
Get the target object pointer for this module.
Definition Process.h:1267
virtual Status EnableWatchpoint(lldb::WatchpointSP wp_sp, bool notify=true)
Definition Process.cpp:2665
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
Definition Property.h:45
void Append(const Entry &entry)
Definition RangeMap.h:474
uint64_t GetPC(uint64_t fail_value=LLDB_INVALID_ADDRESS)
lldb::SaveCoreStyle GetStyle() const
const MemoryRanges & GetCoreFileMemoryRanges() const
bool ShouldThreadBeSaved(lldb::tid_t tid) const
size_t GetByteSize() const
Definition Scalar.cpp:162
bool SignExtend(uint32_t bit_pos)
Definition Scalar.cpp:762
unsigned long long ULongLong(unsigned long long fail_value=0) const
Definition Scalar.cpp:365
size_t GetAsMemoryData(void *dst, size_t dst_len, lldb::ByteOrder dst_byte_order, Status &error) const
Definition Scalar.cpp:788
long long SLongLong(long long fail_value=0) const
Definition Scalar.cpp:361
This base class provides an interface to stack frames.
Definition StackFrame.h:44
virtual StackID & GetStackID()
void CalculateExecutionContext(ExecutionContext &exe_ctx) override
Reconstruct the object's execution context into sc.
bool IsValid() const
Definition StackID.h:47
An error handling class.
Definition Status.h:118
void Clear()
Clear the object state.
Definition Status.cpp:215
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
Definition Status.cpp:106
static Status FromErrorString(const char *str)
Definition Status.h:141
bool Fail() const
Test for error condition.
Definition Status.cpp:294
const char * AsCString(const char *default_error_str="unknown error") const
Get the error string associated with the current error.
Definition Status.cpp:195
static Status FromError(llvm::Error error)
Avoid using this in new code. Migrate APIs to llvm::Expected instead.
Definition Status.cpp:137
bool Success() const
Test for success condition.
Definition Status.cpp:304
static lldb::ValueObjectSP GetCrashingDereference(lldb::StopInfoSP &stop_info_sp, lldb::addr_t *crashing_address=nullptr)
void ForEach(std::function< void(StopPointSite *)> const &callback)
lldb::break_id_t GetID() const
virtual lldb::addr_t GetLoadAddress() const
uint32_t GetByteSize() const
const char * GetData() const
llvm::StringRef GetString() const
A stream class that can stream formatted output to a file.
Definition Stream.h:28
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
Definition Stream.cpp:134
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
Definition Stream.cpp:65
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
Definition Symbol.cpp:504
bool IsIndirect() const
Definition Symbol.cpp:223
ConstString GetName() const
Definition Symbol.cpp:511
Address GetAddress() const
Definition Symbol.h:89
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)
Definition Target.cpp:4590
lldb::DynamicValueType GetPreferDynamicValue() const
Definition Target.cpp:4583
Module * GetExecutableModulePointer()
Definition Target.cpp:1540
Debugger & GetDebugger() const
Definition Target.h:1194
void UpdateSignalsFromDummy(lldb::UnixSignalsSP signals_sp, lldb::StreamSP warning_stream_sp)
Updates the signals in signals_sp using the stored dummy signals.
Definition Target.cpp:3914
void ClearAllLoadedSections()
Definition Target.cpp:3405
void ClearModules(bool delete_locations)
Definition Target.cpp:1562
Architecture * GetArchitecturePlugin() const
Definition Target.h:1192
TargetStats & GetStatistics()
Definition Target.h:1839
bool SetArchitecture(const ArchSpec &arch_spec, bool set_platform=false, bool merge=true)
Set the architecture for this target.
Definition Target.cpp:1704
llvm::Expected< lldb::TypeSystemSP > GetScratchTypeSystemForLanguage(lldb::LanguageType language, bool create_on_demand=true)
Definition Target.cpp:2614
lldb::ModuleSP GetExecutableModule()
Gets the module for the main executable.
Definition Target.cpp:1524
void DidExec()
Called as the last function in Process::DidExec().
Definition Target.cpp:1569
bool RunStopHooks(bool at_initial_stop=false)
Definition Target.cpp:3130
Status Install(ProcessLaunchInfo *launch_info)
Definition Target.cpp:3295
lldb::PlatformSP GetPlatform()
Definition Target.h:1648
const ArchSpec & GetArchitecture() const
Definition Target.h:1153
void SetExecutableModule(lldb::ModuleSP &module_sp, LoadDependentFiles load_dependent_files=eLoadDependentsDefault)
Set the main executable module.
Definition Target.cpp:1575
void SetPlatform(const lldb::PlatformSP &platform_sp)
Definition Target.h:1650
A RAII-friendly terminal state saving/restoring class.
Definition Terminal.h:99
llvm::Error SetEcho(bool enabled)
Definition Terminal.cpp:76
llvm::Error SetCanonical(bool enabled)
Definition Terminal.cpp:92
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()
Definition Thread.cpp:1772
static void SettingsTerminate()
Definition Thread.cpp:1774
static ThreadProperties & GetGlobalProperties()
Definition Thread.cpp:66
Represents UUID's of various sizes.
Definition UUID.h:27
RAII guard that should be acquired when an utility function is called within a given process.
Definition Process.h:3447
"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.
Definition DataBuffer.h:108
#define UINT64_MAX
#define LLDB_INVALID_BREAK_ID
#define LLDB_INVALID_ADDRESS_MASK
Address Mask Bits not used for addressing are set to 1 in the mask; all mask bits set is an invalid v...
#define LLDB_INVALID_THREAD_ID
#define UNUSED_IF_ASSERT_DISABLED(x)
#define LLDB_INVALID_IMAGE_TOKEN
#define LLDB_INVALID_ADDRESS
#define UINT32_MAX
#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.
Definition Log.h:332
bool StateIsStoppedState(lldb::StateType state, bool must_exist)
Check if a state represents a state where the process or thread is stopped.
Definition State.cpp:89
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.
Definition State.cpp:68
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.
Definition Predicate.h:29
PipePosix Pipe
Definition Pipe.h:20
const char * StateAsCString(lldb::StateType state)
Converts a StateType to a C string.
Definition State.cpp:14
std::vector< ProcessInstanceInfo > ProcessInstanceInfoList
Definition Host.h:32
static uint32_t bits(const uint32_t val, const uint32_t msbit, const uint32_t lsbit)
Definition ARMUtils.h:265
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.
@ eDescriptionLevelBrief
@ eDescriptionLevelVerbose
RunDirection
Execution directions.
std::shared_ptr< lldb_private::IOHandler > IOHandlerSP
std::shared_ptr< lldb_private::Thread > ThreadSP
void * thread_result_t
Definition lldb-types.h:62
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
std::shared_ptr< lldb_private::UnixSignals > UnixSignalsSP
std::shared_ptr< lldb_private::Platform > PlatformSP
uint64_t offset_t
Definition lldb-types.h:85
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.
@ eLanguageTypeAssembly
std::shared_ptr< lldb_private::MemoryHistory > MemoryHistorySP
ExpressionResults
The results of expression evaluation.
@ eExpressionCompleted
@ eExpressionHitBreakpoint
@ eExpressionInterrupted
@ eExpressionDiscarded
@ eExpressionStoppedForDebug
@ eExpressionThreadVanished
@ eExpressionSetupError
std::shared_ptr< lldb_private::StructuredDataPlugin > StructuredDataPluginSP
int32_t break_id_t
Definition lldb-types.h:86
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
uint64_t pid_t
Definition lldb-types.h:83
ByteOrder
Byte ordering definitions.
std::shared_ptr< lldb_private::Watchpoint > WatchpointSP
std::shared_ptr< lldb_private::Listener > ListenerSP
uint64_t user_id_t
Definition lldb-types.h:82
std::shared_ptr< lldb_private::StopInfo > StopInfoSP
uint64_t addr_t
Definition lldb-types.h:80
StopReason
Thread stop reasons.
@ eStopReasonPlanComplete
@ eStopReasonBreakpoint
std::shared_ptr< lldb_private::Target > TargetSP
std::shared_ptr< lldb_private::RegisterContext > RegisterContextSP
std::shared_ptr< lldb_private::InstrumentationRuntime > InstrumentationRuntimeSP
uint64_t tid_t
Definition lldb-types.h:84
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).
Definition Type.h:38
A notification structure that can be used by clients to listen for changes in a process's lifetime.
Definition Process.h:415
void(* process_state_changed)(void *baton, Process *process, lldb::StateType state)
Definition Process.h:418
void(* initialize)(void *baton, Process *process)
Definition Process.h:417
bool Contains(BaseType r) const
Definition RangeMap.h:93
BaseType GetRangeBase() const
Definition RangeMap.h:45
SizeType GetByteSize() const
Definition RangeMap.h:87
void SetRangeBase(BaseType b)
Set the start value for the range, and keep the same size.
Definition RangeMap.h:48
BaseType GetRangeEnd() const
Definition RangeMap.h:78
Range Intersect(const Range &rhs) const
Definition RangeMap.h:67
void SetByteSize(SizeType s)
Definition RangeMap.h:89
std::optional< ExitDescription > exit_desc
Definition Telemetry.h:224
Helper RAII class for collecting telemetry.
Definition Telemetry.h:269
void DispatchOnExit(llvm::unique_function< void(Info *info)> final_callback)
Definition Telemetry.h:287
void DispatchNow(llvm::unique_function< void(Info *info)> populate_fields_cb)
Definition Telemetry.h:293
void SetDebugger(Debugger *debugger)
Definition Telemetry.h:285
#define SIGKILL
#define PATH_MAX