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