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