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
1975 const uint8_t *buf, size_t size,
1976 AddressRanges &matches, size_t alignment,
1977 size_t max_matches) {
1978 // Inputs are already validated in FindInMemory() functions.
1979 assert(buf != nullptr);
1980 assert(size > 0);
1981 assert(alignment > 0);
1982 assert(max_matches > 0);
1983 assert(start_addr != LLDB_INVALID_ADDRESS);
1984 assert(end_addr != LLDB_INVALID_ADDRESS);
1985 assert(start_addr < end_addr);
1986
1987 lldb::addr_t start = llvm::alignTo(start_addr, alignment);
1988 while (matches.size() < max_matches && (start + size) < end_addr) {
1989 const lldb::addr_t found_addr = FindInMemory(start, end_addr, buf, size);
1990 if (found_addr == LLDB_INVALID_ADDRESS)
1991 break;
1992
1993 if (found_addr % alignment) {
1994 // We need to check the alignment because the FindInMemory uses a special
1995 // algorithm to efficiently search mememory but doesn't support alignment.
1996 start = llvm::alignTo(start + 1, alignment);
1997 continue;
1998 }
1999
2000 matches.emplace_back(found_addr, size);
2001 start = found_addr + alignment;
2002 }
2003}
2004
2005AddressRanges Process::FindRangesInMemory(const uint8_t *buf, uint64_t size,
2006 const AddressRanges &ranges,
2007 size_t alignment, size_t max_matches,
2008 Status &error) {
2009 AddressRanges matches;
2010 if (buf == nullptr) {
2011 error = Status::FromErrorString("buffer is null");
2012 return matches;
2013 }
2014 if (size == 0) {
2015 error = Status::FromErrorString("buffer size is zero");
2016 return matches;
2017 }
2018 if (ranges.empty()) {
2019 error = Status::FromErrorString("empty ranges");
2020 return matches;
2021 }
2022 if (alignment == 0) {
2023 error = Status::FromErrorString("alignment must be greater than zero");
2024 return matches;
2025 }
2026 if (max_matches == 0) {
2027 error = Status::FromErrorString("max_matches must be greater than zero");
2028 return matches;
2029 }
2030
2031 int resolved_ranges = 0;
2032 Target &target = GetTarget();
2033 for (size_t i = 0; i < ranges.size(); ++i) {
2034 if (matches.size() >= max_matches)
2035 break;
2036 const AddressRange &range = ranges[i];
2037 if (range.IsValid() == false)
2038 continue;
2039
2040 const lldb::addr_t start_addr =
2041 range.GetBaseAddress().GetLoadAddress(&target);
2042 if (start_addr == LLDB_INVALID_ADDRESS)
2043 continue;
2044
2045 ++resolved_ranges;
2046 const lldb::addr_t end_addr = start_addr + range.GetByteSize();
2047 DoFindInMemory(start_addr, end_addr, buf, size, matches, alignment,
2048 max_matches);
2049 }
2050
2051 if (resolved_ranges > 0)
2052 error.Clear();
2053 else
2054 error = Status::FromErrorString("unable to resolve any ranges");
2055
2056 return matches;
2057}
2058
2059lldb::addr_t Process::FindInMemory(const uint8_t *buf, uint64_t size,
2060 const AddressRange &range, size_t alignment,
2061 Status &error) {
2062 if (buf == nullptr) {
2063 error = Status::FromErrorString("buffer is null");
2064 return LLDB_INVALID_ADDRESS;
2065 }
2066 if (size == 0) {
2067 error = Status::FromErrorString("buffer size is zero");
2068 return LLDB_INVALID_ADDRESS;
2069 }
2070 if (!range.IsValid()) {
2071 error = Status::FromErrorString("range is invalid");
2072 return LLDB_INVALID_ADDRESS;
2073 }
2074 if (alignment == 0) {
2075 error = Status::FromErrorString("alignment must be greater than zero");
2076 return LLDB_INVALID_ADDRESS;
2077 }
2078
2079 Target &target = GetTarget();
2080 const lldb::addr_t start_addr =
2081 range.GetBaseAddress().GetLoadAddress(&target);
2082 if (start_addr == LLDB_INVALID_ADDRESS) {
2083 error = Status::FromErrorString("range load address is invalid");
2084 return LLDB_INVALID_ADDRESS;
2085 }
2086 const lldb::addr_t end_addr = start_addr + range.GetByteSize();
2087
2088 AddressRanges matches;
2089 DoFindInMemory(start_addr, end_addr, buf, size, matches, alignment, 1);
2090 if (matches.empty())
2091 return LLDB_INVALID_ADDRESS;
2092
2093 error.Clear();
2094 return matches[0].GetBaseAddress().GetLoadAddress(&target);
2095}
2096
2097size_t Process::ReadCStringFromMemory(addr_t addr, std::string &out_str,
2098 Status &error) {
2099 char buf[256];
2100 out_str.clear();
2101 addr_t curr_addr = addr;
2102 while (true) {
2103 size_t length = ReadCStringFromMemory(curr_addr, buf, sizeof(buf), error);
2104 if (length == 0)
2105 break;
2106 out_str.append(buf, length);
2107 // If we got "length - 1" bytes, we didn't get the whole C string, we need
2108 // to read some more characters
2109 if (length == sizeof(buf) - 1)
2110 curr_addr += length;
2111 else
2112 break;
2113 }
2114 return out_str.size();
2115}
2116
2117// Deprecated in favor of ReadStringFromMemory which has wchar support and
2118// correct code to find null terminators.
2120 size_t dst_max_len,
2121 Status &result_error) {
2122 size_t total_cstr_len = 0;
2123 if (dst && dst_max_len) {
2124 result_error.Clear();
2125 // NULL out everything just to be safe
2126 memset(dst, 0, dst_max_len);
2127 addr_t curr_addr = addr;
2128 const size_t cache_line_size = m_memory_cache.GetMemoryCacheLineSize();
2129 size_t bytes_left = dst_max_len - 1;
2130 char *curr_dst = dst;
2131
2132 while (bytes_left > 0) {
2133 addr_t cache_line_bytes_left =
2134 cache_line_size - (curr_addr % cache_line_size);
2135 addr_t bytes_to_read =
2136 std::min<addr_t>(bytes_left, cache_line_bytes_left);
2137 Status error;
2138 size_t bytes_read = ReadMemory(curr_addr, curr_dst, bytes_to_read, error);
2139
2140 if (bytes_read == 0) {
2141 result_error = std::move(error);
2142 dst[total_cstr_len] = '\0';
2143 break;
2144 }
2145 const size_t len = strlen(curr_dst);
2146
2147 total_cstr_len += len;
2148
2149 if (len < bytes_to_read)
2150 break;
2151
2152 curr_dst += bytes_read;
2153 curr_addr += bytes_read;
2154 bytes_left -= bytes_read;
2155 }
2156 } else {
2157 if (dst == nullptr)
2158 result_error = Status::FromErrorString("invalid arguments");
2159 else
2160 result_error.Clear();
2161 }
2162 return total_cstr_len;
2163}
2164
2165size_t Process::ReadMemoryFromInferior(addr_t addr, void *buf, size_t size,
2166 Status &error) {
2168
2169 if (ABISP abi_sp = GetABI())
2170 addr = abi_sp->FixAnyAddress(addr);
2171
2172 if (buf == nullptr || size == 0)
2173 return 0;
2174
2175 size_t bytes_read = 0;
2176 uint8_t *bytes = (uint8_t *)buf;
2177
2178 while (bytes_read < size) {
2179 const size_t curr_size = size - bytes_read;
2180 const size_t curr_bytes_read =
2181 DoReadMemory(addr + bytes_read, bytes + bytes_read, curr_size, error);
2182 bytes_read += curr_bytes_read;
2183 if (curr_bytes_read == curr_size || curr_bytes_read == 0)
2184 break;
2185 }
2186
2187 // Replace any software breakpoint opcodes that fall into this range back
2188 // into "buf" before we return
2189 if (bytes_read > 0)
2190 RemoveBreakpointOpcodesFromBuffer(addr, bytes_read, (uint8_t *)buf);
2191 return bytes_read;
2192}
2193
2195 lldb::addr_t chunk_size,
2196 lldb::offset_t size,
2197 ReadMemoryChunkCallback callback) {
2198 // Safety check to prevent an infinite loop.
2199 if (chunk_size == 0)
2200 return 0;
2201
2202 // Buffer for when a NULL buf is provided, initialized
2203 // to 0 bytes, we set it to chunk_size and then replace buf
2204 // with the new buffer.
2205 DataBufferHeap data_buffer;
2206 if (!buf) {
2207 data_buffer.SetByteSize(chunk_size);
2208 buf = data_buffer.GetBytes();
2209 }
2210
2211 uint64_t bytes_remaining = size;
2212 uint64_t bytes_read = 0;
2213 Status error;
2214 while (bytes_remaining > 0) {
2215 // Get the next read chunk size as the minimum of the remaining bytes and
2216 // the write chunk max size.
2217 const lldb::addr_t bytes_to_read = std::min(bytes_remaining, chunk_size);
2218 const lldb::addr_t current_addr = vm_addr + bytes_read;
2219 const lldb::addr_t bytes_read_for_chunk =
2220 ReadMemoryFromInferior(current_addr, buf, bytes_to_read, error);
2221
2222 bytes_read += bytes_read_for_chunk;
2223 // If the bytes read in this chunk would cause us to overflow, something
2224 // went wrong and we should fail fast.
2225 if (bytes_read_for_chunk > bytes_remaining)
2226 return 0;
2227 else
2228 bytes_remaining -= bytes_read_for_chunk;
2229
2230 if (callback(error, current_addr, buf, bytes_read_for_chunk) ==
2232 break;
2233 }
2234
2235 return bytes_read;
2236}
2237
2239 size_t integer_byte_size,
2240 uint64_t fail_value,
2241 Status &error) {
2242 Scalar scalar;
2243 if (ReadScalarIntegerFromMemory(vm_addr, integer_byte_size, false, scalar,
2244 error))
2245 return scalar.ULongLong(fail_value);
2246 return fail_value;
2247}
2248
2250 size_t integer_byte_size,
2251 int64_t fail_value,
2252 Status &error) {
2253 Scalar scalar;
2254 if (ReadScalarIntegerFromMemory(vm_addr, integer_byte_size, true, scalar,
2255 error))
2256 return scalar.SLongLong(fail_value);
2257 return fail_value;
2258}
2259
2261 Scalar scalar;
2262 if (ReadScalarIntegerFromMemory(vm_addr, GetAddressByteSize(), false, scalar,
2263 error))
2264 return scalar.ULongLong(LLDB_INVALID_ADDRESS);
2265 return LLDB_INVALID_ADDRESS;
2266}
2267
2269 Status &error) {
2270 Scalar scalar;
2271 const uint32_t addr_byte_size = GetAddressByteSize();
2272 if (addr_byte_size <= 4)
2273 scalar = (uint32_t)ptr_value;
2274 else
2275 scalar = ptr_value;
2276 return WriteScalarToMemory(vm_addr, scalar, addr_byte_size, error) ==
2277 addr_byte_size;
2278}
2279
2280size_t Process::WriteMemoryPrivate(addr_t addr, const void *buf, size_t size,
2281 Status &error) {
2282 size_t bytes_written = 0;
2283 const uint8_t *bytes = (const uint8_t *)buf;
2284
2285 while (bytes_written < size) {
2286 const size_t curr_size = size - bytes_written;
2287 const size_t curr_bytes_written = DoWriteMemory(
2288 addr + bytes_written, bytes + bytes_written, curr_size, error);
2289 bytes_written += curr_bytes_written;
2290 if (curr_bytes_written == curr_size || curr_bytes_written == 0)
2291 break;
2292 }
2293 return bytes_written;
2294}
2295
2296size_t Process::WriteMemory(addr_t addr, const void *buf, size_t size,
2297 Status &error) {
2298 if (ABISP abi_sp = GetABI())
2299 addr = abi_sp->FixAnyAddress(addr);
2300
2301 m_memory_cache.Flush(addr, size);
2302
2303 if (buf == nullptr || size == 0)
2304 return 0;
2305
2306 if (TrackMemoryCacheChanges() || !m_allocated_memory_cache.IsInCache(addr))
2307 m_mod_id.BumpMemoryID();
2308
2309 // We need to write any data that would go where any current software traps
2310 // (enabled software breakpoints) any software traps (breakpoints) that we
2311 // may have placed in our tasks memory.
2312
2313 StopPointSiteList<BreakpointSite> bp_sites_in_range;
2314 if (!m_breakpoint_site_list.FindInRange(addr, addr + size, bp_sites_in_range))
2315 return WriteMemoryPrivate(addr, buf, size, error);
2316
2317 // No breakpoint sites overlap
2318 if (bp_sites_in_range.IsEmpty())
2319 return WriteMemoryPrivate(addr, buf, size, error);
2320
2321 const uint8_t *ubuf = (const uint8_t *)buf;
2322 uint64_t bytes_written = 0;
2323
2324 bp_sites_in_range.ForEach([this, addr, size, &bytes_written, &ubuf,
2325 &error](BreakpointSite *bp) -> void {
2326 if (error.Fail())
2327 return;
2328
2330 return;
2331
2332 addr_t intersect_addr;
2333 size_t intersect_size;
2334 size_t opcode_offset;
2335 const bool intersects = bp->IntersectsRange(
2336 addr, size, &intersect_addr, &intersect_size, &opcode_offset);
2337 UNUSED_IF_ASSERT_DISABLED(intersects);
2338 assert(intersects);
2339 assert(addr <= intersect_addr && intersect_addr < addr + size);
2340 assert(addr < intersect_addr + intersect_size &&
2341 intersect_addr + intersect_size <= addr + size);
2342 assert(opcode_offset + intersect_size <= bp->GetByteSize());
2343
2344 // Check for bytes before this breakpoint
2345 const addr_t curr_addr = addr + bytes_written;
2346 if (intersect_addr > curr_addr) {
2347 // There are some bytes before this breakpoint that we need to just
2348 // write to memory
2349 size_t curr_size = intersect_addr - curr_addr;
2350 size_t curr_bytes_written =
2351 WriteMemoryPrivate(curr_addr, ubuf + bytes_written, curr_size, error);
2352 bytes_written += curr_bytes_written;
2353 if (curr_bytes_written != curr_size) {
2354 // We weren't able to write all of the requested bytes, we are
2355 // done looping and will return the number of bytes that we have
2356 // written so far.
2357 if (error.Success())
2358 error = Status::FromErrorString("could not write all bytes");
2359 }
2360 }
2361 // Now write any bytes that would cover up any software breakpoints
2362 // directly into the breakpoint opcode buffer
2363 ::memcpy(bp->GetSavedOpcodeBytes() + opcode_offset, ubuf + bytes_written,
2364 intersect_size);
2365 bytes_written += intersect_size;
2366 });
2367
2368 // Write any remaining bytes after the last breakpoint if we have any left
2369 if (bytes_written < size)
2370 bytes_written +=
2371 WriteMemoryPrivate(addr + bytes_written, ubuf + bytes_written,
2372 size - bytes_written, error);
2373
2374 return bytes_written;
2375}
2376
2377size_t Process::WriteScalarToMemory(addr_t addr, const Scalar &scalar,
2378 size_t byte_size, Status &error) {
2379 if (byte_size == UINT32_MAX)
2380 byte_size = scalar.GetByteSize();
2381 if (byte_size > 0) {
2382 uint8_t buf[32];
2383 const size_t mem_size =
2384 scalar.GetAsMemoryData(buf, byte_size, GetByteOrder(), error);
2385 if (mem_size > 0)
2386 return WriteMemory(addr, buf, mem_size, error);
2387 else
2388 error = Status::FromErrorString("failed to get scalar as memory data");
2389 } else {
2390 error = Status::FromErrorString("invalid scalar value");
2391 }
2392 return 0;
2393}
2394
2395size_t Process::ReadScalarIntegerFromMemory(addr_t addr, uint32_t byte_size,
2396 bool is_signed, Scalar &scalar,
2397 Status &error) {
2398 uint64_t uval = 0;
2399 if (byte_size == 0) {
2400 error = Status::FromErrorString("byte size is zero");
2401 } else if (byte_size & (byte_size - 1)) {
2403 "byte size %u is not a power of 2", byte_size);
2404 } else if (byte_size <= sizeof(uval)) {
2405 const size_t bytes_read = ReadMemory(addr, &uval, byte_size, error);
2406 if (bytes_read == byte_size) {
2407 DataExtractor data(&uval, sizeof(uval), GetByteOrder(),
2409 lldb::offset_t offset = 0;
2410 if (byte_size <= 4)
2411 scalar = data.GetMaxU32(&offset, byte_size);
2412 else
2413 scalar = data.GetMaxU64(&offset, byte_size);
2414 if (is_signed)
2415 scalar.SignExtend(byte_size * 8);
2416 return bytes_read;
2417 }
2418 } else {
2420 "byte size of %u is too large for integer scalar type", byte_size);
2421 }
2422 return 0;
2423}
2424
2425Status Process::WriteObjectFile(std::vector<ObjectFile::LoadableData> entries) {
2426 Status error;
2427 for (const auto &Entry : entries) {
2428 WriteMemory(Entry.Dest, Entry.Contents.data(), Entry.Contents.size(),
2429 error);
2430 if (!error.Success())
2431 break;
2432 }
2433 return error;
2434}
2435
2436addr_t Process::AllocateMemory(size_t size, uint32_t permissions,
2437 Status &error) {
2438 if (GetPrivateState() != eStateStopped) {
2440 "cannot allocate memory while process is running");
2441 return LLDB_INVALID_ADDRESS;
2442 }
2443
2444 return m_allocated_memory_cache.AllocateMemory(size, permissions, error);
2445}
2446
2447addr_t Process::CallocateMemory(size_t size, uint32_t permissions,
2448 Status &error) {
2449 addr_t return_addr = AllocateMemory(size, permissions, error);
2450 if (error.Success()) {
2451 std::string buffer(size, 0);
2452 WriteMemory(return_addr, buffer.c_str(), size, error);
2453 }
2454 return return_addr;
2455}
2456
2458 if (m_can_jit == eCanJITDontKnow) {
2459 Log *log = GetLog(LLDBLog::Process);
2460 Status err;
2461
2462 uint64_t allocated_memory = AllocateMemory(
2463 8, ePermissionsReadable | ePermissionsWritable | ePermissionsExecutable,
2464 err);
2465
2466 if (err.Success()) {
2468 LLDB_LOGF(log,
2469 "Process::%s pid %" PRIu64
2470 " allocation test passed, CanJIT () is true",
2471 __FUNCTION__, GetID());
2472 } else {
2474 LLDB_LOGF(log,
2475 "Process::%s pid %" PRIu64
2476 " allocation test failed, CanJIT () is false: %s",
2477 __FUNCTION__, GetID(), err.AsCString());
2478 }
2479
2480 DeallocateMemory(allocated_memory);
2481 }
2482
2483 return m_can_jit == eCanJITYes;
2484}
2485
2486void Process::SetCanJIT(bool can_jit) {
2487 m_can_jit = (can_jit ? eCanJITYes : eCanJITNo);
2488}
2489
2490void Process::SetCanRunCode(bool can_run_code) {
2491 SetCanJIT(can_run_code);
2492 m_can_interpret_function_calls = can_run_code;
2493}
2494
2496 Status error;
2497 if (!m_allocated_memory_cache.DeallocateMemory(ptr)) {
2499 "deallocation of memory at 0x%" PRIx64 " failed.", (uint64_t)ptr);
2500 }
2501 return error;
2502}
2503
2505 if (std::optional<bool> subclass_override = DoGetWatchpointReportedAfter())
2506 return *subclass_override;
2507
2508 bool reported_after = true;
2509 const ArchSpec &arch = GetTarget().GetArchitecture();
2510 if (!arch.IsValid())
2511 return reported_after;
2512 llvm::Triple triple = arch.GetTriple();
2513
2514 if (triple.isMIPS() || triple.isPPC64() || triple.isRISCV() ||
2515 triple.isAArch64() || triple.isArmMClass() || triple.isARM() ||
2516 triple.isLoongArch())
2517 reported_after = false;
2518
2519 return reported_after;
2520}
2521
2523 lldb::addr_t header_addr,
2524 size_t size_to_read) {
2525 Log *log = GetLog(LLDBLog::Host);
2526 if (log) {
2527 LLDB_LOGF(log,
2528 "Process::ReadModuleFromMemory reading %s binary from memory",
2529 file_spec.GetPath().c_str());
2530 }
2531 ModuleSP module_sp(new Module(file_spec, ArchSpec()));
2532 if (module_sp) {
2533 Status error;
2534 std::unique_ptr<Progress> progress_up;
2535 // Reading an ObjectFile from a local corefile is very fast,
2536 // only print a progress update if we're reading from a
2537 // live session which might go over gdb remote serial protocol.
2538 if (IsLiveDebugSession())
2539 progress_up = std::make_unique<Progress>(
2540 "Reading binary from memory", file_spec.GetFilename().GetString());
2541
2542 ObjectFile *objfile = module_sp->GetMemoryObjectFile(
2543 shared_from_this(), header_addr, error, size_to_read);
2544 if (objfile)
2545 return module_sp;
2546 }
2547 return ModuleSP();
2548}
2549
2551 uint32_t &permissions) {
2552 MemoryRegionInfo range_info;
2553 permissions = 0;
2554 Status error(GetMemoryRegionInfo(load_addr, range_info));
2555 if (!error.Success())
2556 return false;
2557 if (range_info.GetReadable() == MemoryRegionInfo::eDontKnow ||
2558 range_info.GetWritable() == MemoryRegionInfo::eDontKnow ||
2560 return false;
2561 }
2562 permissions = range_info.GetLLDBPermissions();
2563 return true;
2564}
2565
2567 Status error;
2568 error = Status::FromErrorString("watchpoints are not supported");
2569 return error;
2570}
2571
2573 Status error;
2574 error = Status::FromErrorString("watchpoints are not supported");
2575 return error;
2576}
2577
2580 const Timeout<std::micro> &timeout) {
2581 StateType state;
2582
2583 while (true) {
2584 event_sp.reset();
2585 state = GetStateChangedEventsPrivate(event_sp, timeout);
2586
2587 if (StateIsStoppedState(state, false))
2588 break;
2589
2590 // If state is invalid, then we timed out
2591 if (state == eStateInvalid)
2592 break;
2593
2594 if (event_sp)
2595 HandlePrivateEvent(event_sp);
2596 }
2597 return state;
2598}
2599
2601 std::lock_guard<std::recursive_mutex> guard(m_thread_mutex);
2602 if (flush)
2603 m_thread_list.Clear();
2604 m_os_up.reset(OperatingSystem::FindPlugin(this, nullptr));
2605 if (flush)
2606 Flush();
2607}
2608
2610 StateType state_after_launch = eStateInvalid;
2611 EventSP first_stop_event_sp;
2612 Status status =
2613 LaunchPrivate(launch_info, state_after_launch, first_stop_event_sp);
2614 if (status.Fail())
2615 return status;
2616
2617 if (state_after_launch != eStateStopped &&
2618 state_after_launch != eStateCrashed)
2619 return Status();
2620
2621 // Note, the stop event was consumed above, but not handled. This
2622 // was done to give DidLaunch a chance to run. The target is either
2623 // stopped or crashed. Directly set the state. This is done to
2624 // prevent a stop message with a bunch of spurious output on thread
2625 // status, as well as not pop a ProcessIOHandler.
2626 SetPublicState(state_after_launch, false);
2627
2630 else
2632
2633 // Target was stopped at entry as was intended. Need to notify the
2634 // listeners about it.
2635 if (launch_info.GetFlags().Test(eLaunchFlagStopAtEntry))
2636 HandlePrivateEvent(first_stop_event_sp);
2637
2638 return Status();
2639}
2640
2642 EventSP &event_sp) {
2643 Status error;
2644 m_abi_sp.reset();
2645 m_dyld_up.reset();
2646 m_jit_loaders_up.reset();
2647 m_system_runtime_up.reset();
2648 m_os_up.reset();
2650
2651 {
2652 std::lock_guard<std::mutex> guard(m_process_input_reader_mutex);
2653 m_process_input_reader.reset();
2654 }
2655
2657
2658 // The "remote executable path" is hooked up to the local Executable
2659 // module. But we should be able to debug a remote process even if the
2660 // executable module only exists on the remote. However, there needs to
2661 // be a way to express this path, without actually having a module.
2662 // The way to do that is to set the ExecutableFile in the LaunchInfo.
2663 // Figure that out here:
2664
2665 FileSpec exe_spec_to_use;
2666 if (!exe_module) {
2667 if (!launch_info.GetExecutableFile() && !launch_info.IsScriptedProcess()) {
2668 error = Status::FromErrorString("executable module does not exist");
2669 return error;
2670 }
2671 exe_spec_to_use = launch_info.GetExecutableFile();
2672 } else
2673 exe_spec_to_use = exe_module->GetFileSpec();
2674
2675 if (exe_module && FileSystem::Instance().Exists(exe_module->GetFileSpec())) {
2676 // Install anything that might need to be installed prior to launching.
2677 // For host systems, this will do nothing, but if we are connected to a
2678 // remote platform it will install any needed binaries
2679 error = GetTarget().Install(&launch_info);
2680 if (error.Fail())
2681 return error;
2682 }
2683
2684 // Listen and queue events that are broadcasted during the process launch.
2685 ListenerSP listener_sp(Listener::MakeListener("LaunchEventHijack"));
2686 HijackProcessEvents(listener_sp);
2687 auto on_exit = llvm::make_scope_exit([this]() { RestoreProcessEvents(); });
2688
2691
2692 error = WillLaunch(exe_module);
2693 if (error.Fail()) {
2694 std::string local_exec_file_path = exe_spec_to_use.GetPath();
2695 return Status::FromErrorStringWithFormat("file doesn't exist: '%s'",
2696 local_exec_file_path.c_str());
2697 }
2698
2699 const bool restarted = false;
2700 SetPublicState(eStateLaunching, restarted);
2701 m_should_detach = false;
2702
2703 m_public_run_lock.SetRunning();
2704 error = DoLaunch(exe_module, launch_info);
2705
2706 if (error.Fail()) {
2707 if (GetID() != LLDB_INVALID_PROCESS_ID) {
2709 const char *error_string = error.AsCString();
2710 if (error_string == nullptr)
2711 error_string = "launch failed";
2712 SetExitStatus(-1, error_string);
2713 }
2714 return error;
2715 }
2716
2717 // Now wait for the process to launch and return control to us, and then
2718 // call DidLaunch:
2719 state = WaitForProcessStopPrivate(event_sp, seconds(10));
2720
2721 if (state == eStateInvalid || !event_sp) {
2722 // We were able to launch the process, but we failed to catch the
2723 // initial stop.
2724 error = Status::FromErrorString("failed to catch stop after launch");
2725 SetExitStatus(0, error.AsCString());
2726 Destroy(false);
2727 return error;
2728 }
2729
2730 if (state == eStateExited) {
2731 // We exited while trying to launch somehow. Don't call DidLaunch
2732 // as that's not likely to work, and return an invalid pid.
2733 HandlePrivateEvent(event_sp);
2734 return Status();
2735 }
2736
2737 if (state == eStateStopped || state == eStateCrashed) {
2738 DidLaunch();
2739
2740 // Now that we know the process type, update its signal responses from the
2741 // ones stored in the Target:
2744 m_unix_signals_sp, GetTarget().GetDebugger().GetAsyncErrorStream());
2745
2747 if (dyld)
2748 dyld->DidLaunch();
2749
2751
2752 SystemRuntime *system_runtime = GetSystemRuntime();
2753 if (system_runtime)
2754 system_runtime->DidLaunch();
2755
2756 if (!m_os_up)
2758
2759 // We successfully launched the process and stopped, now it the
2760 // right time to set up signal filters before resuming.
2762 return Status();
2763 }
2764
2766 "Unexpected process state after the launch: %s, expected %s, "
2767 "%s, %s or %s",
2771}
2772
2776 if (error.Success()) {
2777 ListenerSP listener_sp(
2778 Listener::MakeListener("lldb.process.load_core_listener"));
2779 HijackProcessEvents(listener_sp);
2780
2783 else
2785
2787 if (dyld)
2788 dyld->DidAttach();
2789
2791
2792 SystemRuntime *system_runtime = GetSystemRuntime();
2793 if (system_runtime)
2794 system_runtime->DidAttach();
2795
2796 if (!m_os_up)
2798
2799 // We successfully loaded a core file, now pretend we stopped so we can
2800 // show all of the threads in the core file and explore the crashed state.
2802
2803 // Wait for a stopped event since we just posted one above...
2804 lldb::EventSP event_sp;
2805 StateType state =
2806 WaitForProcessToStop(std::nullopt, &event_sp, true, listener_sp,
2807 nullptr, true, SelectMostRelevantFrame);
2808
2809 if (!StateIsStoppedState(state, false)) {
2810 Log *log = GetLog(LLDBLog::Process);
2811 LLDB_LOGF(log, "Process::Halt() failed to stop, state is: %s",
2812 StateAsCString(state));
2814 "Did not get stopped event after loading the core file.");
2815 }
2817 // Since we hijacked the event stream, we will have we won't have run the
2818 // stop hooks. Make sure we do that here:
2819 GetTarget().RunStopHooks(/* at_initial_stop= */ true);
2820 }
2821 return error;
2822}
2823
2825 if (!m_dyld_up)
2826 m_dyld_up.reset(DynamicLoader::FindPlugin(this, ""));
2827 return m_dyld_up.get();
2828}
2829
2831 m_dyld_up = std::move(dyld_up);
2832}
2833
2835
2836llvm::Expected<bool> Process::SaveCore(llvm::StringRef outfile) {
2837 return false;
2838}
2839
2841 if (!m_jit_loaders_up) {
2842 m_jit_loaders_up = std::make_unique<JITLoaderList>();
2844 }
2845 return *m_jit_loaders_up;
2846}
2847
2853
2855 uint32_t exec_count)
2856 : NextEventAction(process), m_exec_count(exec_count) {
2857 Log *log = GetLog(LLDBLog::Process);
2858 LLDB_LOGF(
2859 log,
2860 "Process::AttachCompletionHandler::%s process=%p, exec_count=%" PRIu32,
2861 __FUNCTION__, static_cast<void *>(process), exec_count);
2862}
2863
2866 Log *log = GetLog(LLDBLog::Process);
2867
2868 StateType state = ProcessEventData::GetStateFromEvent(event_sp.get());
2869 LLDB_LOGF(log,
2870 "Process::AttachCompletionHandler::%s called with state %s (%d)",
2871 __FUNCTION__, StateAsCString(state), static_cast<int>(state));
2872
2873 switch (state) {
2874 case eStateAttaching:
2875 return eEventActionSuccess;
2876
2877 case eStateRunning:
2878 case eStateConnected:
2879 return eEventActionRetry;
2880
2881 case eStateStopped:
2882 case eStateCrashed:
2883 // During attach, prior to sending the eStateStopped event,
2884 // lldb_private::Process subclasses must set the new process ID.
2885 assert(m_process->GetID() != LLDB_INVALID_PROCESS_ID);
2886 // We don't want these events to be reported, so go set the
2887 // ShouldReportStop here:
2888 m_process->GetThreadList().SetShouldReportStop(eVoteNo);
2889
2890 if (m_exec_count > 0) {
2891 --m_exec_count;
2892
2893 LLDB_LOGF(log,
2894 "Process::AttachCompletionHandler::%s state %s: reduced "
2895 "remaining exec count to %" PRIu32 ", requesting resume",
2896 __FUNCTION__, StateAsCString(state), m_exec_count);
2897
2898 RequestResume();
2899 return eEventActionRetry;
2900 } else {
2901 LLDB_LOGF(log,
2902 "Process::AttachCompletionHandler::%s state %s: no more "
2903 "execs expected to start, continuing with attach",
2904 __FUNCTION__, StateAsCString(state));
2905
2906 m_process->CompleteAttach();
2907 return eEventActionSuccess;
2908 }
2909 break;
2910
2911 default:
2912 case eStateExited:
2913 case eStateInvalid:
2914 break;
2915 }
2916
2917 m_exit_string.assign("No valid Process");
2918 return eEventActionExit;
2919}
2920
2925
2927 return m_exit_string.c_str();
2928}
2929
2931 if (m_listener_sp)
2932 return m_listener_sp;
2933 else
2934 return debugger.GetListener();
2935}
2936
2938 return DoWillLaunch(module);
2939}
2940
2944
2946 bool wait_for_launch) {
2947 return DoWillAttachToProcessWithName(process_name, wait_for_launch);
2948}
2949
2951 m_abi_sp.reset();
2952 {
2953 std::lock_guard<std::mutex> guard(m_process_input_reader_mutex);
2954 m_process_input_reader.reset();
2955 }
2956 m_dyld_up.reset();
2957 m_jit_loaders_up.reset();
2958 m_system_runtime_up.reset();
2959 m_os_up.reset();
2961
2962 lldb::pid_t attach_pid = attach_info.GetProcessID();
2963 Status error;
2964 if (attach_pid == LLDB_INVALID_PROCESS_ID) {
2965 char process_name[PATH_MAX];
2966
2967 if (attach_info.GetExecutableFile().GetPath(process_name,
2968 sizeof(process_name))) {
2969 const bool wait_for_launch = attach_info.GetWaitForLaunch();
2970
2971 if (wait_for_launch) {
2972 error = WillAttachToProcessWithName(process_name, wait_for_launch);
2973 if (error.Success()) {
2974 m_public_run_lock.SetRunning();
2975 m_should_detach = true;
2976 const bool restarted = false;
2977 SetPublicState(eStateAttaching, restarted);
2978 // Now attach using these arguments.
2979 error = DoAttachToProcessWithName(process_name, attach_info);
2980
2981 if (error.Fail()) {
2982 if (GetID() != LLDB_INVALID_PROCESS_ID) {
2984 if (error.AsCString() == nullptr)
2985 error = Status::FromErrorString("attach failed");
2986
2987 SetExitStatus(-1, error.AsCString());
2988 }
2989 } else {
2991 this, attach_info.GetResumeCount()));
2993 }
2994 return error;
2995 }
2996 } else {
2997 ProcessInstanceInfoList process_infos;
2998 PlatformSP platform_sp(GetTarget().GetPlatform());
2999
3000 if (platform_sp) {
3001 ProcessInstanceInfoMatch match_info;
3002 match_info.GetProcessInfo() = attach_info;
3004 platform_sp->FindProcesses(match_info, process_infos);
3005 const uint32_t num_matches = process_infos.size();
3006 if (num_matches == 1) {
3007 attach_pid = process_infos[0].GetProcessID();
3008 // Fall through and attach using the above process ID
3009 } else {
3011 process_name, sizeof(process_name));
3012 if (num_matches > 1) {
3013 StreamString s;
3015 for (size_t i = 0; i < num_matches; i++) {
3016 process_infos[i].DumpAsTableRow(
3017 s, platform_sp->GetUserIDResolver(), true, false);
3018 }
3020 "more than one process named %s:\n%s", process_name,
3021 s.GetData());
3022 } else
3024 "could not find a process named %s", process_name);
3025 }
3026 } else {
3028 "invalid platform, can't find processes by name");
3029 return error;
3030 }
3031 }
3032 } else {
3033 error = Status::FromErrorString("invalid process name");
3034 }
3035 }
3036
3037 if (attach_pid != LLDB_INVALID_PROCESS_ID) {
3038 error = WillAttachToProcessWithID(attach_pid);
3039 if (error.Success()) {
3040 m_public_run_lock.SetRunning();
3041
3042 // Now attach using these arguments.
3043 m_should_detach = true;
3044 const bool restarted = false;
3045 SetPublicState(eStateAttaching, restarted);
3046 error = DoAttachToProcessWithID(attach_pid, attach_info);
3047
3048 if (error.Success()) {
3050 this, attach_info.GetResumeCount()));
3052 } else {
3055
3056 const char *error_string = error.AsCString();
3057 if (error_string == nullptr)
3058 error_string = "attach failed";
3059
3060 SetExitStatus(-1, error_string);
3061 }
3062 }
3063 }
3064 return error;
3065}
3066
3069 LLDB_LOGF(log, "Process::%s()", __FUNCTION__);
3070
3071 // Let the process subclass figure out at much as it can about the process
3072 // before we go looking for a dynamic loader plug-in.
3073 ArchSpec process_arch;
3074 DidAttach(process_arch);
3075
3076 if (process_arch.IsValid()) {
3077 LLDB_LOG(log,
3078 "Process::{0} replacing process architecture with DidAttach() "
3079 "architecture: \"{1}\"",
3080 __FUNCTION__, process_arch.GetTriple().getTriple());
3081 GetTarget().SetArchitecture(process_arch);
3082 }
3083
3084 // We just attached. If we have a platform, ask it for the process
3085 // architecture, and if it isn't the same as the one we've already set,
3086 // switch architectures.
3087 PlatformSP platform_sp(GetTarget().GetPlatform());
3088 assert(platform_sp);
3089 ArchSpec process_host_arch = GetSystemArchitecture();
3090 if (platform_sp) {
3091 const ArchSpec &target_arch = GetTarget().GetArchitecture();
3092 if (target_arch.IsValid() && !platform_sp->IsCompatibleArchitecture(
3093 target_arch, process_host_arch,
3094 ArchSpec::CompatibleMatch, nullptr)) {
3095 ArchSpec platform_arch;
3097 target_arch, process_host_arch, &platform_arch);
3098 if (platform_sp) {
3099 GetTarget().SetPlatform(platform_sp);
3100 GetTarget().SetArchitecture(platform_arch);
3101 LLDB_LOG(log,
3102 "switching platform to {0} and architecture to {1} based on "
3103 "info from attach",
3104 platform_sp->GetName(), platform_arch.GetTriple().getTriple());
3105 }
3106 } else if (!process_arch.IsValid()) {
3107 ProcessInstanceInfo process_info;
3108 GetProcessInfo(process_info);
3109 const ArchSpec &process_arch = process_info.GetArchitecture();
3110 const ArchSpec &target_arch = GetTarget().GetArchitecture();
3111 if (process_arch.IsValid() &&
3112 target_arch.IsCompatibleMatch(process_arch) &&
3113 !target_arch.IsExactMatch(process_arch)) {
3114 GetTarget().SetArchitecture(process_arch);
3115 LLDB_LOGF(log,
3116 "Process::%s switching architecture to %s based on info "
3117 "the platform retrieved for pid %" PRIu64,
3118 __FUNCTION__, process_arch.GetTriple().getTriple().c_str(),
3119 GetID());
3120 }
3121 }
3122 }
3123 // Now that we know the process type, update its signal responses from the
3124 // ones stored in the Target:
3127 m_unix_signals_sp, GetTarget().GetDebugger().GetAsyncErrorStream());
3128
3129 // We have completed the attach, now it is time to find the dynamic loader
3130 // plug-in
3132 if (dyld) {
3133 dyld->DidAttach();
3134 if (log) {
3135 ModuleSP exe_module_sp = GetTarget().GetExecutableModule();
3136 LLDB_LOG(log,
3137 "after DynamicLoader::DidAttach(), target "
3138 "executable is {0} (using {1} plugin)",
3139 exe_module_sp ? exe_module_sp->GetFileSpec() : FileSpec(),
3140 dyld->GetPluginName());
3141 }
3142 }
3143
3145
3146 SystemRuntime *system_runtime = GetSystemRuntime();
3147 if (system_runtime) {
3148 system_runtime->DidAttach();
3149 if (log) {
3150 ModuleSP exe_module_sp = GetTarget().GetExecutableModule();
3151 LLDB_LOG(log,
3152 "after SystemRuntime::DidAttach(), target "
3153 "executable is {0} (using {1} plugin)",
3154 exe_module_sp ? exe_module_sp->GetFileSpec() : FileSpec(),
3155 system_runtime->GetPluginName());
3156 }
3157 }
3158
3159 // If we don't have an operating system plugin loaded yet, see if
3160 // LoadOperatingSystemPlugin can find one (and stuff it in m_os_up).
3161 if (!m_os_up)
3163
3164 if (m_os_up) {
3165 // Somebody might have gotten threads before we loaded the OS Plugin above,
3166 // so we need to force the update now or the newly loaded plugin won't get
3167 // a chance to process the threads.
3168 m_thread_list.Clear();
3170 }
3171
3172 // Figure out which one is the executable, and set that in our target:
3173 ModuleSP new_executable_module_sp;
3174 for (ModuleSP module_sp : GetTarget().GetImages().Modules()) {
3175 if (module_sp && module_sp->IsExecutable()) {
3176 if (GetTarget().GetExecutableModulePointer() != module_sp.get())
3177 new_executable_module_sp = module_sp;
3178 break;
3179 }
3180 }
3181 if (new_executable_module_sp) {
3182 GetTarget().SetExecutableModule(new_executable_module_sp,
3184 if (log) {
3185 ModuleSP exe_module_sp = GetTarget().GetExecutableModule();
3186 LLDB_LOGF(
3187 log,
3188 "Process::%s after looping through modules, target executable is %s",
3189 __FUNCTION__,
3190 exe_module_sp ? exe_module_sp->GetFileSpec().GetPath().c_str()
3191 : "<none>");
3192 }
3193 }
3194 // Since we hijacked the event stream, we will have we won't have run the
3195 // stop hooks. Make sure we do that here:
3196 GetTarget().RunStopHooks(/* at_initial_stop= */ true);
3197}
3198
3199Status Process::ConnectRemote(llvm::StringRef remote_url) {
3200 m_abi_sp.reset();
3201 {
3202 std::lock_guard<std::mutex> guard(m_process_input_reader_mutex);
3203 m_process_input_reader.reset();
3204 }
3205
3206 // Find the process and its architecture. Make sure it matches the
3207 // architecture of the current Target, and if not adjust it.
3208
3209 Status error(DoConnectRemote(remote_url));
3210 if (error.Success()) {
3211 if (GetID() != LLDB_INVALID_PROCESS_ID) {
3212 EventSP event_sp;
3213 StateType state = WaitForProcessStopPrivate(event_sp, std::nullopt);
3214
3215 if (state == eStateStopped || state == eStateCrashed) {
3216 // If we attached and actually have a process on the other end, then
3217 // this ended up being the equivalent of an attach.
3219
3220 // This delays passing the stopped event to listeners till
3221 // CompleteAttach gets a chance to complete...
3222 HandlePrivateEvent(event_sp);
3223 }
3224 }
3225
3228 else
3230 }
3231 return error;
3232}
3233
3235 if (m_base_direction == direction)
3236 return;
3237 m_thread_list.DiscardThreadPlans();
3238 m_base_direction = direction;
3239}
3240
3243 LLDB_LOGF(log,
3244 "Process::PrivateResume() m_stop_id = %u, public state: %s "
3245 "private state: %s",
3246 m_mod_id.GetStopID(), StateAsCString(m_public_state.GetValue()),
3247 StateAsCString(m_private_state.GetValue()));
3248
3249 // If signals handing status changed we might want to update our signal
3250 // filters before resuming.
3252 // Clear any crash info we accumulated for this stop, but don't do so if we
3253 // are running functions; we don't want to wipe out the real stop's info.
3254 if (!GetModID().IsLastResumeForUserExpression())
3256
3258 // Tell the process it is about to resume before the thread list
3259 if (error.Success()) {
3260 // Now let the thread list know we are about to resume so it can let all of
3261 // our threads know that they are about to be resumed. Threads will each be
3262 // called with Thread::WillResume(StateType) where StateType contains the
3263 // state that they are supposed to have when the process is resumed
3264 // (suspended/running/stepping). Threads should also check their resume
3265 // signal in lldb::Thread::GetResumeSignal() to see if they are supposed to
3266 // start back up with a signal.
3267 RunDirection direction;
3268 if (m_thread_list.WillResume(direction)) {
3269 LLDB_LOGF(log, "Process::PrivateResume WillResume direction=%d",
3270 direction);
3271 // Last thing, do the PreResumeActions.
3272 if (!RunPreResumeActions()) {
3274 "Process::PrivateResume PreResumeActions failed, not resuming.");
3275 LLDB_LOGF(
3276 log,
3277 "Process::PrivateResume PreResumeActions failed, not resuming.");
3278 } else {
3279 m_mod_id.BumpResumeID();
3280 error = DoResume(direction);
3281 if (error.Success()) {
3282 DidResume();
3283 m_thread_list.DidResume();
3284 LLDB_LOGF(log,
3285 "Process::PrivateResume thinks the process has resumed.");
3286 } else {
3287 LLDB_LOGF(log, "Process::PrivateResume() DoResume failed.");
3288 return error;
3289 }
3290 }
3291 } else {
3292 // Somebody wanted to run without running (e.g. we were faking a step
3293 // from one frame of a set of inlined frames that share the same PC to
3294 // another.) So generate a continue & a stopped event, and let the world
3295 // handle them.
3296 LLDB_LOGF(log,
3297 "Process::PrivateResume() asked to simulate a start & stop.");
3298
3301 }
3302 } else
3303 LLDB_LOGF(log, "Process::PrivateResume() got an error \"%s\".",
3304 error.AsCString("<unknown error>"));
3305 return error;
3306}
3307
3308Status Process::Halt(bool clear_thread_plans, bool use_run_lock) {
3309 if (!StateIsRunningState(m_public_state.GetValue()))
3310 return Status::FromErrorString("Process is not running.");
3311
3312 // Don't clear the m_clear_thread_plans_on_stop, only set it to true if in
3313 // case it was already set and some thread plan logic calls halt on its own.
3314 m_clear_thread_plans_on_stop |= clear_thread_plans;
3315
3316 ListenerSP halt_listener_sp(
3317 Listener::MakeListener("lldb.process.halt_listener"));
3318 HijackProcessEvents(halt_listener_sp);
3319
3320 EventSP event_sp;
3321
3323
3324 if (m_public_state.GetValue() == eStateAttaching) {
3325 // Don't hijack and eat the eStateExited as the code that was doing the
3326 // attach will be waiting for this event...
3328 Destroy(false);
3329 SetExitStatus(SIGKILL, "Cancelled async attach.");
3330 return Status();
3331 }
3332
3333 // Wait for the process halt timeout seconds for the process to stop.
3334 // If we are going to use the run lock, that means we're stopping out to the
3335 // user, so we should also select the most relevant frame.
3336 SelectMostRelevant select_most_relevant =
3338 StateType state = WaitForProcessToStop(GetInterruptTimeout(), &event_sp, true,
3339 halt_listener_sp, nullptr,
3340 use_run_lock, select_most_relevant);
3342
3343 if (state == eStateInvalid || !event_sp) {
3344 // We timed out and didn't get a stop event...
3345 return Status::FromErrorStringWithFormat("Halt timed out. State = %s",
3347 }
3348
3349 BroadcastEvent(event_sp);
3350
3351 return Status();
3352}
3353
3355 const uint8_t *buf, size_t size) {
3356 const size_t region_size = high - low;
3357
3358 if (region_size < size)
3359 return LLDB_INVALID_ADDRESS;
3360
3361 // See "Boyer-Moore string search algorithm".
3362 std::vector<size_t> bad_char_heuristic(256, size);
3363 for (size_t idx = 0; idx < size - 1; idx++) {
3364 decltype(bad_char_heuristic)::size_type bcu_idx = buf[idx];
3365 bad_char_heuristic[bcu_idx] = size - idx - 1;
3366 }
3367
3368 // Memory we're currently searching through.
3369 llvm::SmallVector<uint8_t, 0> mem;
3370 // Position of the memory buffer.
3371 addr_t mem_pos = low;
3372 // Maximum number of bytes read (and buffered). We need to read at least
3373 // `size` bytes for a successful match.
3374 const size_t max_read_size = std::max<size_t>(size, 0x10000);
3375
3376 for (addr_t cur_addr = low; cur_addr <= (high - size);) {
3377 if (cur_addr + size > mem_pos + mem.size()) {
3378 // We need to read more data. We don't attempt to reuse the data we've
3379 // already read (up to `size-1` bytes from `cur_addr` to
3380 // `mem_pos+mem.size()`). This is fine for patterns much smaller than
3381 // max_read_size. For very
3382 // long patterns we may need to do something more elaborate.
3383 mem.resize_for_overwrite(max_read_size);
3384 Status error;
3385 mem.resize(ReadMemory(cur_addr, mem.data(),
3386 std::min<addr_t>(mem.size(), high - cur_addr),
3387 error));
3388 mem_pos = cur_addr;
3389 if (size > mem.size()) {
3390 // We didn't read enough data. Skip to the next memory region.
3391 MemoryRegionInfo info;
3392 error = GetMemoryRegionInfo(mem_pos + mem.size(), info);
3393 if (error.Fail())
3394 break;
3395 cur_addr = info.GetRange().GetRangeEnd();
3396 continue;
3397 }
3398 }
3399 int64_t j = size - 1;
3400 while (j >= 0 && buf[j] == mem[cur_addr + j - mem_pos])
3401 j--;
3402 if (j < 0)
3403 return cur_addr; // We have a match.
3404 cur_addr += bad_char_heuristic[mem[cur_addr + size - 1 - mem_pos]];
3405 }
3406
3407 return LLDB_INVALID_ADDRESS;
3408}
3409
3411 Status error;
3412
3413 // Check both the public & private states here. If we're hung evaluating an
3414 // expression, for instance, then the public state will be stopped, but we
3415 // still need to interrupt.
3416 if (m_public_state.GetValue() == eStateRunning ||
3417 m_private_state.GetValue() == eStateRunning) {
3418 Log *log = GetLog(LLDBLog::Process);
3419 LLDB_LOGF(log, "Process::%s() About to stop.", __FUNCTION__);
3420
3421 ListenerSP listener_sp(
3422 Listener::MakeListener("lldb.Process.StopForDestroyOrDetach.hijack"));
3423 HijackProcessEvents(listener_sp);
3424
3426
3427 // Consume the interrupt event.
3429 &exit_event_sp, true, listener_sp);
3430
3432
3433 // If the process exited while we were waiting for it to stop, put the
3434 // exited event into the shared pointer passed in and return. Our caller
3435 // doesn't need to do anything else, since they don't have a process
3436 // anymore...
3437
3438 if (state == eStateExited || m_private_state.GetValue() == eStateExited) {
3439 LLDB_LOGF(log, "Process::%s() Process exited while waiting to stop.",
3440 __FUNCTION__);
3441 return error;
3442 } else
3443 exit_event_sp.reset(); // It is ok to consume any non-exit stop events
3444
3445 if (state != eStateStopped) {
3446 LLDB_LOGF(log, "Process::%s() failed to stop, state is: %s", __FUNCTION__,
3447 StateAsCString(state));
3448 // If we really couldn't stop the process then we should just error out
3449 // here, but if the lower levels just bobbled sending the event and we
3450 // really are stopped, then continue on.
3451 StateType private_state = m_private_state.GetValue();
3452 if (private_state != eStateStopped) {
3454 "Attempt to stop the target in order to detach timed out. "
3455 "State = %s",
3457 }
3458 }
3459 }
3460 return error;
3461}
3462
3463Status Process::Detach(bool keep_stopped) {
3464 EventSP exit_event_sp;
3465 Status error;
3466 m_destroy_in_process = true;
3467
3468 error = WillDetach();
3469
3470 if (error.Success()) {
3471 if (DetachRequiresHalt()) {
3472 error = StopForDestroyOrDetach(exit_event_sp);
3473 if (!error.Success()) {
3474 m_destroy_in_process = false;
3475 return error;
3476 } else if (exit_event_sp) {
3477 // We shouldn't need to do anything else here. There's no process left
3478 // to detach from...
3480 m_destroy_in_process = false;
3481 return error;
3482 }
3483 }
3484
3485 m_thread_list.DiscardThreadPlans();
3487
3488 error = DoDetach(keep_stopped);
3489 if (error.Success()) {
3490 DidDetach();
3492 } else {
3493 return error;
3494 }
3495 }
3496 m_destroy_in_process = false;
3497
3498 // If we exited when we were waiting for a process to stop, then forward the
3499 // event here so we don't lose the event
3500 if (exit_event_sp) {
3501 // Directly broadcast our exited event because we shut down our private
3502 // state thread above
3503 BroadcastEvent(exit_event_sp);
3504 }
3505
3506 // If we have been interrupted (to kill us) in the middle of running, we may
3507 // not end up propagating the last events through the event system, in which
3508 // case we might strand the write lock. Unlock it here so when we do to tear
3509 // down the process we don't get an error destroying the lock.
3510
3511 m_public_run_lock.SetStopped();
3512 return error;
3513}
3514
3515Status Process::Destroy(bool force_kill) {
3516 // If we've already called Process::Finalize then there's nothing useful to
3517 // be done here. Finalize has actually called Destroy already.
3518 if (m_finalizing)
3519 return {};
3520 return DestroyImpl(force_kill);
3521}
3522
3524 // Tell ourselves we are in the process of destroying the process, so that we
3525 // don't do any unnecessary work that might hinder the destruction. Remember
3526 // to set this back to false when we are done. That way if the attempt
3527 // failed and the process stays around for some reason it won't be in a
3528 // confused state.
3529
3530 if (force_kill)
3531 m_should_detach = false;
3532
3533 if (GetShouldDetach()) {
3534 // FIXME: This will have to be a process setting:
3535 bool keep_stopped = false;
3536 Detach(keep_stopped);
3537 }
3538
3539 m_destroy_in_process = true;
3540
3542 if (error.Success()) {
3543 EventSP exit_event_sp;
3544 if (DestroyRequiresHalt()) {
3545 error = StopForDestroyOrDetach(exit_event_sp);
3546 }
3547
3548 if (m_public_state.GetValue() == eStateStopped) {
3549 // Ditch all thread plans, and remove all our breakpoints: in case we
3550 // have to restart the target to kill it, we don't want it hitting a
3551 // breakpoint... Only do this if we've stopped, however, since if we
3552 // didn't manage to halt it above, then we're not going to have much luck
3553 // doing this now.
3554 m_thread_list.DiscardThreadPlans();
3556 }
3557
3558 error = DoDestroy();
3559 if (error.Success()) {
3560 DidDestroy();
3562 }
3563 m_stdio_communication.StopReadThread();
3564 m_stdio_communication.Disconnect();
3565 m_stdin_forward = false;
3566
3567 {
3568 std::lock_guard<std::mutex> guard(m_process_input_reader_mutex);
3570 m_process_input_reader->SetIsDone(true);
3571 m_process_input_reader->Cancel();
3572 m_process_input_reader.reset();
3573 }
3574 }
3575
3576 // If we exited when we were waiting for a process to stop, then forward
3577 // the event here so we don't lose the event
3578 if (exit_event_sp) {
3579 // Directly broadcast our exited event because we shut down our private
3580 // state thread above
3581 BroadcastEvent(exit_event_sp);
3582 }
3583
3584 // If we have been interrupted (to kill us) in the middle of running, we
3585 // may not end up propagating the last events through the event system, in
3586 // which case we might strand the write lock. Unlock it here so when we do
3587 // to tear down the process we don't get an error destroying the lock.
3588 m_public_run_lock.SetStopped();
3589 }
3590
3591 m_destroy_in_process = false;
3592
3593 return error;
3594}
3595
3598 if (error.Success()) {
3599 error = DoSignal(signal);
3600 if (error.Success())
3601 DidSignal();
3602 }
3603 return error;
3604}
3605
3607 assert(signals_sp && "null signals_sp");
3608 m_unix_signals_sp = std::move(signals_sp);
3609}
3610
3612 assert(m_unix_signals_sp && "null m_unix_signals_sp");
3613 return m_unix_signals_sp;
3614}
3615
3619
3623
3625 const StateType state =
3627 bool return_value = true;
3629
3630 switch (state) {
3631 case eStateDetached:
3632 case eStateExited:
3633 case eStateUnloaded:
3634 m_stdio_communication.SynchronizeWithReadThread();
3635 m_stdio_communication.StopReadThread();
3636 m_stdio_communication.Disconnect();
3637 m_stdin_forward = false;
3638
3639 [[fallthrough]];
3640 case eStateConnected:
3641 case eStateAttaching:
3642 case eStateLaunching:
3643 // These events indicate changes in the state of the debugging session,
3644 // always report them.
3645 return_value = true;
3646 break;
3647 case eStateInvalid:
3648 // We stopped for no apparent reason, don't report it.
3649 return_value = false;
3650 break;
3651 case eStateRunning:
3652 case eStateStepping:
3653 // If we've started the target running, we handle the cases where we are
3654 // already running and where there is a transition from stopped to running
3655 // differently. running -> running: Automatically suppress extra running
3656 // events stopped -> running: Report except when there is one or more no
3657 // votes
3658 // and no yes votes.
3661 return_value = true;
3662 else {
3663 switch (m_last_broadcast_state) {
3664 case eStateRunning:
3665 case eStateStepping:
3666 // We always suppress multiple runnings with no PUBLIC stop in between.
3667 return_value = false;
3668 break;
3669 default:
3670 // TODO: make this work correctly. For now always report
3671 // run if we aren't running so we don't miss any running events. If I
3672 // run the lldb/test/thread/a.out file and break at main.cpp:58, run
3673 // and hit the breakpoints on multiple threads, then somehow during the
3674 // stepping over of all breakpoints no run gets reported.
3675
3676 // This is a transition from stop to run.
3677 switch (m_thread_list.ShouldReportRun(event_ptr)) {
3678 case eVoteYes:
3679 case eVoteNoOpinion:
3680 return_value = true;
3681 break;
3682 case eVoteNo:
3683 return_value = false;
3684 break;
3685 }
3686 break;
3687 }
3688 }
3689 break;
3690 case eStateStopped:
3691 case eStateCrashed:
3692 case eStateSuspended:
3693 // We've stopped. First see if we're going to restart the target. If we
3694 // are going to stop, then we always broadcast the event. If we aren't
3695 // going to stop, let the thread plans decide if we're going to report this
3696 // event. If no thread has an opinion, we don't report it.
3697
3698 m_stdio_communication.SynchronizeWithReadThread();
3701 LLDB_LOGF(log,
3702 "Process::ShouldBroadcastEvent (%p) stopped due to an "
3703 "interrupt, state: %s",
3704 static_cast<void *>(event_ptr), StateAsCString(state));
3705 // Even though we know we are going to stop, we should let the threads
3706 // have a look at the stop, so they can properly set their state.
3707 m_thread_list.ShouldStop(event_ptr);
3708 return_value = true;
3709 } else {
3710 bool was_restarted = ProcessEventData::GetRestartedFromEvent(event_ptr);
3711 bool should_resume = false;
3712
3713 // It makes no sense to ask "ShouldStop" if we've already been
3714 // restarted... Asking the thread list is also not likely to go well,
3715 // since we are running again. So in that case just report the event.
3716
3717 if (!was_restarted)
3718 should_resume = !m_thread_list.ShouldStop(event_ptr);
3719
3720 if (was_restarted || should_resume || m_resume_requested) {
3721 Vote report_stop_vote = m_thread_list.ShouldReportStop(event_ptr);
3722 LLDB_LOGF(log,
3723 "Process::ShouldBroadcastEvent: should_resume: %i state: "
3724 "%s was_restarted: %i report_stop_vote: %d.",
3725 should_resume, StateAsCString(state), was_restarted,
3726 report_stop_vote);
3727
3728 switch (report_stop_vote) {
3729 case eVoteYes:
3730 return_value = true;
3731 break;
3732 case eVoteNoOpinion:
3733 case eVoteNo:
3734 return_value = false;
3735 break;
3736 }
3737
3738 if (!was_restarted) {
3739 LLDB_LOGF(log,
3740 "Process::ShouldBroadcastEvent (%p) Restarting process "
3741 "from state: %s",
3742 static_cast<void *>(event_ptr), StateAsCString(state));
3744 PrivateResume();
3745 }
3746 } else {
3747 return_value = true;
3749 }
3750 }
3751 break;
3752 }
3753
3754 // Forcing the next event delivery is a one shot deal. So reset it here.
3756
3757 // We do some coalescing of events (for instance two consecutive running
3758 // events get coalesced.) But we only coalesce against events we actually
3759 // broadcast. So we use m_last_broadcast_state to track that. NB - you
3760 // can't use "m_public_state.GetValue()" for that purpose, as was originally
3761 // done, because the PublicState reflects the last event pulled off the
3762 // queue, and there may be several events stacked up on the queue unserviced.
3763 // So the PublicState may not reflect the last broadcasted event yet.
3764 // m_last_broadcast_state gets updated here.
3765
3766 if (return_value)
3767 m_last_broadcast_state = state;
3768
3769 LLDB_LOGF(log,
3770 "Process::ShouldBroadcastEvent (%p) => new state: %s, last "
3771 "broadcast state: %s - %s",
3772 static_cast<void *>(event_ptr), StateAsCString(state),
3774 return_value ? "YES" : "NO");
3775 return return_value;
3776}
3777
3778bool Process::StartPrivateStateThread(bool is_secondary_thread) {
3779 Log *log = GetLog(LLDBLog::Events);
3780
3781 bool already_running = PrivateStateThreadIsValid();
3782 LLDB_LOGF(log, "Process::%s()%s ", __FUNCTION__,
3783 already_running ? " already running"
3784 : " starting private state thread");
3785
3786 if (!is_secondary_thread && already_running)
3787 return true;
3788
3789 // Create a thread that watches our internal state and controls which events
3790 // make it to clients (into the DCProcess event queue).
3791 char thread_name[1024];
3792 uint32_t max_len = llvm::get_max_thread_name_length();
3793 if (max_len > 0 && max_len <= 30) {
3794 // On platforms with abbreviated thread name lengths, choose thread names
3795 // that fit within the limit.
3796 if (already_running)
3797 snprintf(thread_name, sizeof(thread_name), "intern-state-OV");
3798 else
3799 snprintf(thread_name, sizeof(thread_name), "intern-state");
3800 } else {
3801 if (already_running)
3802 snprintf(thread_name, sizeof(thread_name),
3803 "<lldb.process.internal-state-override(pid=%" PRIu64 ")>",
3804 GetID());
3805 else
3806 snprintf(thread_name, sizeof(thread_name),
3807 "<lldb.process.internal-state(pid=%" PRIu64 ")>", GetID());
3808 }
3809
3810 llvm::Expected<HostThread> private_state_thread =
3812 thread_name,
3813 [this, is_secondary_thread] {
3814 return RunPrivateStateThread(is_secondary_thread);
3815 },
3816 8 * 1024 * 1024);
3817 if (!private_state_thread) {
3818 LLDB_LOG_ERROR(GetLog(LLDBLog::Host), private_state_thread.takeError(),
3819 "failed to launch host thread: {0}");
3820 return false;
3821 }
3822
3823 assert(private_state_thread->IsJoinable());
3824 m_private_state_thread = *private_state_thread;
3826 return true;
3827}
3828
3832
3836
3838 if (m_private_state_thread.IsJoinable())
3840 else {
3841 Log *log = GetLog(LLDBLog::Process);
3842 LLDB_LOGF(
3843 log,
3844 "Went to stop the private state thread, but it was already invalid.");
3845 }
3846}
3847
3849 Log *log = GetLog(LLDBLog::Process);
3850
3851 assert(signal == eBroadcastInternalStateControlStop ||
3854
3855 LLDB_LOGF(log, "Process::%s (signal = %d)", __FUNCTION__, signal);
3856
3857 // Signal the private state thread
3858 if (m_private_state_thread.IsJoinable()) {
3859 // Broadcast the event.
3860 // It is important to do this outside of the if below, because it's
3861 // possible that the thread state is invalid but that the thread is waiting
3862 // on a control event instead of simply being on its way out (this should
3863 // not happen, but it apparently can).
3864 LLDB_LOGF(log, "Sending control event of type: %d.", signal);
3865 std::shared_ptr<EventDataReceipt> event_receipt_sp(new EventDataReceipt());
3866 m_private_state_control_broadcaster.BroadcastEvent(signal,
3867 event_receipt_sp);
3868
3869 // Wait for the event receipt or for the private state thread to exit
3870 bool receipt_received = false;
3872 while (!receipt_received) {
3873 // Check for a receipt for n seconds and then check if the private
3874 // state thread is still around.
3875 receipt_received =
3876 event_receipt_sp->WaitForEventReceived(GetUtilityExpressionTimeout());
3877 if (!receipt_received) {
3878 // Check if the private state thread is still around. If it isn't
3879 // then we are done waiting
3881 break; // Private state thread exited or is exiting, we are done
3882 }
3883 }
3884 }
3885
3886 if (signal == eBroadcastInternalStateControlStop) {
3887 thread_result_t result = {};
3888 m_private_state_thread.Join(&result);
3889 m_private_state_thread.Reset();
3890 }
3891 } else {
3892 LLDB_LOGF(
3893 log,
3894 "Private state thread already dead, no need to signal it to stop.");
3895 }
3896}
3897
3899 if (thread != nullptr)
3900 m_interrupt_tid = thread->GetProtocolID();
3901 else
3905 nullptr);
3906 else
3908}
3909
3911 Log *log = GetLog(LLDBLog::Process);
3912 m_resume_requested = false;
3913
3914 const StateType new_state =
3916
3917 // First check to see if anybody wants a shot at this event:
3920 m_next_event_action_up->PerformAction(event_sp);
3921 LLDB_LOGF(log, "Ran next event action, result was %d.", action_result);
3922
3923 switch (action_result) {
3925 SetNextEventAction(nullptr);
3926 break;
3927
3929 break;
3930
3932 // Handle Exiting Here. If we already got an exited event, we should
3933 // just propagate it. Otherwise, swallow this event, and set our state
3934 // to exit so the next event will kill us.
3935 if (new_state != eStateExited) {
3936 // FIXME: should cons up an exited event, and discard this one.
3937 SetExitStatus(0, m_next_event_action_up->GetExitString());
3938 SetNextEventAction(nullptr);
3939 return;
3940 }
3941 SetNextEventAction(nullptr);
3942 break;
3943 }
3944 }
3945
3946 // See if we should broadcast this state to external clients?
3947 const bool should_broadcast = ShouldBroadcastEvent(event_sp.get());
3948
3949 if (should_broadcast) {
3950 const bool is_hijacked = IsHijackedForEvent(eBroadcastBitStateChanged);
3951 if (log) {
3952 LLDB_LOGF(log,
3953 "Process::%s (pid = %" PRIu64
3954 ") broadcasting new state %s (old state %s) to %s",
3955 __FUNCTION__, GetID(), StateAsCString(new_state),
3957 is_hijacked ? "hijacked" : "public");
3958 }
3960 if (StateIsRunningState(new_state)) {
3961 // Only push the input handler if we aren't fowarding events, as this
3962 // means the curses GUI is in use... Or don't push it if we are launching
3963 // since it will come up stopped.
3964 if (!GetTarget().GetDebugger().IsForwardingEvents() &&
3965 new_state != eStateLaunching && new_state != eStateAttaching) {
3967 m_iohandler_sync.SetValue(m_iohandler_sync.GetValue() + 1,
3969 LLDB_LOGF(log, "Process::%s updated m_iohandler_sync to %d",
3970 __FUNCTION__, m_iohandler_sync.GetValue());
3971 }
3972 } else if (StateIsStoppedState(new_state, false)) {
3974 // If the lldb_private::Debugger is handling the events, we don't want
3975 // to pop the process IOHandler here, we want to do it when we receive
3976 // the stopped event so we can carefully control when the process
3977 // IOHandler is popped because when we stop we want to display some
3978 // text stating how and why we stopped, then maybe some
3979 // process/thread/frame info, and then we want the "(lldb) " prompt to
3980 // show up. If we pop the process IOHandler here, then we will cause
3981 // the command interpreter to become the top IOHandler after the
3982 // process pops off and it will update its prompt right away... See the
3983 // Debugger.cpp file where it calls the function as
3984 // "process_sp->PopProcessIOHandler()" to see where I am talking about.
3985 // Otherwise we end up getting overlapping "(lldb) " prompts and
3986 // garbled output.
3987 //
3988 // If we aren't handling the events in the debugger (which is indicated
3989 // by "m_target.GetDebugger().IsHandlingEvents()" returning false) or
3990 // we are hijacked, then we always pop the process IO handler manually.
3991 // Hijacking happens when the internal process state thread is running
3992 // thread plans, or when commands want to run in synchronous mode and
3993 // they call "process->WaitForProcessToStop()". An example of something
3994 // that will hijack the events is a simple expression:
3995 //
3996 // (lldb) expr (int)puts("hello")
3997 //
3998 // This will cause the internal process state thread to resume and halt
3999 // the process (and _it_ will hijack the eBroadcastBitStateChanged
4000 // events) and we do need the IO handler to be pushed and popped
4001 // correctly.
4002
4003 if (is_hijacked || !GetTarget().GetDebugger().IsHandlingEvents())
4005 }
4006 }
4007
4008 BroadcastEvent(event_sp);
4009 } else {
4010 if (log) {
4011 LLDB_LOGF(
4012 log,
4013 "Process::%s (pid = %" PRIu64
4014 ") suppressing state %s (old state %s): should_broadcast == false",
4015 __FUNCTION__, GetID(), StateAsCString(new_state),
4017 }
4018 }
4019}
4020
4022 EventSP event_sp;
4024 if (error.Fail())
4025 return error;
4026
4027 // Ask the process subclass to actually halt our process
4028 bool caused_stop;
4029 error = DoHalt(caused_stop);
4030
4031 DidHalt();
4032 return error;
4033}
4034
4036 bool control_only = true;
4037
4038 Log *log = GetLog(LLDBLog::Process);
4039 LLDB_LOGF(log, "Process::%s (arg = %p, pid = %" PRIu64 ") thread starting...",
4040 __FUNCTION__, static_cast<void *>(this), GetID());
4041
4042 bool exit_now = false;
4043 bool interrupt_requested = false;
4044 while (!exit_now) {
4045 EventSP event_sp;
4046 GetEventsPrivate(event_sp, std::nullopt, control_only);
4047 if (event_sp->BroadcasterIs(&m_private_state_control_broadcaster)) {
4048 LLDB_LOGF(log,
4049 "Process::%s (arg = %p, pid = %" PRIu64
4050 ") got a control event: %d",
4051 __FUNCTION__, static_cast<void *>(this), GetID(),
4052 event_sp->GetType());
4053
4054 switch (event_sp->GetType()) {
4056 exit_now = true;
4057 break; // doing any internal state management below
4058
4060 control_only = true;
4061 break;
4062
4064 control_only = false;
4065 break;
4066 }
4067
4068 continue;
4069 } else if (event_sp->GetType() == eBroadcastBitInterrupt) {
4070 if (m_public_state.GetValue() == eStateAttaching) {
4071 LLDB_LOGF(log,
4072 "Process::%s (arg = %p, pid = %" PRIu64
4073 ") woke up with an interrupt while attaching - "
4074 "forwarding interrupt.",
4075 __FUNCTION__, static_cast<void *>(this), GetID());
4076 // The server may be spinning waiting for a process to appear, in which
4077 // case we should tell it to stop doing that. Normally, we don't NEED
4078 // to do that because we will next close the communication to the stub
4079 // and that will get it to shut down. But there are remote debugging
4080 // cases where relying on that side-effect causes the shutdown to be
4081 // flakey, so we should send a positive signal to interrupt the wait.
4085 LLDB_LOGF(log,
4086 "Process::%s (arg = %p, pid = %" PRIu64
4087 ") woke up with an interrupt - Halting.",
4088 __FUNCTION__, static_cast<void *>(this), GetID());
4090 if (error.Fail() && log)
4091 LLDB_LOGF(log,
4092 "Process::%s (arg = %p, pid = %" PRIu64
4093 ") failed to halt the process: %s",
4094 __FUNCTION__, static_cast<void *>(this), GetID(),
4095 error.AsCString());
4096 // Halt should generate a stopped event. Make a note of the fact that
4097 // we were doing the interrupt, so we can set the interrupted flag
4098 // after we receive the event. We deliberately set this to true even if
4099 // HaltPrivate failed, so that we can interrupt on the next natural
4100 // stop.
4101 interrupt_requested = true;
4102 } else {
4103 // This can happen when someone (e.g. Process::Halt) sees that we are
4104 // running and sends an interrupt request, but the process actually
4105 // stops before we receive it. In that case, we can just ignore the
4106 // request. We use m_last_broadcast_state, because the Stopped event
4107 // may not have been popped of the event queue yet, which is when the
4108 // public state gets updated.
4109 LLDB_LOGF(log,
4110 "Process::%s ignoring interrupt as we have already stopped.",
4111 __FUNCTION__);
4112 }
4113 continue;
4114 }
4115
4116 const StateType internal_state =
4118
4119 if (internal_state != eStateInvalid) {
4121 StateIsStoppedState(internal_state, true)) {
4123 m_thread_list.DiscardThreadPlans();
4124 }
4125
4126 if (interrupt_requested) {
4127 if (StateIsStoppedState(internal_state, true)) {
4128 // Only mark interrupt event if it is not thread specific async
4129 // interrupt.
4131 // We requested the interrupt, so mark this as such in the stop
4132 // event so clients can tell an interrupted process from a natural
4133 // stop
4134 ProcessEventData::SetInterruptedInEvent(event_sp.get(), true);
4135 }
4136 interrupt_requested = false;
4137 } else if (log) {
4138 LLDB_LOGF(log,
4139 "Process::%s interrupt_requested, but a non-stopped "
4140 "state '%s' received.",
4141 __FUNCTION__, StateAsCString(internal_state));
4142 }
4143 }
4144
4145 HandlePrivateEvent(event_sp);
4146 }
4147
4148 if (internal_state == eStateInvalid || internal_state == eStateExited ||
4149 internal_state == eStateDetached) {
4150 LLDB_LOGF(log,
4151 "Process::%s (arg = %p, pid = %" PRIu64
4152 ") about to exit with internal state %s...",
4153 __FUNCTION__, static_cast<void *>(this), GetID(),
4154 StateAsCString(internal_state));
4155
4156 break;
4157 }
4158 }
4159
4160 // Verify log is still enabled before attempting to write to it...
4161 LLDB_LOGF(log, "Process::%s (arg = %p, pid = %" PRIu64 ") thread exiting...",
4162 __FUNCTION__, static_cast<void *>(this), GetID());
4163
4164 // If we are a secondary thread, then the primary thread we are working for
4165 // will have already acquired the public_run_lock, and isn't done with what
4166 // it was doing yet, so don't try to change it on the way out.
4167 if (!is_secondary_thread)
4168 m_public_run_lock.SetStopped();
4169 return {};
4170}
4171
4172// Process Event Data
4173
4175
4177 StateType state)
4178 : EventData(), m_process_wp(), m_state(state) {
4179 if (process_sp)
4180 m_process_wp = process_sp;
4181}
4182
4184
4186 return "Process::ProcessEventData";
4187}
4188
4192
4194 bool &found_valid_stopinfo) {
4195 found_valid_stopinfo = false;
4196
4197 ProcessSP process_sp(m_process_wp.lock());
4198 if (!process_sp)
4199 return false;
4200
4201 ThreadList &curr_thread_list = process_sp->GetThreadList();
4202 uint32_t num_threads = curr_thread_list.GetSize();
4203
4204 // The actions might change one of the thread's stop_info's opinions about
4205 // whether we should stop the process, so we need to query that as we go.
4206
4207 // One other complication here, is that we try to catch any case where the
4208 // target has run (except for expressions) and immediately exit, but if we
4209 // get that wrong (which is possible) then the thread list might have
4210 // changed, and that would cause our iteration here to crash. We could
4211 // make a copy of the thread list, but we'd really like to also know if it
4212 // has changed at all, so we store the original thread ID's of all threads and
4213 // check what we get back against this list & bag out if anything differs.
4214 std::vector<std::pair<ThreadSP, size_t>> not_suspended_threads;
4215 for (uint32_t idx = 0; idx < num_threads; ++idx) {
4216 lldb::ThreadSP thread_sp = curr_thread_list.GetThreadAtIndex(idx);
4217
4218 /*
4219 Filter out all suspended threads, they could not be the reason
4220 of stop and no need to perform any actions on them.
4221 */
4222 if (thread_sp->GetResumeState() != eStateSuspended)
4223 not_suspended_threads.emplace_back(thread_sp, thread_sp->GetIndexID());
4224 }
4225
4226 // Use this to track whether we should continue from here. We will only
4227 // continue the target running if no thread says we should stop. Of course
4228 // if some thread's PerformAction actually sets the target running, then it
4229 // doesn't matter what the other threads say...
4230
4231 bool still_should_stop = false;
4232
4233 // Sometimes - for instance if we have a bug in the stub we are talking to,
4234 // we stop but no thread has a valid stop reason. In that case we should
4235 // just stop, because we have no way of telling what the right thing to do
4236 // is, and it's better to let the user decide than continue behind their
4237 // backs.
4238
4239 for (auto [thread_sp, thread_index] : not_suspended_threads) {
4240 if (curr_thread_list.GetSize() != num_threads) {
4242 LLDB_LOGF(
4243 log,
4244 "Number of threads changed from %u to %u while processing event.",
4245 num_threads, curr_thread_list.GetSize());
4246 break;
4247 }
4248
4249 if (thread_sp->GetIndexID() != thread_index) {
4251 LLDB_LOG(log,
4252 "The thread {0} changed from {1} to {2} while processing event.",
4253 thread_sp.get(), thread_index, thread_sp->GetIndexID());
4254 break;
4255 }
4256
4257 StopInfoSP stop_info_sp = thread_sp->GetStopInfo();
4258 if (stop_info_sp && stop_info_sp->IsValid()) {
4259 found_valid_stopinfo = true;
4260 bool this_thread_wants_to_stop;
4261 if (stop_info_sp->GetOverrideShouldStop()) {
4262 this_thread_wants_to_stop =
4263 stop_info_sp->GetOverriddenShouldStopValue();
4264 } else {
4265 stop_info_sp->PerformAction(event_ptr);
4266 // The stop action might restart the target. If it does, then we
4267 // want to mark that in the event so that whoever is receiving it
4268 // will know to wait for the running event and reflect that state
4269 // appropriately. We also need to stop processing actions, since they
4270 // aren't expecting the target to be running.
4271
4272 // Clear the selected frame which may have been set as part of utility
4273 // expressions that have been run as part of this stop. If we didn't
4274 // clear this, then StopInfo::GetSuggestedStackFrameIndex would not
4275 // take affect when we next called SelectMostRelevantFrame.
4276 // PerformAction should not be the one setting a selected frame, instead
4277 // this should be done via GetSuggestedStackFrameIndex.
4278 thread_sp->ClearSelectedFrameIndex();
4279
4280 // FIXME: we might have run.
4281 if (stop_info_sp->HasTargetRunSinceMe()) {
4282 SetRestarted(true);
4283 break;
4284 }
4285
4286 this_thread_wants_to_stop = stop_info_sp->ShouldStop(event_ptr);
4287 }
4288
4289 if (!still_should_stop)
4290 still_should_stop = this_thread_wants_to_stop;
4291 }
4292 }
4293
4294 return still_should_stop;
4295}
4296
4298 Event *event_ptr) {
4299 // STDIO and the other async event notifications should always be forwarded.
4300 if (event_ptr->GetType() != Process::eBroadcastBitStateChanged)
4301 return true;
4302
4303 // For state changed events, if the update state is zero, we are handling
4304 // this on the private state thread. We should wait for the public event.
4305 return m_update_state == 1;
4306}
4307
4309 // We only have work to do for state changed events:
4310 if (event_ptr->GetType() != Process::eBroadcastBitStateChanged)
4311 return;
4312
4313 ProcessSP process_sp(m_process_wp.lock());
4314
4315 if (!process_sp)
4316 return;
4317
4318 // This function gets called twice for each event, once when the event gets
4319 // pulled off of the private process event queue, and then any number of
4320 // times, first when it gets pulled off of the public event queue, then other
4321 // times when we're pretending that this is where we stopped at the end of
4322 // expression evaluation. m_update_state is used to distinguish these three
4323 // cases; it is 0 when we're just pulling it off for private handling, and >
4324 // 1 for expression evaluation, and we don't want to do the breakpoint
4325 // command handling then.
4326 if (m_update_state != 1)
4327 return;
4328
4329 process_sp->SetPublicState(
4331
4332 if (m_state == eStateStopped && !m_restarted) {
4333 // Let process subclasses know we are about to do a public stop and do
4334 // anything they might need to in order to speed up register and memory
4335 // accesses.
4336 process_sp->WillPublicStop();
4337 }
4338
4339 // If this is a halt event, even if the halt stopped with some reason other
4340 // than a plain interrupt (e.g. we had already stopped for a breakpoint when
4341 // the halt request came through) don't do the StopInfo actions, as they may
4342 // end up restarting the process.
4343 if (m_interrupted)
4344 return;
4345
4346 // If we're not stopped or have restarted, then skip the StopInfo actions:
4347 if (m_state != eStateStopped || m_restarted) {
4348 return;
4349 }
4350
4351 bool does_anybody_have_an_opinion = false;
4352 bool still_should_stop = ShouldStop(event_ptr, does_anybody_have_an_opinion);
4353
4354 if (GetRestarted()) {
4355 return;
4356 }
4357
4358 if (!still_should_stop && does_anybody_have_an_opinion) {
4359 // We've been asked to continue, so do that here.
4360 SetRestarted(true);
4361 // Use the private resume method here, since we aren't changing the run
4362 // lock state.
4363 process_sp->PrivateResume();
4364 } else {
4365 bool hijacked = process_sp->IsHijackedForEvent(eBroadcastBitStateChanged) &&
4366 !process_sp->StateChangedIsHijackedForSynchronousResume();
4367
4368 if (!hijacked) {
4369 // If we didn't restart, run the Stop Hooks here.
4370 // Don't do that if state changed events aren't hooked up to the
4371 // public (or SyncResume) broadcasters. StopHooks are just for
4372 // real public stops. They might also restart the target,
4373 // so watch for that.
4374 if (process_sp->GetTarget().RunStopHooks())
4375 SetRestarted(true);
4376 }
4377 }
4378}
4379
4381 ProcessSP process_sp(m_process_wp.lock());
4382
4383 if (process_sp)
4384 s->Printf(" process = %p (pid = %" PRIu64 "), ",
4385 static_cast<void *>(process_sp.get()), process_sp->GetID());
4386 else
4387 s->PutCString(" process = NULL, ");
4388
4389 s->Printf("state = %s", StateAsCString(GetState()));
4390}
4391
4394 if (event_ptr) {
4395 const EventData *event_data = event_ptr->GetData();
4396 if (event_data &&
4398 return static_cast<const ProcessEventData *>(event_ptr->GetData());
4399 }
4400 return nullptr;
4401}
4402
4405 ProcessSP process_sp;
4406 const ProcessEventData *data = GetEventDataFromEvent(event_ptr);
4407 if (data)
4408 process_sp = data->GetProcessSP();
4409 return process_sp;
4410}
4411
4413 const ProcessEventData *data = GetEventDataFromEvent(event_ptr);
4414 if (data == nullptr)
4415 return eStateInvalid;
4416 else
4417 return data->GetState();
4418}
4419
4421 const ProcessEventData *data = GetEventDataFromEvent(event_ptr);
4422 if (data == nullptr)
4423 return false;
4424 else
4425 return data->GetRestarted();
4426}
4427
4429 bool new_value) {
4430 ProcessEventData *data =
4431 const_cast<ProcessEventData *>(GetEventDataFromEvent(event_ptr));
4432 if (data != nullptr)
4433 data->SetRestarted(new_value);
4434}
4435
4436size_t
4438 ProcessEventData *data =
4439 const_cast<ProcessEventData *>(GetEventDataFromEvent(event_ptr));
4440 if (data != nullptr)
4441 return data->GetNumRestartedReasons();
4442 else
4443 return 0;
4444}
4445
4446const char *
4448 size_t idx) {
4449 ProcessEventData *data =
4450 const_cast<ProcessEventData *>(GetEventDataFromEvent(event_ptr));
4451 if (data != nullptr)
4452 return data->GetRestartedReasonAtIndex(idx);
4453 else
4454 return nullptr;
4455}
4456
4458 const char *reason) {
4459 ProcessEventData *data =
4460 const_cast<ProcessEventData *>(GetEventDataFromEvent(event_ptr));
4461 if (data != nullptr)
4462 data->AddRestartedReason(reason);
4463}
4464
4466 const Event *event_ptr) {
4467 const ProcessEventData *data = GetEventDataFromEvent(event_ptr);
4468 if (data == nullptr)
4469 return false;
4470 else
4471 return data->GetInterrupted();
4472}
4473
4475 bool new_value) {
4476 ProcessEventData *data =
4477 const_cast<ProcessEventData *>(GetEventDataFromEvent(event_ptr));
4478 if (data != nullptr)
4479 data->SetInterrupted(new_value);
4480}
4481
4483 ProcessEventData *data =
4484 const_cast<ProcessEventData *>(GetEventDataFromEvent(event_ptr));
4485 if (data) {
4487 return true;
4488 }
4489 return false;
4490}
4491
4493
4495 exe_ctx.SetTargetPtr(&GetTarget());
4496 exe_ctx.SetProcessPtr(this);
4497 exe_ctx.SetThreadPtr(nullptr);
4498 exe_ctx.SetFramePtr(nullptr);
4499}
4500
4501// uint32_t
4502// Process::ListProcessesMatchingName (const char *name, StringList &matches,
4503// std::vector<lldb::pid_t> &pids)
4504//{
4505// return 0;
4506//}
4507//
4508// ArchSpec
4509// Process::GetArchSpecForExistingProcess (lldb::pid_t pid)
4510//{
4511// return Host::GetArchSpecForExistingProcess (pid);
4512//}
4513//
4514// ArchSpec
4515// Process::GetArchSpecForExistingProcess (const char *process_name)
4516//{
4517// return Host::GetArchSpecForExistingProcess (process_name);
4518//}
4519
4521 auto event_data_sp =
4522 std::make_shared<ProcessEventData>(shared_from_this(), GetState());
4523 return std::make_shared<Event>(event_type, event_data_sp);
4524}
4525
4526void Process::AppendSTDOUT(const char *s, size_t len) {
4527 std::lock_guard<std::recursive_mutex> guard(m_stdio_communication_mutex);
4528 m_stdout_data.append(s, len);
4530 BroadcastEventIfUnique(event_sp);
4531}
4532
4533void Process::AppendSTDERR(const char *s, size_t len) {
4534 std::lock_guard<std::recursive_mutex> guard(m_stdio_communication_mutex);
4535 m_stderr_data.append(s, len);
4537 BroadcastEventIfUnique(event_sp);
4538}
4539
4540void Process::BroadcastAsyncProfileData(const std::string &one_profile_data) {
4541 std::lock_guard<std::recursive_mutex> guard(m_profile_data_comm_mutex);
4542 m_profile_data.push_back(one_profile_data);
4544 BroadcastEventIfUnique(event_sp);
4545}
4546
4548 const StructuredDataPluginSP &plugin_sp) {
4549 auto data_sp = std::make_shared<EventDataStructuredData>(
4550 shared_from_this(), object_sp, plugin_sp);
4552}
4553
4555Process::GetStructuredDataPlugin(llvm::StringRef type_name) const {
4556 auto find_it = m_structured_data_plugin_map.find(type_name);
4557 if (find_it != m_structured_data_plugin_map.end())
4558 return find_it->second;
4559 else
4560 return StructuredDataPluginSP();
4561}
4562
4563size_t Process::GetAsyncProfileData(char *buf, size_t buf_size, Status &error) {
4564 std::lock_guard<std::recursive_mutex> guard(m_profile_data_comm_mutex);
4565 if (m_profile_data.empty())
4566 return 0;
4567
4568 std::string &one_profile_data = m_profile_data.front();
4569 size_t bytes_available = one_profile_data.size();
4570 if (bytes_available > 0) {
4571 Log *log = GetLog(LLDBLog::Process);
4572 LLDB_LOGF(log, "Process::GetProfileData (buf = %p, size = %" PRIu64 ")",
4573 static_cast<void *>(buf), static_cast<uint64_t>(buf_size));
4574 if (bytes_available > buf_size) {
4575 memcpy(buf, one_profile_data.c_str(), buf_size);
4576 one_profile_data.erase(0, buf_size);
4577 bytes_available = buf_size;
4578 } else {
4579 memcpy(buf, one_profile_data.c_str(), bytes_available);
4580 m_profile_data.erase(m_profile_data.begin());
4581 }
4582 }
4583 return bytes_available;
4584}
4585
4586// Process STDIO
4587
4588size_t Process::GetSTDOUT(char *buf, size_t buf_size, Status &error) {
4589 std::lock_guard<std::recursive_mutex> guard(m_stdio_communication_mutex);
4590 size_t bytes_available = m_stdout_data.size();
4591 if (bytes_available > 0) {
4592 Log *log = GetLog(LLDBLog::Process);
4593 LLDB_LOGF(log, "Process::GetSTDOUT (buf = %p, size = %" PRIu64 ")",
4594 static_cast<void *>(buf), static_cast<uint64_t>(buf_size));
4595 if (bytes_available > buf_size) {
4596 memcpy(buf, m_stdout_data.c_str(), buf_size);
4597 m_stdout_data.erase(0, buf_size);
4598 bytes_available = buf_size;
4599 } else {
4600 memcpy(buf, m_stdout_data.c_str(), bytes_available);
4601 m_stdout_data.clear();
4602 }
4603 }
4604 return bytes_available;
4605}
4606
4607size_t Process::GetSTDERR(char *buf, size_t buf_size, Status &error) {
4608 std::lock_guard<std::recursive_mutex> gaurd(m_stdio_communication_mutex);
4609 size_t bytes_available = m_stderr_data.size();
4610 if (bytes_available > 0) {
4611 Log *log = GetLog(LLDBLog::Process);
4612 LLDB_LOGF(log, "Process::GetSTDERR (buf = %p, size = %" PRIu64 ")",
4613 static_cast<void *>(buf), static_cast<uint64_t>(buf_size));
4614 if (bytes_available > buf_size) {
4615 memcpy(buf, m_stderr_data.c_str(), buf_size);
4616 m_stderr_data.erase(0, buf_size);
4617 bytes_available = buf_size;
4618 } else {
4619 memcpy(buf, m_stderr_data.c_str(), bytes_available);
4620 m_stderr_data.clear();
4621 }
4622 }
4623 return bytes_available;
4624}
4625
4626void Process::STDIOReadThreadBytesReceived(void *baton, const void *src,
4627 size_t src_len) {
4628 Process *process = (Process *)baton;
4629 process->AppendSTDOUT(static_cast<const char *>(src), src_len);
4630}
4631
4633public:
4634 IOHandlerProcessSTDIO(Process *process, int write_fd)
4635 : IOHandler(process->GetTarget().GetDebugger(),
4637 m_process(process),
4638 m_read_file(GetInputFD(), File::eOpenOptionReadOnly, false),
4639 m_write_file(write_fd, File::eOpenOptionWriteOnly, false) {
4640 m_pipe.CreateNew();
4641 }
4642
4643 ~IOHandlerProcessSTDIO() override = default;
4644
4645 void SetIsRunning(bool running) {
4646 std::lock_guard<std::mutex> guard(m_mutex);
4647 SetIsDone(!running);
4648 m_is_running = running;
4649 }
4650
4651 // Each IOHandler gets to run until it is done. It should read data from the
4652 // "in" and place output into "out" and "err and return when done.
4653 void Run() override {
4654 if (!m_read_file.IsValid() || !m_write_file.IsValid() ||
4655 !m_pipe.CanRead() || !m_pipe.CanWrite()) {
4656 SetIsDone(true);
4657 return;
4658 }
4659
4660 SetIsDone(false);
4661 const int read_fd = m_read_file.GetDescriptor();
4662 Terminal terminal(read_fd);
4663 TerminalState terminal_state(terminal, false);
4664 // FIXME: error handling?
4665 llvm::consumeError(terminal.SetCanonical(false));
4666 llvm::consumeError(terminal.SetEcho(false));
4667// FD_ZERO, FD_SET are not supported on windows
4668#ifndef _WIN32
4669 const int pipe_read_fd = m_pipe.GetReadFileDescriptor();
4670 SetIsRunning(true);
4671 while (true) {
4672 {
4673 std::lock_guard<std::mutex> guard(m_mutex);
4674 if (GetIsDone())
4675 break;
4676 }
4677
4678 SelectHelper select_helper;
4679 select_helper.FDSetRead(read_fd);
4680 select_helper.FDSetRead(pipe_read_fd);
4681 Status error = select_helper.Select();
4682
4683 if (error.Fail())
4684 break;
4685
4686 char ch = 0;
4687 size_t n;
4688 if (select_helper.FDIsSetRead(read_fd)) {
4689 n = 1;
4690 if (m_read_file.Read(&ch, n).Success() && n == 1) {
4691 if (m_write_file.Write(&ch, n).Fail() || n != 1)
4692 break;
4693 } else
4694 break;
4695 }
4696
4697 if (select_helper.FDIsSetRead(pipe_read_fd)) {
4698 // Consume the interrupt byte
4699 if (llvm::Expected<size_t> bytes_read = m_pipe.Read(&ch, 1)) {
4700 if (ch == 'q')
4701 break;
4702 if (ch == 'i')
4703 if (StateIsRunningState(m_process->GetState()))
4704 m_process->SendAsyncInterrupt();
4705 } else {
4706 LLDB_LOG_ERROR(GetLog(LLDBLog::Process), bytes_read.takeError(),
4707 "Pipe read failed: {0}");
4708 }
4709 }
4710 }
4711 SetIsRunning(false);
4712#endif
4713 }
4714
4715 void Cancel() override {
4716 std::lock_guard<std::mutex> guard(m_mutex);
4717 SetIsDone(true);
4718 // Only write to our pipe to cancel if we are in
4719 // IOHandlerProcessSTDIO::Run(). We can end up with a python command that
4720 // is being run from the command interpreter:
4721 //
4722 // (lldb) step_process_thousands_of_times
4723 //
4724 // In this case the command interpreter will be in the middle of handling
4725 // the command and if the process pushes and pops the IOHandler thousands
4726 // of times, we can end up writing to m_pipe without ever consuming the
4727 // bytes from the pipe in IOHandlerProcessSTDIO::Run() and end up
4728 // deadlocking when the pipe gets fed up and blocks until data is consumed.
4729 if (m_is_running) {
4730 char ch = 'q'; // Send 'q' for quit
4731 if (llvm::Error err = m_pipe.Write(&ch, 1).takeError()) {
4732 LLDB_LOG_ERROR(GetLog(LLDBLog::Process), std::move(err),
4733 "Pipe write failed: {0}");
4734 }
4735 }
4736 }
4737
4738 bool Interrupt() override {
4739 // Do only things that are safe to do in an interrupt context (like in a
4740 // SIGINT handler), like write 1 byte to a file descriptor. This will
4741 // interrupt the IOHandlerProcessSTDIO::Run() and we can look at the byte
4742 // that was written to the pipe and then call
4743 // m_process->SendAsyncInterrupt() from a much safer location in code.
4744 if (m_active) {
4745 char ch = 'i'; // Send 'i' for interrupt
4746 return !errorToBool(m_pipe.Write(&ch, 1).takeError());
4747 } else {
4748 // This IOHandler might be pushed on the stack, but not being run
4749 // currently so do the right thing if we aren't actively watching for
4750 // STDIN by sending the interrupt to the process. Otherwise the write to
4751 // the pipe above would do nothing. This can happen when the command
4752 // interpreter is running and gets a "expression ...". It will be on the
4753 // IOHandler thread and sending the input is complete to the delegate
4754 // which will cause the expression to run, which will push the process IO
4755 // handler, but not run it.
4756
4757 if (StateIsRunningState(m_process->GetState())) {
4758 m_process->SendAsyncInterrupt();
4759 return true;
4760 }
4761 }
4762 return false;
4763 }
4764
4765 void GotEOF() override {}
4766
4767protected:
4769 NativeFile m_read_file; // Read from this file (usually actual STDIN for LLDB
4770 NativeFile m_write_file; // Write to this file (usually the primary pty for
4771 // getting io to debuggee)
4773 std::mutex m_mutex;
4774 bool m_is_running = false;
4775};
4776
4778 // First set up the Read Thread for reading/handling process I/O
4779 m_stdio_communication.SetConnection(
4780 std::make_unique<ConnectionFileDescriptor>(fd, true));
4781 if (m_stdio_communication.IsConnected()) {
4782 m_stdio_communication.SetReadThreadBytesReceivedCallback(
4784 m_stdio_communication.StartReadThread();
4785
4786 // Now read thread is set up, set up input reader.
4787 {
4788 std::lock_guard<std::mutex> guard(m_process_input_reader_mutex);
4791 std::make_shared<IOHandlerProcessSTDIO>(this, fd);
4792 }
4793 }
4794}
4795
4797 std::lock_guard<std::mutex> guard(m_process_input_reader_mutex);
4798 IOHandlerSP io_handler_sp(m_process_input_reader);
4799 if (io_handler_sp)
4800 return GetTarget().GetDebugger().IsTopIOHandler(io_handler_sp);
4801 return false;
4802}
4803
4805 std::lock_guard<std::mutex> guard(m_process_input_reader_mutex);
4806 IOHandlerSP io_handler_sp(m_process_input_reader);
4807 if (io_handler_sp) {
4808 Log *log = GetLog(LLDBLog::Process);
4809 LLDB_LOGF(log, "Process::%s pushing IO handler", __FUNCTION__);
4810
4811 io_handler_sp->SetIsDone(false);
4812 // If we evaluate an utility function, then we don't cancel the current
4813 // IOHandler. Our IOHandler is non-interactive and shouldn't disturb the
4814 // existing IOHandler that potentially provides the user interface (e.g.
4815 // the IOHandler for Editline).
4816 bool cancel_top_handler = !m_mod_id.IsRunningUtilityFunction();
4817 GetTarget().GetDebugger().RunIOHandlerAsync(io_handler_sp,
4818 cancel_top_handler);
4819 return true;
4820 }
4821 return false;
4822}
4823
4825 std::lock_guard<std::mutex> guard(m_process_input_reader_mutex);
4826 IOHandlerSP io_handler_sp(m_process_input_reader);
4827 if (io_handler_sp)
4828 return GetTarget().GetDebugger().RemoveIOHandler(io_handler_sp);
4829 return false;
4830}
4831
4832// The process needs to know about installed plug-ins
4834
4836
4837namespace {
4838// RestorePlanState is used to record the "is private", "is controlling" and
4839// "okay
4840// to discard" fields of the plan we are running, and reset it on Clean or on
4841// destruction. It will only reset the state once, so you can call Clean and
4842// then monkey with the state and it won't get reset on you again.
4843
4844class RestorePlanState {
4845public:
4846 RestorePlanState(lldb::ThreadPlanSP thread_plan_sp)
4847 : m_thread_plan_sp(thread_plan_sp) {
4848 if (m_thread_plan_sp) {
4849 m_private = m_thread_plan_sp->GetPrivate();
4850 m_is_controlling = m_thread_plan_sp->IsControllingPlan();
4851 m_okay_to_discard = m_thread_plan_sp->OkayToDiscard();
4852 }
4853 }
4854
4855 ~RestorePlanState() { Clean(); }
4856
4857 void Clean() {
4858 if (!m_already_reset && m_thread_plan_sp) {
4859 m_already_reset = true;
4860 m_thread_plan_sp->SetPrivate(m_private);
4861 m_thread_plan_sp->SetIsControllingPlan(m_is_controlling);
4862 m_thread_plan_sp->SetOkayToDiscard(m_okay_to_discard);
4863 }
4864 }
4865
4866private:
4867 lldb::ThreadPlanSP m_thread_plan_sp;
4868 bool m_already_reset = false;
4869 bool m_private = false;
4870 bool m_is_controlling = false;
4871 bool m_okay_to_discard = false;
4872};
4873} // anonymous namespace
4874
4875static microseconds
4877 const milliseconds default_one_thread_timeout(250);
4878
4879 // If the overall wait is forever, then we don't need to worry about it.
4880 if (!options.GetTimeout()) {
4881 return options.GetOneThreadTimeout() ? *options.GetOneThreadTimeout()
4882 : default_one_thread_timeout;
4883 }
4884
4885 // If the one thread timeout is set, use it.
4886 if (options.GetOneThreadTimeout())
4887 return *options.GetOneThreadTimeout();
4888
4889 // Otherwise use half the total timeout, bounded by the
4890 // default_one_thread_timeout.
4891 return std::min<microseconds>(default_one_thread_timeout,
4892 *options.GetTimeout() / 2);
4893}
4894
4895static Timeout<std::micro>
4897 bool before_first_timeout) {
4898 // If we are going to run all threads the whole time, or if we are only going
4899 // to run one thread, we can just return the overall timeout.
4900 if (!options.GetStopOthers() || !options.GetTryAllThreads())
4901 return options.GetTimeout();
4902
4903 if (before_first_timeout)
4904 return GetOneThreadExpressionTimeout(options);
4905
4906 if (!options.GetTimeout())
4907 return std::nullopt;
4908 else
4909 return *options.GetTimeout() - GetOneThreadExpressionTimeout(options);
4910}
4911
4912static std::optional<ExpressionResults>
4913HandleStoppedEvent(lldb::tid_t thread_id, const ThreadPlanSP &thread_plan_sp,
4914 RestorePlanState &restorer, const EventSP &event_sp,
4915 EventSP &event_to_broadcast_sp,
4916 const EvaluateExpressionOptions &options,
4917 bool handle_interrupts) {
4919
4920 ThreadSP thread_sp = thread_plan_sp->GetTarget()
4921 .GetProcessSP()
4922 ->GetThreadList()
4923 .FindThreadByID(thread_id);
4924 if (!thread_sp) {
4925 LLDB_LOG(log,
4926 "The thread on which we were running the "
4927 "expression: tid = {0}, exited while "
4928 "the expression was running.",
4929 thread_id);
4931 }
4932
4933 ThreadPlanSP plan = thread_sp->GetCompletedPlan();
4934 if (plan == thread_plan_sp && plan->PlanSucceeded()) {
4935 LLDB_LOG(log, "execution completed successfully");
4936
4937 // Restore the plan state so it will get reported as intended when we are
4938 // done.
4939 restorer.Clean();
4940 return eExpressionCompleted;
4941 }
4942
4943 StopInfoSP stop_info_sp = thread_sp->GetStopInfo();
4944 if (stop_info_sp && stop_info_sp->GetStopReason() == eStopReasonBreakpoint &&
4945 stop_info_sp->ShouldNotify(event_sp.get())) {
4946 LLDB_LOG(log, "stopped for breakpoint: {0}.", stop_info_sp->GetDescription());
4947 if (!options.DoesIgnoreBreakpoints()) {
4948 // Restore the plan state and then force Private to false. We are going
4949 // to stop because of this plan so we need it to become a public plan or
4950 // it won't report correctly when we continue to its termination later
4951 // on.
4952 restorer.Clean();
4953 thread_plan_sp->SetPrivate(false);
4954 event_to_broadcast_sp = event_sp;
4955 }
4957 }
4958
4959 if (!handle_interrupts &&
4961 return std::nullopt;
4962
4963 LLDB_LOG(log, "thread plan did not successfully complete");
4964 if (!options.DoesUnwindOnError())
4965 event_to_broadcast_sp = event_sp;
4967}
4968
4971 lldb::ThreadPlanSP &thread_plan_sp,
4972 const EvaluateExpressionOptions &options,
4973 DiagnosticManager &diagnostic_manager) {
4975
4976 std::lock_guard<std::mutex> run_thread_plan_locker(m_run_thread_plan_lock);
4977
4978 if (!thread_plan_sp) {
4979 diagnostic_manager.PutString(
4980 lldb::eSeverityError, "RunThreadPlan called with empty thread plan.");
4981 return eExpressionSetupError;
4982 }
4983
4984 if (!thread_plan_sp->ValidatePlan(nullptr)) {
4985 diagnostic_manager.PutString(
4987 "RunThreadPlan called with an invalid thread plan.");
4988 return eExpressionSetupError;
4989 }
4990
4991 if (exe_ctx.GetProcessPtr() != this) {
4992 diagnostic_manager.PutString(lldb::eSeverityError,
4993 "RunThreadPlan called on wrong process.");
4994 return eExpressionSetupError;
4995 }
4996
4997 Thread *thread = exe_ctx.GetThreadPtr();
4998 if (thread == nullptr) {
4999 diagnostic_manager.PutString(lldb::eSeverityError,
5000 "RunThreadPlan called with invalid thread.");
5001 return eExpressionSetupError;
5002 }
5003
5004 // Record the thread's id so we can tell when a thread we were using
5005 // to run the expression exits during the expression evaluation.
5006 lldb::tid_t expr_thread_id = thread->GetID();
5007
5008 // We need to change some of the thread plan attributes for the thread plan
5009 // runner. This will restore them when we are done:
5010
5011 RestorePlanState thread_plan_restorer(thread_plan_sp);
5012
5013 // We rely on the thread plan we are running returning "PlanCompleted" if
5014 // when it successfully completes. For that to be true the plan can't be
5015 // private - since private plans suppress themselves in the GetCompletedPlan
5016 // call.
5017
5018 thread_plan_sp->SetPrivate(false);
5019
5020 // The plans run with RunThreadPlan also need to be terminal controlling plans
5021 // or when they are done we will end up asking the plan above us whether we
5022 // should stop, which may give the wrong answer.
5023
5024 thread_plan_sp->SetIsControllingPlan(true);
5025 thread_plan_sp->SetOkayToDiscard(false);
5026
5027 // If we are running some utility expression for LLDB, we now have to mark
5028 // this in the ProcesModID of this process. This RAII takes care of marking
5029 // and reverting the mark it once we are done running the expression.
5030 UtilityFunctionScope util_scope(options.IsForUtilityExpr() ? this : nullptr);
5031
5032 if (m_private_state.GetValue() != eStateStopped) {
5033 diagnostic_manager.PutString(
5035 "RunThreadPlan called while the private state was not stopped.");
5036 return eExpressionSetupError;
5037 }
5038
5039 // Save the thread & frame from the exe_ctx for restoration after we run
5040 const uint32_t thread_idx_id = thread->GetIndexID();
5041 StackFrameSP selected_frame_sp =
5042 thread->GetSelectedFrame(DoNoSelectMostRelevantFrame);
5043 if (!selected_frame_sp) {
5044 thread->SetSelectedFrame(nullptr);
5045 selected_frame_sp = thread->GetSelectedFrame(DoNoSelectMostRelevantFrame);
5046 if (!selected_frame_sp) {
5047 diagnostic_manager.Printf(
5049 "RunThreadPlan called without a selected frame on thread %d",
5050 thread_idx_id);
5051 return eExpressionSetupError;
5052 }
5053 }
5054
5055 // Make sure the timeout values make sense. The one thread timeout needs to
5056 // be smaller than the overall timeout.
5057 if (options.GetOneThreadTimeout() && options.GetTimeout() &&
5058 *options.GetTimeout() < *options.GetOneThreadTimeout()) {
5059 diagnostic_manager.PutString(lldb::eSeverityError,
5060 "RunThreadPlan called with one thread "
5061 "timeout greater than total timeout");
5062 return eExpressionSetupError;
5063 }
5064
5065 // If the ExecutionContext has a frame, we want to make sure to save/restore
5066 // that frame into exe_ctx. This can happen when we run expressions from a
5067 // non-selected SBFrame, in which case we don't want some thread-plan
5068 // to overwrite the ExecutionContext frame.
5069 StackID ctx_frame_id = exe_ctx.HasFrameScope()
5070 ? exe_ctx.GetFrameRef().GetStackID()
5071 : selected_frame_sp->GetStackID();
5072
5073 // N.B. Running the target may unset the currently selected thread and frame.
5074 // We don't want to do that either, so we should arrange to reset them as
5075 // well.
5076
5077 lldb::ThreadSP selected_thread_sp = GetThreadList().GetSelectedThread();
5078
5079 uint32_t selected_tid;
5080 StackID selected_stack_id;
5081 if (selected_thread_sp) {
5082 selected_tid = selected_thread_sp->GetIndexID();
5083 selected_stack_id =
5084 selected_thread_sp->GetSelectedFrame(DoNoSelectMostRelevantFrame)
5085 ->GetStackID();
5086 } else {
5087 selected_tid = LLDB_INVALID_THREAD_ID;
5088 }
5089
5090 HostThread backup_private_state_thread;
5091 lldb::StateType old_state = eStateInvalid;
5092 lldb::ThreadPlanSP stopper_base_plan_sp;
5093
5095 if (m_private_state_thread.EqualsThread(Host::GetCurrentThread())) {
5096 // Yikes, we are running on the private state thread! So we can't wait for
5097 // public events on this thread, since we are the thread that is generating
5098 // public events. The simplest thing to do is to spin up a temporary thread
5099 // to handle private state thread events while we are fielding public
5100 // events here.
5101 LLDB_LOGF(log, "Running thread plan on private state thread, spinning up "
5102 "another state thread to handle the events.");
5103
5104 backup_private_state_thread = m_private_state_thread;
5105
5106 // One other bit of business: we want to run just this thread plan and
5107 // anything it pushes, and then stop, returning control here. But in the
5108 // normal course of things, the plan above us on the stack would be given a
5109 // shot at the stop event before deciding to stop, and we don't want that.
5110 // So we insert a "stopper" base plan on the stack before the plan we want
5111 // to run. Since base plans always stop and return control to the user,
5112 // that will do just what we want.
5113 stopper_base_plan_sp.reset(new ThreadPlanBase(*thread));
5114 thread->QueueThreadPlan(stopper_base_plan_sp, false);
5115 // Have to make sure our public state is stopped, since otherwise the
5116 // reporting logic below doesn't work correctly.
5117 old_state = m_public_state.GetValue();
5118 m_public_state.SetValueNoLock(eStateStopped);
5119
5120 // Now spin up the private state thread:
5122 }
5123
5124 thread->QueueThreadPlan(
5125 thread_plan_sp, false); // This used to pass "true" does that make sense?
5126
5127 if (options.GetDebug()) {
5128 // In this case, we aren't actually going to run, we just want to stop
5129 // right away. Flush this thread so we will refetch the stacks and show the
5130 // correct backtrace.
5131 // FIXME: To make this prettier we should invent some stop reason for this,
5132 // but that
5133 // is only cosmetic, and this functionality is only of use to lldb
5134 // developers who can live with not pretty...
5135 thread->Flush();
5137 }
5138
5139 ListenerSP listener_sp(
5140 Listener::MakeListener("lldb.process.listener.run-thread-plan"));
5141
5142 lldb::EventSP event_to_broadcast_sp;
5143
5144 {
5145 // This process event hijacker Hijacks the Public events and its destructor
5146 // makes sure that the process events get restored on exit to the function.
5147 //
5148 // If the event needs to propagate beyond the hijacker (e.g., the process
5149 // exits during execution), then the event is put into
5150 // event_to_broadcast_sp for rebroadcasting.
5151
5152 ProcessEventHijacker run_thread_plan_hijacker(*this, listener_sp);
5153
5154 if (log) {
5155 StreamString s;
5156 thread_plan_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose);
5157 LLDB_LOGF(log,
5158 "Process::RunThreadPlan(): Resuming thread %u - 0x%4.4" PRIx64
5159 " to run thread plan \"%s\".",
5160 thread_idx_id, expr_thread_id, s.GetData());
5161 }
5162
5163 bool got_event;
5164 lldb::EventSP event_sp;
5166
5167 bool before_first_timeout = true; // This is set to false the first time
5168 // that we have to halt the target.
5169 bool do_resume = true;
5170 bool handle_running_event = true;
5171
5172 // This is just for accounting:
5173 uint32_t num_resumes = 0;
5174
5175 // If we are going to run all threads the whole time, or if we are only
5176 // going to run one thread, then we don't need the first timeout. So we
5177 // pretend we are after the first timeout already.
5178 if (!options.GetStopOthers() || !options.GetTryAllThreads())
5179 before_first_timeout = false;
5180
5181 LLDB_LOGF(log, "Stop others: %u, try all: %u, before_first: %u.\n",
5182 options.GetStopOthers(), options.GetTryAllThreads(),
5183 before_first_timeout);
5184
5185 // This isn't going to work if there are unfetched events on the queue. Are
5186 // there cases where we might want to run the remaining events here, and
5187 // then try to call the function? That's probably being too tricky for our
5188 // own good.
5189
5190 Event *other_events = listener_sp->PeekAtNextEvent();
5191 if (other_events != nullptr) {
5192 diagnostic_manager.PutString(
5194 "RunThreadPlan called with pending events on the queue.");
5195 return eExpressionSetupError;
5196 }
5197
5198 // We also need to make sure that the next event is delivered. We might be
5199 // calling a function as part of a thread plan, in which case the last
5200 // delivered event could be the running event, and we don't want event
5201 // coalescing to cause us to lose OUR running event...
5203
5204// This while loop must exit out the bottom, there's cleanup that we need to do
5205// when we are done. So don't call return anywhere within it.
5206
5207#ifdef LLDB_RUN_THREAD_HALT_WITH_EVENT
5208 // It's pretty much impossible to write test cases for things like: One
5209 // thread timeout expires, I go to halt, but the process already stopped on
5210 // the function call stop breakpoint. Turning on this define will make us
5211 // not fetch the first event till after the halt. So if you run a quick
5212 // function, it will have completed, and the completion event will be
5213 // waiting, when you interrupt for halt. The expression evaluation should
5214 // still succeed.
5215 bool miss_first_event = true;
5216#endif
5217 while (true) {
5218 // We usually want to resume the process if we get to the top of the
5219 // loop. The only exception is if we get two running events with no
5220 // intervening stop, which can happen, we will just wait for then next
5221 // stop event.
5222 LLDB_LOGF(log,
5223 "Top of while loop: do_resume: %i handle_running_event: %i "
5224 "before_first_timeout: %i.",
5225 do_resume, handle_running_event, before_first_timeout);
5226
5227 if (do_resume || handle_running_event) {
5228 // Do the initial resume and wait for the running event before going
5229 // further.
5230
5231 if (do_resume) {
5232 num_resumes++;
5233 Status resume_error = PrivateResume();
5234 if (!resume_error.Success()) {
5235 diagnostic_manager.Printf(
5237 "couldn't resume inferior the %d time: \"%s\".", num_resumes,
5238 resume_error.AsCString());
5239 return_value = eExpressionSetupError;
5240 break;
5241 }
5242 }
5243
5244 got_event =
5245 listener_sp->GetEvent(event_sp, GetUtilityExpressionTimeout());
5246 if (!got_event) {
5247 LLDB_LOGF(log,
5248 "Process::RunThreadPlan(): didn't get any event after "
5249 "resume %" PRIu32 ", exiting.",
5250 num_resumes);
5251
5252 diagnostic_manager.Printf(lldb::eSeverityError,
5253 "didn't get any event after resume %" PRIu32
5254 ", exiting.",
5255 num_resumes);
5256 return_value = eExpressionSetupError;
5257 break;
5258 }
5259
5260 stop_state =
5262
5263 if (stop_state != eStateRunning) {
5264 bool restarted = false;
5265
5266 if (stop_state == eStateStopped) {
5268 event_sp.get());
5269 LLDB_LOGF(
5270 log,
5271 "Process::RunThreadPlan(): didn't get running event after "
5272 "resume %d, got %s instead (restarted: %i, do_resume: %i, "
5273 "handle_running_event: %i).",
5274 num_resumes, StateAsCString(stop_state), restarted, do_resume,
5275 handle_running_event);
5276 }
5277
5278 if (restarted) {
5279 // This is probably an overabundance of caution, I don't think I
5280 // should ever get a stopped & restarted event here. But if I do,
5281 // the best thing is to Halt and then get out of here.
5282 const bool clear_thread_plans = false;
5283 const bool use_run_lock = false;
5284 Halt(clear_thread_plans, use_run_lock);
5285 }
5286
5287 diagnostic_manager.Printf(
5289 "didn't get running event after initial resume, got %s instead.",
5290 StateAsCString(stop_state));
5291 return_value = eExpressionSetupError;
5292 break;
5293 }
5294
5295 if (log)
5296 log->PutCString("Process::RunThreadPlan(): resuming succeeded.");
5297 // We need to call the function synchronously, so spin waiting for it
5298 // to return. If we get interrupted while executing, we're going to
5299 // lose our context, and won't be able to gather the result at this
5300 // point. We set the timeout AFTER the resume, since the resume takes
5301 // some time and we don't want to charge that to the timeout.
5302 } else {
5303 if (log)
5304 log->PutCString("Process::RunThreadPlan(): waiting for next event.");
5305 }
5306
5307 do_resume = true;
5308 handle_running_event = true;
5309
5310 // Now wait for the process to stop again:
5311 event_sp.reset();
5312
5313 Timeout<std::micro> timeout =
5314 GetExpressionTimeout(options, before_first_timeout);
5315 if (log) {
5316 if (timeout) {
5317 auto now = system_clock::now();
5318 LLDB_LOGF(log,
5319 "Process::RunThreadPlan(): about to wait - now is %s - "
5320 "endpoint is %s",
5321 llvm::to_string(now).c_str(),
5322 llvm::to_string(now + *timeout).c_str());
5323 } else {
5324 LLDB_LOGF(log, "Process::RunThreadPlan(): about to wait forever.");
5325 }
5326 }
5327
5328#ifdef LLDB_RUN_THREAD_HALT_WITH_EVENT
5329 // See comment above...
5330 if (miss_first_event) {
5331 std::this_thread::sleep_for(std::chrono::milliseconds(1));
5332 miss_first_event = false;
5333 got_event = false;
5334 } else
5335#endif
5336 got_event = listener_sp->GetEvent(event_sp, timeout);
5337
5338 if (got_event) {
5339 if (event_sp) {
5340 bool keep_going = false;
5341 if (event_sp->GetType() == eBroadcastBitInterrupt) {
5342 const bool clear_thread_plans = false;
5343 const bool use_run_lock = false;
5344 Halt(clear_thread_plans, use_run_lock);
5345 return_value = eExpressionInterrupted;
5346 diagnostic_manager.PutString(lldb::eSeverityInfo,
5347 "execution halted by user interrupt.");
5348 LLDB_LOGF(log, "Process::RunThreadPlan(): Got interrupted by "
5349 "eBroadcastBitInterrupted, exiting.");
5350 break;
5351 } else {
5352 stop_state =
5354 LLDB_LOGF(log,
5355 "Process::RunThreadPlan(): in while loop, got event: %s.",
5356 StateAsCString(stop_state));
5357
5358 switch (stop_state) {
5359 case lldb::eStateStopped: {
5361 event_sp.get())) {
5362 // If we were restarted, we just need to go back up to fetch
5363 // another event.
5364 LLDB_LOGF(log, "Process::RunThreadPlan(): Got a stop and "
5365 "restart, so we'll continue waiting.");
5366 keep_going = true;
5367 do_resume = false;
5368 handle_running_event = true;
5369 } else {
5370 const bool handle_interrupts = true;
5371 return_value = *HandleStoppedEvent(
5372 expr_thread_id, thread_plan_sp, thread_plan_restorer,
5373 event_sp, event_to_broadcast_sp, options,
5374 handle_interrupts);
5375 if (return_value == eExpressionThreadVanished)
5376 keep_going = false;
5377 }
5378 } break;
5379
5381 // This shouldn't really happen, but sometimes we do get two
5382 // running events without an intervening stop, and in that case
5383 // we should just go back to waiting for the stop.
5384 do_resume = false;
5385 keep_going = true;
5386 handle_running_event = false;
5387 break;
5388
5389 default:
5390 LLDB_LOGF(log,
5391 "Process::RunThreadPlan(): execution stopped with "
5392 "unexpected state: %s.",
5393 StateAsCString(stop_state));
5394
5395 if (stop_state == eStateExited)
5396 event_to_broadcast_sp = event_sp;
5397
5398 diagnostic_manager.PutString(
5400 "execution stopped with unexpected state.");
5401 return_value = eExpressionInterrupted;
5402 break;
5403 }
5404 }
5405
5406 if (keep_going)
5407 continue;
5408 else
5409 break;
5410 } else {
5411 if (log)
5412 log->PutCString("Process::RunThreadPlan(): got_event was true, but "
5413 "the event pointer was null. How odd...");
5414 return_value = eExpressionInterrupted;
5415 break;
5416 }
5417 } else {
5418 // If we didn't get an event that means we've timed out... We will
5419 // interrupt the process here. Depending on what we were asked to do
5420 // we will either exit, or try with all threads running for the same
5421 // timeout.
5422
5423 if (log) {
5424 if (options.GetTryAllThreads()) {
5425 if (before_first_timeout) {
5426 LLDB_LOG(log,
5427 "Running function with one thread timeout timed out.");
5428 } else
5429 LLDB_LOG(log, "Restarting function with all threads enabled and "
5430 "timeout: {0} timed out, abandoning execution.",
5431 timeout);
5432 } else
5433 LLDB_LOG(log, "Running function with timeout: {0} timed out, "
5434 "abandoning execution.",
5435 timeout);
5436 }
5437
5438 // It is possible that between the time we issued the Halt, and we get
5439 // around to calling Halt the target could have stopped. That's fine,
5440 // Halt will figure that out and send the appropriate Stopped event.
5441 // BUT it is also possible that we stopped & restarted (e.g. hit a
5442 // signal with "stop" set to false.) In
5443 // that case, we'll get the stopped & restarted event, and we should go
5444 // back to waiting for the Halt's stopped event. That's what this
5445 // while loop does.
5446
5447 bool back_to_top = true;
5448 uint32_t try_halt_again = 0;
5449 bool do_halt = true;
5450 const uint32_t num_retries = 5;
5451 while (try_halt_again < num_retries) {
5452 Status halt_error;
5453 if (do_halt) {
5454 LLDB_LOGF(log, "Process::RunThreadPlan(): Running Halt.");
5455 const bool clear_thread_plans = false;
5456 const bool use_run_lock = false;
5457 Halt(clear_thread_plans, use_run_lock);
5458 }
5459 if (halt_error.Success()) {
5460 if (log)
5461 log->PutCString("Process::RunThreadPlan(): Halt succeeded.");
5462
5463 got_event =
5464 listener_sp->GetEvent(event_sp, GetUtilityExpressionTimeout());
5465
5466 if (got_event) {
5467 stop_state =
5469 if (log) {
5470 LLDB_LOGF(log,
5471 "Process::RunThreadPlan(): Stopped with event: %s",
5472 StateAsCString(stop_state));
5473 if (stop_state == lldb::eStateStopped &&
5475 event_sp.get()))
5476 log->PutCString(" Event was the Halt interruption event.");
5477 }
5478
5479 if (stop_state == lldb::eStateStopped) {
5481 event_sp.get())) {
5482 if (log)
5483 log->PutCString("Process::RunThreadPlan(): Went to halt "
5484 "but got a restarted event, there must be "
5485 "an un-restarted stopped event so try "
5486 "again... "
5487 "Exiting wait loop.");
5488 try_halt_again++;
5489 do_halt = false;
5490 continue;
5491 }
5492
5493 // Between the time we initiated the Halt and the time we
5494 // delivered it, the process could have already finished its
5495 // job. Check that here:
5496 const bool handle_interrupts = false;
5497 if (auto result = HandleStoppedEvent(
5498 expr_thread_id, thread_plan_sp, thread_plan_restorer,
5499 event_sp, event_to_broadcast_sp, options,
5500 handle_interrupts)) {
5501 return_value = *result;
5502 back_to_top = false;
5503 break;
5504 }
5505
5506 if (!options.GetTryAllThreads()) {
5507 if (log)
5508 log->PutCString("Process::RunThreadPlan(): try_all_threads "
5509 "was false, we stopped so now we're "
5510 "quitting.");
5511 return_value = eExpressionInterrupted;
5512 back_to_top = false;
5513 break;
5514 }
5515
5516 if (before_first_timeout) {
5517 // Set all the other threads to run, and return to the top of
5518 // the loop, which will continue;
5519 before_first_timeout = false;
5520 thread_plan_sp->SetStopOthers(false);
5521 if (log)
5522 log->PutCString(
5523 "Process::RunThreadPlan(): about to resume.");
5524
5525 back_to_top = true;
5526 break;
5527 } else {
5528 // Running all threads failed, so return Interrupted.
5529 if (log)
5530 log->PutCString("Process::RunThreadPlan(): running all "
5531 "threads timed out.");
5532 return_value = eExpressionInterrupted;
5533 back_to_top = false;
5534 break;
5535 }
5536 }
5537 } else {
5538 if (log)
5539 log->PutCString("Process::RunThreadPlan(): halt said it "
5540 "succeeded, but I got no event. "
5541 "I'm getting out of here passing Interrupted.");
5542 return_value = eExpressionInterrupted;
5543 back_to_top = false;
5544 break;
5545 }
5546 } else {
5547 try_halt_again++;
5548 continue;
5549 }
5550 }
5551
5552 if (!back_to_top || try_halt_again > num_retries)
5553 break;
5554 else
5555 continue;
5556 }
5557 } // END WAIT LOOP
5558
5559 // If we had to start up a temporary private state thread to run this
5560 // thread plan, shut it down now.
5561 if (backup_private_state_thread.IsJoinable()) {
5563 Status error;
5564 m_private_state_thread = backup_private_state_thread;
5565 if (stopper_base_plan_sp) {
5566 thread->DiscardThreadPlansUpToPlan(stopper_base_plan_sp);
5567 }
5568 if (old_state != eStateInvalid)
5569 m_public_state.SetValueNoLock(old_state);
5570 }
5571
5572 // If our thread went away on us, we need to get out of here without
5573 // doing any more work. We don't have to clean up the thread plan, that
5574 // will have happened when the Thread was destroyed.
5575 if (return_value == eExpressionThreadVanished) {
5576 return return_value;
5577 }
5578
5579 if (return_value != eExpressionCompleted && log) {
5580 // Print a backtrace into the log so we can figure out where we are:
5581 StreamString s;
5582 s.PutCString("Thread state after unsuccessful completion: \n");
5583 thread->GetStackFrameStatus(s, 0, UINT32_MAX, true, UINT32_MAX,
5584 /*show_hidden*/ true);
5585 log->PutString(s.GetString());
5586 }
5587 // Restore the thread state if we are going to discard the plan execution.
5588 // There are three cases where this could happen: 1) The execution
5589 // successfully completed 2) We hit a breakpoint, and ignore_breakpoints
5590 // was true 3) We got some other error, and discard_on_error was true
5591 bool should_unwind = (return_value == eExpressionInterrupted &&
5592 options.DoesUnwindOnError()) ||
5593 (return_value == eExpressionHitBreakpoint &&
5594 options.DoesIgnoreBreakpoints());
5595
5596 if (return_value == eExpressionCompleted || should_unwind) {
5597 thread_plan_sp->RestoreThreadState();
5598 }
5599
5600 // Now do some processing on the results of the run:
5601 if (return_value == eExpressionInterrupted ||
5602 return_value == eExpressionHitBreakpoint) {
5603 if (log) {
5604 StreamString s;
5605 if (event_sp)
5606 event_sp->Dump(&s);
5607 else {
5608 log->PutCString("Process::RunThreadPlan(): Stop event that "
5609 "interrupted us is NULL.");
5610 }
5611
5612 StreamString ts;
5613
5614 const char *event_explanation = nullptr;
5615
5616 do {
5617 if (!event_sp) {
5618 event_explanation = "<no event>";
5619 break;
5620 } else if (event_sp->GetType() == eBroadcastBitInterrupt) {
5621 event_explanation = "<user interrupt>";
5622 break;
5623 } else {
5624 const Process::ProcessEventData *event_data =
5626 event_sp.get());
5627
5628 if (!event_data) {
5629 event_explanation = "<no event data>";
5630 break;
5631 }
5632
5633 Process *process = event_data->GetProcessSP().get();
5634
5635 if (!process) {
5636 event_explanation = "<no process>";
5637 break;
5638 }
5639
5640 ThreadList &thread_list = process->GetThreadList();
5641
5642 uint32_t num_threads = thread_list.GetSize();
5643 uint32_t thread_index;
5644
5645 ts.Printf("<%u threads> ", num_threads);
5646
5647 for (thread_index = 0; thread_index < num_threads; ++thread_index) {
5648 Thread *thread = thread_list.GetThreadAtIndex(thread_index).get();
5649
5650 if (!thread) {
5651 ts.Printf("<?> ");
5652 continue;
5653 }
5654
5655 ts.Printf("<0x%4.4" PRIx64 " ", thread->GetID());
5656 RegisterContext *register_context =
5657 thread->GetRegisterContext().get();
5658
5659 if (register_context)
5660 ts.Printf("[ip 0x%" PRIx64 "] ", register_context->GetPC());
5661 else
5662 ts.Printf("[ip unknown] ");
5663
5664 // Show the private stop info here, the public stop info will be
5665 // from the last natural stop.
5666 lldb::StopInfoSP stop_info_sp = thread->GetPrivateStopInfo();
5667 if (stop_info_sp) {
5668 const char *stop_desc = stop_info_sp->GetDescription();
5669 if (stop_desc)
5670 ts.PutCString(stop_desc);
5671 }
5672 ts.Printf(">");
5673 }
5674
5675 event_explanation = ts.GetData();
5676 }
5677 } while (false);
5678
5679 if (event_explanation)
5680 LLDB_LOGF(log,
5681 "Process::RunThreadPlan(): execution interrupted: %s %s",
5682 s.GetData(), event_explanation);
5683 else
5684 LLDB_LOGF(log, "Process::RunThreadPlan(): execution interrupted: %s",
5685 s.GetData());
5686 }
5687
5688 if (should_unwind) {
5689 LLDB_LOGF(log,
5690 "Process::RunThreadPlan: ExecutionInterrupted - "
5691 "discarding thread plans up to %p.",
5692 static_cast<void *>(thread_plan_sp.get()));
5693 thread->DiscardThreadPlansUpToPlan(thread_plan_sp);
5694 } else {
5695 LLDB_LOGF(log,
5696 "Process::RunThreadPlan: ExecutionInterrupted - for "
5697 "plan: %p not discarding.",
5698 static_cast<void *>(thread_plan_sp.get()));
5699 }
5700 } else if (return_value == eExpressionSetupError) {
5701 if (log)
5702 log->PutCString("Process::RunThreadPlan(): execution set up error.");
5703
5704 if (options.DoesUnwindOnError()) {
5705 thread->DiscardThreadPlansUpToPlan(thread_plan_sp);
5706 }
5707 } else {
5708 if (thread->IsThreadPlanDone(thread_plan_sp.get())) {
5709 if (log)
5710 log->PutCString("Process::RunThreadPlan(): thread plan is done");
5711 return_value = eExpressionCompleted;
5712 } else if (thread->WasThreadPlanDiscarded(thread_plan_sp.get())) {
5713 if (log)
5714 log->PutCString(
5715 "Process::RunThreadPlan(): thread plan was discarded");
5716 return_value = eExpressionDiscarded;
5717 } else {
5718 if (log)
5719 log->PutCString(
5720 "Process::RunThreadPlan(): thread plan stopped in mid course");
5721 if (options.DoesUnwindOnError() && thread_plan_sp) {
5722 if (log)
5723 log->PutCString("Process::RunThreadPlan(): discarding thread plan "
5724 "'cause unwind_on_error is set.");
5725 thread->DiscardThreadPlansUpToPlan(thread_plan_sp);
5726 }
5727 }
5728 }
5729
5730 // Thread we ran the function in may have gone away because we ran the
5731 // target Check that it's still there, and if it is put it back in the
5732 // context. Also restore the frame in the context if it is still present.
5733 thread = GetThreadList().FindThreadByIndexID(thread_idx_id, true).get();
5734 if (thread) {
5735 exe_ctx.SetFrameSP(thread->GetFrameWithStackID(ctx_frame_id));
5736 }
5737
5738 // Also restore the current process'es selected frame & thread, since this
5739 // function calling may be done behind the user's back.
5740
5741 if (selected_tid != LLDB_INVALID_THREAD_ID) {
5742 if (GetThreadList().SetSelectedThreadByIndexID(selected_tid) &&
5743 selected_stack_id.IsValid()) {
5744 // We were able to restore the selected thread, now restore the frame:
5745 std::lock_guard<std::recursive_mutex> guard(GetThreadList().GetMutex());
5746 StackFrameSP old_frame_sp =
5747 GetThreadList().GetSelectedThread()->GetFrameWithStackID(
5748 selected_stack_id);
5749 if (old_frame_sp)
5750 GetThreadList().GetSelectedThread()->SetSelectedFrame(
5751 old_frame_sp.get());
5752 }
5753 }
5754 }
5755
5756 // If the process exited during the run of the thread plan, notify everyone.
5757
5758 if (event_to_broadcast_sp) {
5759 if (log)
5760 log->PutCString("Process::RunThreadPlan(): rebroadcasting event.");
5761 BroadcastEvent(event_to_broadcast_sp);
5762 }
5763
5764 return return_value;
5765}
5766
5768 const StateType state = GetState();
5769 if (StateIsStoppedState(state, false)) {
5770 if (state == eStateExited) {
5771 int exit_status = GetExitStatus();
5772 const char *exit_description = GetExitDescription();
5773 strm.Printf("Process %" PRIu64 " exited with status = %i (0x%8.8x) %s\n",
5774 GetID(), exit_status, exit_status,
5775 exit_description ? exit_description : "");
5776 } else {
5777 if (state == eStateConnected)
5778 strm.Printf("Connected to remote target.\n");
5779 else
5780 strm.Printf("Process %" PRIu64 " %s\n", GetID(), StateAsCString(state));
5781 }
5782 } else {
5783 strm.Printf("Process %" PRIu64 " is running.\n", GetID());
5784 }
5785}
5786
5788 bool only_threads_with_stop_reason,
5789 uint32_t start_frame, uint32_t num_frames,
5790 uint32_t num_frames_with_source,
5791 bool stop_format) {
5792 size_t num_thread_infos_dumped = 0;
5793
5794 // You can't hold the thread list lock while calling Thread::GetStatus. That
5795 // very well might run code (e.g. if we need it to get return values or
5796 // arguments.) For that to work the process has to be able to acquire it.
5797 // So instead copy the thread ID's, and look them up one by one:
5798
5799 uint32_t num_threads;
5800 std::vector<lldb::tid_t> thread_id_array;
5801 // Scope for thread list locker;
5802 {
5803 std::lock_guard<std::recursive_mutex> guard(GetThreadList().GetMutex());
5804 ThreadList &curr_thread_list = GetThreadList();
5805 num_threads = curr_thread_list.GetSize();
5806 uint32_t idx;
5807 thread_id_array.resize(num_threads);
5808 for (idx = 0; idx < num_threads; ++idx)
5809 thread_id_array[idx] = curr_thread_list.GetThreadAtIndex(idx)->GetID();
5810 }
5811
5812 for (uint32_t i = 0; i < num_threads; i++) {
5813 ThreadSP thread_sp(GetThreadList().FindThreadByID(thread_id_array[i]));
5814 if (thread_sp) {
5815 if (only_threads_with_stop_reason) {
5816 StopInfoSP stop_info_sp = thread_sp->GetStopInfo();
5817 if (!stop_info_sp || !stop_info_sp->ShouldShow())
5818 continue;
5819 }
5820 thread_sp->GetStatus(strm, start_frame, num_frames,
5821 num_frames_with_source, stop_format,
5822 /*show_hidden*/ num_frames <= 1);
5823 ++num_thread_infos_dumped;
5824 } else {
5825 Log *log = GetLog(LLDBLog::Process);
5826 LLDB_LOGF(log, "Process::GetThreadStatus - thread 0x" PRIu64
5827 " vanished while running Thread::GetStatus.");
5828 }
5829 }
5830 return num_thread_infos_dumped;
5831}
5832
5834 m_memory_cache.AddInvalidRange(region.GetRangeBase(), region.GetByteSize());
5835}
5836
5838 return m_memory_cache.RemoveInvalidRange(region.GetRangeBase(),
5839 region.GetByteSize());
5840}
5841
5843 void *baton) {
5844 m_pre_resume_actions.push_back(PreResumeCallbackAndBaton(callback, baton));
5845}
5846
5848 bool result = true;
5849 while (!m_pre_resume_actions.empty()) {
5850 struct PreResumeCallbackAndBaton action = m_pre_resume_actions.back();
5851 m_pre_resume_actions.pop_back();
5852 bool this_result = action.callback(action.baton);
5853 if (result)
5854 result = this_result;
5855 }
5856 return result;
5857}
5858
5860
5862{
5863 PreResumeCallbackAndBaton element(callback, baton);
5864 auto found_iter = llvm::find(m_pre_resume_actions, element);
5865 if (found_iter != m_pre_resume_actions.end())
5866 {
5867 m_pre_resume_actions.erase(found_iter);
5868 }
5869}
5870
5876
5881
5883 // If we haven't started up the private state thread yet, then whatever thread
5884 // is fetching this event should be temporarily the private state thread.
5885 if (!m_private_state_thread.HasThread())
5886 return true;
5887 return m_private_state_thread.EqualsThread(Host::GetCurrentThread());
5888}
5889
5891 m_thread_list.Flush();
5892 m_extended_thread_list.Flush();
5894 m_queue_list.Clear();
5896}
5897
5899 if (uint32_t num_bits_setting = GetVirtualAddressableBits())
5900 return AddressableBits::AddressableBitToMask(num_bits_setting);
5901
5902 return m_code_address_mask;
5903}
5904
5906 if (uint32_t num_bits_setting = GetVirtualAddressableBits())
5907 return AddressableBits::AddressableBitToMask(num_bits_setting);
5908
5909 return m_data_address_mask;
5910}
5911
5920
5929
5932 "Setting Process code address mask to {0:x}", code_address_mask);
5933 m_code_address_mask = code_address_mask;
5934}
5935
5938 "Setting Process data address mask to {0:x}", data_address_mask);
5939 m_data_address_mask = data_address_mask;
5940}
5941
5944 "Setting Process highmem code address mask to {0:x}",
5945 code_address_mask);
5946 m_highmem_code_address_mask = code_address_mask;
5947}
5948
5951 "Setting Process highmem data address mask to {0:x}",
5952 data_address_mask);
5953 m_highmem_data_address_mask = data_address_mask;
5954}
5955
5957 if (ABISP abi_sp = GetABI())
5958 addr = abi_sp->FixCodeAddress(addr);
5959 return addr;
5960}
5961
5963 if (ABISP abi_sp = GetABI())
5964 addr = abi_sp->FixDataAddress(addr);
5965 return addr;
5966}
5967
5969 if (ABISP abi_sp = GetABI())
5970 addr = abi_sp->FixAnyAddress(addr);
5971 return addr;
5972}
5973
5975 Log *log = GetLog(LLDBLog::Process);
5976 LLDB_LOGF(log, "Process::%s()", __FUNCTION__);
5977
5978 Target &target = GetTarget();
5979 target.CleanupProcess();
5980 target.ClearModules(false);
5981 m_dynamic_checkers_up.reset();
5982 m_abi_sp.reset();
5983 m_system_runtime_up.reset();
5984 m_os_up.reset();
5985 m_dyld_up.reset();
5986 m_jit_loaders_up.reset();
5987 m_image_tokens.clear();
5988 // After an exec, the inferior is a new process and these memory regions are
5989 // no longer allocated.
5990 m_allocated_memory_cache.Clear(/*deallocte_memory=*/false);
5991 {
5992 std::lock_guard<std::recursive_mutex> guard(m_language_runtimes_mutex);
5993 m_language_runtimes.clear();
5994 }
5996 m_thread_list.DiscardThreadPlans();
5997 m_memory_cache.Clear(true);
5998 DoDidExec();
6000 // Flush the process (threads and all stack frames) after running
6001 // CompleteAttach() in case the dynamic loader loaded things in new
6002 // locations.
6003 Flush();
6004
6005 // After we figure out what was loaded/unloaded in CompleteAttach, we need to
6006 // let the target know so it can do any cleanup it needs to.
6007 target.DidExec();
6008}
6009
6011 if (address == nullptr) {
6012 error = Status::FromErrorString("Invalid address argument");
6013 return LLDB_INVALID_ADDRESS;
6014 }
6015
6016 addr_t function_addr = LLDB_INVALID_ADDRESS;
6017
6018 addr_t addr = address->GetLoadAddress(&GetTarget());
6019 std::map<addr_t, addr_t>::const_iterator iter =
6021 if (iter != m_resolved_indirect_addresses.end()) {
6022 function_addr = (*iter).second;
6023 } else {
6024 if (!CallVoidArgVoidPtrReturn(address, function_addr)) {
6025 Symbol *symbol = address->CalculateSymbolContextSymbol();
6027 "Unable to call resolver for indirect function %s",
6028 symbol ? symbol->GetName().AsCString() : "<UNKNOWN>");
6029 function_addr = LLDB_INVALID_ADDRESS;
6030 } else {
6031 if (ABISP abi_sp = GetABI())
6032 function_addr = abi_sp->FixCodeAddress(function_addr);
6034 std::pair<addr_t, addr_t>(addr, function_addr));
6035 }
6036 }
6037 return function_addr;
6038}
6039
6041 // Inform the system runtime of the modified modules.
6042 SystemRuntime *sys_runtime = GetSystemRuntime();
6043 if (sys_runtime)
6044 sys_runtime->ModulesDidLoad(module_list);
6045
6046 GetJITLoaders().ModulesDidLoad(module_list);
6047
6048 // Give the instrumentation runtimes a chance to be created before informing
6049 // them of the modified modules.
6052 for (auto &runtime : m_instrumentation_runtimes)
6053 runtime.second->ModulesDidLoad(module_list);
6054
6055 // Give the language runtimes a chance to be created before informing them of
6056 // the modified modules.
6057 for (const lldb::LanguageType lang_type : Language::GetSupportedLanguages()) {
6058 if (LanguageRuntime *runtime = GetLanguageRuntime(lang_type))
6059 runtime->ModulesDidLoad(module_list);
6060 }
6061
6062 // If we don't have an operating system plug-in, try to load one since
6063 // loading shared libraries might cause a new one to try and load
6064 if (!m_os_up)
6066
6067 // Inform the structured-data plugins of the modified modules.
6068 for (auto &pair : m_structured_data_plugin_map) {
6069 if (pair.second)
6070 pair.second->ModulesDidLoad(*this, module_list);
6071 }
6072}
6073
6076 return;
6077 if (!sc.module_sp || !sc.function || !sc.function->GetIsOptimized())
6078 return;
6079 sc.module_sp->ReportWarningOptimization(GetTarget().GetDebugger().GetID());
6080}
6081
6084 return;
6085 if (!sc.module_sp)
6086 return;
6087 LanguageType language = sc.GetLanguage();
6088 if (language == eLanguageTypeUnknown ||
6089 language == lldb::eLanguageTypeAssembly ||
6091 return;
6092 LanguageSet plugins =
6094 if (plugins[language])
6095 return;
6096 sc.module_sp->ReportWarningUnsupportedLanguage(
6097 language, GetTarget().GetDebugger().GetID());
6098}
6099
6101 info.Clear();
6102
6103 PlatformSP platform_sp = GetTarget().GetPlatform();
6104 if (!platform_sp)
6105 return false;
6106
6107 return platform_sp->GetProcessInfo(GetID(), info);
6108}
6109
6110lldb_private::UUID Process::FindModuleUUID(const llvm::StringRef path) {
6111 return lldb_private::UUID();
6112}
6113
6115 ThreadCollectionSP threads;
6116
6117 const MemoryHistorySP &memory_history =
6118 MemoryHistory::FindPlugin(shared_from_this());
6119
6120 if (!memory_history) {
6121 return threads;
6122 }
6123
6124 threads = std::make_shared<ThreadCollection>(
6125 memory_history->GetHistoryThreads(addr));
6126
6127 return threads;
6128}
6129
6132 InstrumentationRuntimeCollection::iterator pos;
6133 pos = m_instrumentation_runtimes.find(type);
6134 if (pos == m_instrumentation_runtimes.end()) {
6135 return InstrumentationRuntimeSP();
6136 } else
6137 return (*pos).second;
6138}
6139
6140bool Process::GetModuleSpec(const FileSpec &module_file_spec,
6141 const ArchSpec &arch, ModuleSpec &module_spec) {
6142 module_spec.Clear();
6143 return false;
6144}
6145
6147 m_image_tokens.push_back(image_ptr);
6148 return m_image_tokens.size() - 1;
6149}
6150
6152 if (token < m_image_tokens.size())
6153 return m_image_tokens[token];
6155}
6156
6157void Process::ResetImageToken(size_t token) {
6158 if (token < m_image_tokens.size())
6160}
6161
6162Address
6164 AddressRange range_bounds) {
6165 Target &target = GetTarget();
6166 DisassemblerSP disassembler_sp;
6167 InstructionList *insn_list = nullptr;
6168
6169 Address retval = default_stop_addr;
6170
6171 if (!target.GetUseFastStepping())
6172 return retval;
6173 if (!default_stop_addr.IsValid())
6174 return retval;
6175
6176 const char *plugin_name = nullptr;
6177 const char *flavor = nullptr;
6178 const char *cpu = nullptr;
6179 const char *features = nullptr;
6180 disassembler_sp = Disassembler::DisassembleRange(
6181 target.GetArchitecture(), plugin_name, flavor, cpu, features, GetTarget(),
6182 range_bounds);
6183 if (disassembler_sp)
6184 insn_list = &disassembler_sp->GetInstructionList();
6185
6186 if (insn_list == nullptr) {
6187 return retval;
6188 }
6189
6190 size_t insn_offset =
6191 insn_list->GetIndexOfInstructionAtAddress(default_stop_addr);
6192 if (insn_offset == UINT32_MAX) {
6193 return retval;
6194 }
6195
6196 uint32_t branch_index = insn_list->GetIndexOfNextBranchInstruction(
6197 insn_offset, false /* ignore_calls*/, nullptr);
6198 if (branch_index == UINT32_MAX) {
6199 return retval;
6200 }
6201
6202 if (branch_index > insn_offset) {
6203 Address next_branch_insn_address =
6204 insn_list->GetInstructionAtIndex(branch_index)->GetAddress();
6205 if (next_branch_insn_address.IsValid() &&
6206 range_bounds.ContainsFileAddress(next_branch_insn_address)) {
6207 retval = next_branch_insn_address;
6208 }
6209 }
6210
6211 return retval;
6212}
6213
6215 MemoryRegionInfo &range_info) {
6216 if (const lldb::ABISP &abi = GetABI())
6217 load_addr = abi->FixAnyAddress(load_addr);
6218 Status error = DoGetMemoryRegionInfo(load_addr, range_info);
6219 // Reject a region that does not contain the requested address.
6220 if (error.Success() && !range_info.GetRange().Contains(load_addr))
6221 error = Status::FromErrorString("Invalid memory region");
6222
6223 return error;
6224}
6225
6227 Status error;
6228
6229 lldb::addr_t range_end = 0;
6230 const lldb::ABISP &abi = GetABI();
6231
6232 region_list.clear();
6233 do {
6235 error = GetMemoryRegionInfo(range_end, region_info);
6236 // GetMemoryRegionInfo should only return an error if it is unimplemented.
6237 if (error.Fail()) {
6238 region_list.clear();
6239 break;
6240 }
6241
6242 // We only check the end address, not start and end, because we assume that
6243 // the start will not have non-address bits until the first unmappable
6244 // region. We will have exited the loop by that point because the previous
6245 // region, the last mappable region, will have non-address bits in its end
6246 // address.
6247 range_end = region_info.GetRange().GetRangeEnd();
6248 if (region_info.GetMapped() == MemoryRegionInfo::eYes) {
6249 region_list.push_back(std::move(region_info));
6250 }
6251 } while (
6252 // For a process with no non-address bits, all address bits
6253 // set means the end of memory.
6254 range_end != LLDB_INVALID_ADDRESS &&
6255 // If we have non-address bits and some are set then the end
6256 // is at or beyond the end of mappable memory.
6257 !(abi && (abi->FixAnyAddress(range_end) != range_end)));
6258
6259 return error;
6260}
6261
6262Status
6263Process::ConfigureStructuredData(llvm::StringRef type_name,
6264 const StructuredData::ObjectSP &config_sp) {
6265 // If you get this, the Process-derived class needs to implement a method to
6266 // enable an already-reported asynchronous structured data feature. See
6267 // ProcessGDBRemote for an example implementation over gdb-remote.
6268 return Status::FromErrorString("unimplemented");
6269}
6270
6272 const StructuredData::Array &supported_type_names) {
6273 Log *log = GetLog(LLDBLog::Process);
6274
6275 // Bail out early if there are no type names to map.
6276 if (supported_type_names.GetSize() == 0) {
6277 LLDB_LOG(log, "no structured data types supported");
6278 return;
6279 }
6280
6281 // These StringRefs are backed by the input parameter.
6282 std::set<llvm::StringRef> type_names;
6283
6284 LLDB_LOG(log,
6285 "the process supports the following async structured data types:");
6286
6287 supported_type_names.ForEach(
6288 [&type_names, &log](StructuredData::Object *object) {
6289 // There shouldn't be null objects in the array.
6290 if (!object)
6291 return false;
6292
6293 // All type names should be strings.
6294 const llvm::StringRef type_name = object->GetStringValue();
6295 if (type_name.empty())
6296 return false;
6297
6298 type_names.insert(type_name);
6299 LLDB_LOG(log, "- {0}", type_name);
6300 return true;
6301 });
6302
6303 // For each StructuredDataPlugin, if the plugin handles any of the types in
6304 // the supported_type_names, map that type name to that plugin. Stop when
6305 // we've consumed all the type names.
6306 // FIXME: should we return an error if there are type names nobody
6307 // supports?
6308 for (uint32_t plugin_index = 0; !type_names.empty(); plugin_index++) {
6309 auto create_instance =
6311 plugin_index);
6312 if (!create_instance)
6313 break;
6314
6315 // Create the plugin.
6316 StructuredDataPluginSP plugin_sp = (*create_instance)(*this);
6317 if (!plugin_sp) {
6318 // This plugin doesn't think it can work with the process. Move on to the
6319 // next.
6320 continue;
6321 }
6322
6323 // For any of the remaining type names, map any that this plugin supports.
6324 std::vector<llvm::StringRef> names_to_remove;
6325 for (llvm::StringRef type_name : type_names) {
6326 if (plugin_sp->SupportsStructuredDataType(type_name)) {
6328 std::make_pair(type_name, plugin_sp));
6329 names_to_remove.push_back(type_name);
6330 LLDB_LOG(log, "using plugin {0} for type name {1}",
6331 plugin_sp->GetPluginName(), type_name);
6332 }
6333 }
6334
6335 // Remove the type names that were consumed by this plugin.
6336 for (llvm::StringRef type_name : names_to_remove)
6337 type_names.erase(type_name);
6338 }
6339}
6340
6342 const StructuredData::ObjectSP object_sp) {
6343 // Nothing to do if there's no data.
6344 if (!object_sp)
6345 return false;
6346
6347 // The contract is this must be a dictionary, so we can look up the routing
6348 // key via the top-level 'type' string value within the dictionary.
6349 StructuredData::Dictionary *dictionary = object_sp->GetAsDictionary();
6350 if (!dictionary)
6351 return false;
6352
6353 // Grab the async structured type name (i.e. the feature/plugin name).
6354 llvm::StringRef type_name;
6355 if (!dictionary->GetValueForKeyAsString("type", type_name))
6356 return false;
6357
6358 // Check if there's a plugin registered for this type name.
6359 auto find_it = m_structured_data_plugin_map.find(type_name);
6360 if (find_it == m_structured_data_plugin_map.end()) {
6361 // We don't have a mapping for this structured data type.
6362 return false;
6363 }
6364
6365 // Route the structured data to the plugin.
6366 find_it->second->HandleArrivalOfStructuredData(*this, type_name, object_sp);
6367 return true;
6368}
6369
6371 // Default implementation does nothign.
6372 // No automatic signal filtering to speak of.
6373 return Status();
6374}
6375
6377 Platform *platform,
6378 llvm::function_ref<std::unique_ptr<UtilityFunction>()> factory) {
6379 if (platform != GetTarget().GetPlatform().get())
6380 return nullptr;
6381 llvm::call_once(m_dlopen_utility_func_flag_once,
6382 [&] { m_dlopen_utility_func_up = factory(); });
6383 return m_dlopen_utility_func_up.get();
6384}
6385
6386llvm::Expected<TraceSupportedResponse> Process::TraceSupported() {
6387 if (!IsLiveDebugSession())
6388 return llvm::createStringError(llvm::inconvertibleErrorCode(),
6389 "Can't trace a non-live process.");
6390 return llvm::make_error<UnimplementedError>();
6391}
6392
6394 addr_t &returned_func,
6395 bool trap_exceptions) {
6397 if (thread == nullptr || address == nullptr)
6398 return false;
6399
6401 options.SetStopOthers(true);
6402 options.SetUnwindOnError(true);
6403 options.SetIgnoreBreakpoints(true);
6404 options.SetTryAllThreads(true);
6405 options.SetDebug(false);
6407 options.SetTrapExceptions(trap_exceptions);
6408
6409 auto type_system_or_err =
6411 if (!type_system_or_err) {
6412 llvm::consumeError(type_system_or_err.takeError());
6413 return false;
6414 }
6415 auto ts = *type_system_or_err;
6416 if (!ts)
6417 return false;
6418 CompilerType void_ptr_type =
6421 *thread, *address, void_ptr_type, llvm::ArrayRef<addr_t>(), options));
6422 if (call_plan_sp) {
6423 DiagnosticManager diagnostics;
6424
6425 StackFrame *frame = thread->GetStackFrameAtIndex(0).get();
6426 if (frame) {
6427 ExecutionContext exe_ctx;
6428 frame->CalculateExecutionContext(exe_ctx);
6429 ExpressionResults result =
6430 RunThreadPlan(exe_ctx, call_plan_sp, options, diagnostics);
6431 if (result == eExpressionCompleted) {
6432 returned_func =
6433 call_plan_sp->GetReturnValueObject()->GetValueAsUnsigned(
6435
6436 if (GetAddressByteSize() == 4) {
6437 if (returned_func == UINT32_MAX)
6438 return false;
6439 } else if (GetAddressByteSize() == 8) {
6440 if (returned_func == UINT64_MAX)
6441 return false;
6442 }
6443 return true;
6444 }
6445 }
6446 }
6447
6448 return false;
6449}
6450
6451llvm::Expected<const MemoryTagManager *> Process::GetMemoryTagManager() {
6453 const MemoryTagManager *tag_manager =
6454 arch ? arch->GetMemoryTagManager() : nullptr;
6455 if (!arch || !tag_manager) {
6456 return llvm::createStringError(
6457 llvm::inconvertibleErrorCode(),
6458 "This architecture does not support memory tagging");
6459 }
6460
6461 if (!SupportsMemoryTagging()) {
6462 return llvm::createStringError(llvm::inconvertibleErrorCode(),
6463 "Process does not support memory tagging");
6464 }
6465
6466 return tag_manager;
6467}
6468
6469llvm::Expected<std::vector<lldb::addr_t>>
6471 llvm::Expected<const MemoryTagManager *> tag_manager_or_err =
6473 if (!tag_manager_or_err)
6474 return tag_manager_or_err.takeError();
6475
6476 const MemoryTagManager *tag_manager = *tag_manager_or_err;
6477 llvm::Expected<std::vector<uint8_t>> tag_data =
6478 DoReadMemoryTags(addr, len, tag_manager->GetAllocationTagType());
6479 if (!tag_data)
6480 return tag_data.takeError();
6481
6482 return tag_manager->UnpackTagsData(*tag_data,
6483 len / tag_manager->GetGranuleSize());
6484}
6485
6487 const std::vector<lldb::addr_t> &tags) {
6488 llvm::Expected<const MemoryTagManager *> tag_manager_or_err =
6490 if (!tag_manager_or_err)
6491 return Status::FromError(tag_manager_or_err.takeError());
6492
6493 const MemoryTagManager *tag_manager = *tag_manager_or_err;
6494 llvm::Expected<std::vector<uint8_t>> packed_tags =
6495 tag_manager->PackTags(tags);
6496 if (!packed_tags) {
6497 return Status::FromError(packed_tags.takeError());
6498 }
6499
6500 return DoWriteMemoryTags(addr, len, tag_manager->GetAllocationTagType(),
6501 *packed_tags);
6502}
6503
6504// Create a CoreFileMemoryRange from a MemoryRegionInfo
6507 const addr_t addr = region.GetRange().GetRangeBase();
6508 llvm::AddressRange range(addr, addr + region.GetRange().GetByteSize());
6509 return {range, region.GetLLDBPermissions()};
6510}
6511
6512// Add dirty pages to the core file ranges and return true if dirty pages
6513// were added. Return false if the dirty page information is not valid or in
6514// the region.
6515static bool AddDirtyPages(const MemoryRegionInfo &region,
6516 CoreFileMemoryRanges &ranges) {
6517 const auto &dirty_page_list = region.GetDirtyPageList();
6518 if (!dirty_page_list)
6519 return false;
6520 const uint32_t lldb_permissions = region.GetLLDBPermissions();
6521 const addr_t page_size = region.GetPageSize();
6522 if (page_size == 0)
6523 return false;
6524 llvm::AddressRange range(0, 0);
6525 for (addr_t page_addr : *dirty_page_list) {
6526 if (range.empty()) {
6527 // No range yet, initialize the range with the current dirty page.
6528 range = llvm::AddressRange(page_addr, page_addr + page_size);
6529 } else {
6530 if (range.end() == page_addr) {
6531 // Combine consective ranges.
6532 range = llvm::AddressRange(range.start(), page_addr + page_size);
6533 } else {
6534 // Add previous contiguous range and init the new range with the
6535 // current dirty page.
6536 ranges.Append(range.start(), range.size(), {range, lldb_permissions});
6537 range = llvm::AddressRange(page_addr, page_addr + page_size);
6538 }
6539 }
6540 }
6541 // The last range
6542 if (!range.empty())
6543 ranges.Append(range.start(), range.size(), {range, lldb_permissions});
6544 return true;
6545}
6546
6547// Given a region, add the region to \a ranges.
6548//
6549// Only add the region if it isn't empty and if it has some permissions.
6550// If \a try_dirty_pages is true, then try to add only the dirty pages for a
6551// given region. If the region has dirty page information, only dirty pages
6552// will be added to \a ranges, else the entire range will be added to \a
6553// ranges.
6554static void AddRegion(const MemoryRegionInfo &region, bool try_dirty_pages,
6555 CoreFileMemoryRanges &ranges) {
6556 // Don't add empty ranges.
6557 if (region.GetRange().GetByteSize() == 0)
6558 return;
6559 // Don't add ranges with no read permissions.
6560 if ((region.GetLLDBPermissions() & lldb::ePermissionsReadable) == 0)
6561 return;
6562 if (try_dirty_pages && AddDirtyPages(region, ranges))
6563 return;
6564
6565 ranges.Append(region.GetRange().GetRangeBase(),
6566 region.GetRange().GetByteSize(),
6568}
6569
6571 const SaveCoreOptions &options,
6572 CoreFileMemoryRanges &ranges,
6573 std::set<addr_t> &stack_ends) {
6574 DynamicLoader *dyld = process.GetDynamicLoader();
6575 if (!dyld)
6576 return;
6577
6578 std::vector<MemoryRegionInfo> dynamic_loader_mem_regions;
6579 std::function<bool(const lldb_private::Thread &)> save_thread_predicate =
6580 [&](const lldb_private::Thread &t) -> bool {
6581 return options.ShouldThreadBeSaved(t.GetID());
6582 };
6583 dyld->CalculateDynamicSaveCoreRanges(process, dynamic_loader_mem_regions,
6584 save_thread_predicate);
6585 for (const auto &region : dynamic_loader_mem_regions) {
6586 // The Dynamic Loader can give us regions that could include a truncated
6587 // stack
6588 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0)
6589 AddRegion(region, true, ranges);
6590 }
6591}
6592
6594 const SaveCoreOptions &core_options,
6595 const MemoryRegionInfos &regions,
6596 CoreFileMemoryRanges &ranges,
6597 std::set<addr_t> &stack_ends) {
6598 const bool try_dirty_pages = true;
6599
6600 // Before we take any dump, we want to save off the used portions of the
6601 // stacks and mark those memory regions as saved. This prevents us from saving
6602 // the unused portion of the stack below the stack pointer. Saving space on
6603 // the dump.
6604 for (lldb::ThreadSP thread_sp : process.GetThreadList().Threads()) {
6605 if (!thread_sp)
6606 continue;
6607 StackFrameSP frame_sp = thread_sp->GetStackFrameAtIndex(0);
6608 if (!frame_sp)
6609 continue;
6610 RegisterContextSP reg_ctx_sp = frame_sp->GetRegisterContext();
6611 if (!reg_ctx_sp)
6612 continue;
6613 const addr_t sp = reg_ctx_sp->GetSP();
6614 const size_t red_zone = process.GetABI()->GetRedZoneSize();
6616 if (process.GetMemoryRegionInfo(sp, sp_region).Success()) {
6617 const size_t stack_head = (sp - red_zone);
6618 const size_t stack_size = sp_region.GetRange().GetRangeEnd() - stack_head;
6619 // Even if the SaveCoreOption doesn't want us to save the stack
6620 // we still need to populate the stack_ends set so it doesn't get saved
6621 // off in other calls
6622 sp_region.GetRange().SetRangeBase(stack_head);
6623 sp_region.GetRange().SetByteSize(stack_size);
6624 const addr_t range_end = sp_region.GetRange().GetRangeEnd();
6625 stack_ends.insert(range_end);
6626 // This will return true if the threadlist the user specified is empty,
6627 // or contains the thread id from thread_sp.
6628 if (core_options.ShouldThreadBeSaved(thread_sp->GetID())) {
6629 AddRegion(sp_region, try_dirty_pages, ranges);
6630 }
6631 }
6632 }
6633}
6634
6635// Save all memory regions that are not empty or have at least some permissions
6636// for a full core file style.
6638 const MemoryRegionInfos &regions,
6639 CoreFileMemoryRanges &ranges,
6640 std::set<addr_t> &stack_ends) {
6641
6642 // Don't add only dirty pages, add full regions.
6643 const bool try_dirty_pages = false;
6644 for (const auto &region : regions)
6645 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0)
6646 AddRegion(region, try_dirty_pages, ranges);
6647}
6648
6649// Save only the dirty pages to the core file. Make sure the process has at
6650// least some dirty pages, as some OS versions don't support reporting what
6651// pages are dirty within an memory region. If no memory regions have dirty
6652// page information fall back to saving out all ranges with write permissions.
6654 const MemoryRegionInfos &regions,
6655 CoreFileMemoryRanges &ranges,
6656 std::set<addr_t> &stack_ends) {
6657
6658 // Iterate over the regions and find all dirty pages.
6659 bool have_dirty_page_info = false;
6660 for (const auto &region : regions) {
6661 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0 &&
6662 AddDirtyPages(region, ranges))
6663 have_dirty_page_info = true;
6664 }
6665
6666 if (!have_dirty_page_info) {
6667 // We didn't find support for reporting dirty pages from the process
6668 // plug-in so fall back to any region with write access permissions.
6669 const bool try_dirty_pages = false;
6670 for (const auto &region : regions)
6671 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0 &&
6672 region.GetWritable() == MemoryRegionInfo::eYes)
6673 AddRegion(region, try_dirty_pages, ranges);
6674 }
6675}
6676
6677// Save all thread stacks to the core file. Some OS versions support reporting
6678// when a memory region is stack related. We check on this information, but we
6679// also use the stack pointers of each thread and add those in case the OS
6680// doesn't support reporting stack memory. This function also attempts to only
6681// emit dirty pages from the stack if the memory regions support reporting
6682// dirty regions as this will make the core file smaller. If the process
6683// doesn't support dirty regions, then it will fall back to adding the full
6684// stack region.
6686 const MemoryRegionInfos &regions,
6687 CoreFileMemoryRanges &ranges,
6688 std::set<addr_t> &stack_ends) {
6689 const bool try_dirty_pages = true;
6690 // Some platforms support annotating the region information that tell us that
6691 // it comes from a thread stack. So look for those regions first.
6692
6693 for (const auto &region : regions) {
6694 // Save all the stack memory ranges not associated with a stack pointer.
6695 if (stack_ends.count(region.GetRange().GetRangeEnd()) == 0 &&
6696 region.IsStackMemory() == MemoryRegionInfo::eYes)
6697 AddRegion(region, try_dirty_pages, ranges);
6698 }
6699}
6700
6701// TODO: We should refactor CoreFileMemoryRanges to use the lldb range type, and
6702// then add an intersect method on it, or MemoryRegionInfo.
6704 const MemoryRegionInfo::RangeType &rhs) {
6705
6706 MemoryRegionInfo region_info;
6707 region_info.SetLLDBPermissions(lhs.GetLLDBPermissions());
6708 region_info.GetRange() = lhs.GetRange().Intersect(rhs);
6709
6710 return region_info;
6711}
6712
6714 const MemoryRegionInfos &regions,
6715 const SaveCoreOptions &options,
6716 CoreFileMemoryRanges &ranges) {
6717 const auto &option_ranges = options.GetCoreFileMemoryRanges();
6718 if (option_ranges.IsEmpty())
6719 return;
6720
6721 for (const auto &range : regions) {
6722 auto *entry = option_ranges.FindEntryThatIntersects(range.GetRange());
6723 if (entry) {
6724 if (*entry != range.GetRange()) {
6725 AddRegion(Intersect(range, *entry), true, ranges);
6726 } else {
6727 // If they match, add the range directly.
6728 AddRegion(range, true, ranges);
6729 }
6730 }
6731 }
6732}
6733
6735 CoreFileMemoryRanges &ranges) {
6737 Status err = GetMemoryRegions(regions);
6738 SaveCoreStyle core_style = options.GetStyle();
6739 if (err.Fail())
6740 return err;
6741 if (regions.empty())
6743 "failed to get any valid memory regions from the process");
6744 if (core_style == eSaveCoreUnspecified)
6746 "callers must set the core_style to something other than "
6747 "eSaveCoreUnspecified");
6748
6749 GetUserSpecifiedCoreFileSaveRanges(*this, regions, options, ranges);
6750
6751 std::set<addr_t> stack_ends;
6752 // For fully custom set ups, we don't want to even look at threads if there
6753 // are no threads specified.
6754 if (core_style != lldb::eSaveCoreCustomOnly ||
6755 options.HasSpecifiedThreads()) {
6756 SaveOffRegionsWithStackPointers(*this, options, regions, ranges,
6757 stack_ends);
6758 // Save off the dynamic loader sections, so if we are on an architecture
6759 // that supports Thread Locals, that we include those as well.
6760 SaveDynamicLoaderSections(*this, options, ranges, stack_ends);
6761 }
6762
6763 switch (core_style) {
6766 break;
6767
6768 case eSaveCoreFull:
6769 GetCoreFileSaveRangesFull(*this, regions, ranges, stack_ends);
6770 break;
6771
6772 case eSaveCoreDirtyOnly:
6773 GetCoreFileSaveRangesDirtyOnly(*this, regions, ranges, stack_ends);
6774 break;
6775
6776 case eSaveCoreStackOnly:
6777 GetCoreFileSaveRangesStackOnly(*this, regions, ranges, stack_ends);
6778 break;
6779 }
6780
6781 if (err.Fail())
6782 return err;
6783
6784 if (ranges.IsEmpty())
6786 "no valid address ranges found for core style");
6787
6788 return ranges.FinalizeCoreFileSaveRanges();
6789}
6790
6791std::vector<ThreadSP>
6793 std::vector<ThreadSP> thread_list;
6794 for (const lldb::ThreadSP &thread_sp : m_thread_list.Threads()) {
6795 if (core_options.ShouldThreadBeSaved(thread_sp->GetID())) {
6796 thread_list.push_back(thread_sp);
6797 }
6798 }
6799
6800 return thread_list;
6801}
6802
6804 uint32_t low_memory_addr_bits = bit_masks.GetLowmemAddressableBits();
6805 uint32_t high_memory_addr_bits = bit_masks.GetHighmemAddressableBits();
6806
6807 if (low_memory_addr_bits == 0 && high_memory_addr_bits == 0)
6808 return;
6809
6810 if (low_memory_addr_bits != 0) {
6811 addr_t low_addr_mask =
6812 AddressableBits::AddressableBitToMask(low_memory_addr_bits);
6813 SetCodeAddressMask(low_addr_mask);
6814 SetDataAddressMask(low_addr_mask);
6815 }
6816
6817 if (high_memory_addr_bits != 0) {
6818 addr_t high_addr_mask =
6819 AddressableBits::AddressableBitToMask(high_memory_addr_bits);
6820 SetHighmemCodeAddressMask(high_addr_mask);
6821 SetHighmemDataAddressMask(high_addr_mask);
6822 }
6823}
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:6637
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:4913
static void AddRegion(const MemoryRegionInfo &region, bool try_dirty_pages, CoreFileMemoryRanges &ranges)
Definition Process.cpp:6554
static void SaveDynamicLoaderSections(Process &process, const SaveCoreOptions &options, CoreFileMemoryRanges &ranges, std::set< addr_t > &stack_ends)
Definition Process.cpp:6570
static bool AddDirtyPages(const MemoryRegionInfo &region, CoreFileMemoryRanges &ranges)
Definition Process.cpp:6515
static MemoryRegionInfo Intersect(const MemoryRegionInfo &lhs, const MemoryRegionInfo::RangeType &rhs)
Definition Process.cpp:6703
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:6713
static void GetCoreFileSaveRangesDirtyOnly(Process &process, const MemoryRegionInfos &regions, CoreFileMemoryRanges &ranges, std::set< addr_t > &stack_ends)
Definition Process.cpp:6653
@ ePropertyExperimental
Definition Process.cpp:127
static Timeout< std::micro > GetExpressionTimeout(const EvaluateExpressionOptions &options, bool before_first_timeout)
Definition Process.cpp:4896
static microseconds GetOneThreadExpressionTimeout(const EvaluateExpressionOptions &options)
Definition Process.cpp:4876
static CoreFileMemoryRange CreateCoreFileMemoryRange(const MemoryRegionInfo &region)
Definition Process.cpp:6506
static void SaveOffRegionsWithStackPointers(Process &process, const SaveCoreOptions &core_options, const MemoryRegionInfos &regions, CoreFileMemoryRanges &ranges, std::set< addr_t > &stack_ends)
Definition Process.cpp:6593
static void GetCoreFileSaveRangesStackOnly(Process &process, const MemoryRegionInfos &regions, CoreFileMemoryRanges &ranges, std::set< addr_t > &stack_ends)
Definition Process.cpp:6685
#define LLDB_SCOPED_TIMER()
Definition Timer.h:83
void Run() override
Definition Process.cpp:4653
void SetIsRunning(bool running)
Definition Process.cpp:4645
void Cancel() override
Definition Process.cpp:4715
~IOHandlerProcessSTDIO() override=default
void GotEOF() override
Definition Process.cpp:4765
bool Interrupt() override
Definition Process.cpp:4738
NativeFile m_write_file
Definition Process.cpp:4770
IOHandlerProcessSTDIO(Process *process, int write_fd)
Definition Process.cpp:4634
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:676
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:723
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:930
lldb::StreamUP GetAsyncErrorStream()
TargetList & GetTargetList()
Get accessor for the target list.
Definition Debugger.h:193
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:195
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:365
static std::set< lldb::LanguageType > GetSupportedLanguages()
Definition Language.cpp:415
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:2930
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:2922
EventActionResult PerformAction(lldb::EventSP &event_sp) override
Definition Process.cpp:2865
AttachCompletionHandler(Process *process, uint32_t exec_count)
Definition Process.cpp:2854
static bool GetRestartedFromEvent(const Event *event_ptr)
Definition Process.cpp:4420
virtual bool ShouldStop(Event *event_ptr, bool &found_valid_stopinfo)
Definition Process.cpp:4193
static void AddRestartedReason(Event *event_ptr, const char *reason)
Definition Process.cpp:4457
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:4428
static lldb::ProcessSP GetProcessFromEvent(const Event *event_ptr)
Definition Process.cpp:4404
static void SetInterruptedInEvent(Event *event_ptr, bool new_value)
Definition Process.cpp:4474
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:4297
llvm::StringRef GetFlavor() const override
Definition Process.cpp:4189
static bool GetInterruptedFromEvent(const Event *event_ptr)
Definition Process.cpp:4465
const char * GetRestartedReasonAtIndex(size_t idx)
Definition Process.h:445
static bool SetUpdateStateOnRemoval(Event *event_ptr)
Definition Process.cpp:4482
static lldb::StateType GetStateFromEvent(const Event *event_ptr)
Definition Process.cpp:4412
lldb::StateType GetState() const
Definition Process.h:440
static const Process::ProcessEventData * GetEventDataFromEvent(const Event *event_ptr)
Definition Process.cpp:4393
static llvm::StringRef GetFlavorString()
Definition Process.cpp:4185
void DoOnRemoval(Event *event_ptr) override
Definition Process.cpp:4308
void Dump(Stream *s) const override
Definition Process.cpp:4380
A plug-in interface definition class for debugging a process.
Definition Process.h:357
virtual Status EnableBreakpointSite(BreakpointSite *bp_site)
Definition Process.h:2188
Status WillAttachToProcessWithName(const char *process_name, bool wait_for_launch)
Called before attaching to a process.
Definition Process.cpp:2945
virtual llvm::Expected< TraceSupportedResponse > TraceSupported()
Get the processor tracing type supported for this process.
Definition Process.cpp:6386
lldb::IOHandlerSP m_process_input_reader
Definition Process.h:3191
friend class ProcessProperties
Definition Process.h:2372
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:6376
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:3192
lldb::addr_t m_code_address_mask
Mask for code an data addresses.
Definition Process.h:3243
StopPointSiteList< lldb_private::BreakpointSite > & GetBreakpointSiteList()
Definition Process.cpp:1560
std::vector< lldb::addr_t > m_image_tokens
Definition Process.h:3174
bool PrivateStateThreadIsValid() const
Definition Process.h:2999
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:6157
lldb::JITLoaderListUP m_jit_loaders_up
Definition Process.h:3180
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:2447
void SetNextEventAction(Process::NextEventAction *next_event_action)
Definition Process.h:2976
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:3515
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:3176
void ControlPrivateStateThread(uint32_t signal)
Definition Process.cpp:3848
ThreadList & GetThreadList()
Definition Process.h:2253
void SetAddressableBitMasks(AddressableBits bit_masks)
Definition Process.cpp:6803
virtual DataExtractor GetAuxvData()
Definition Process.cpp:2834
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:4970
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:6082
lldb::StateType GetPrivateState()
Definition Process.cpp:1402
Status LaunchPrivate(ProcessLaunchInfo &launch_info, lldb::StateType &state, lldb::EventSP &event_sp)
Definition Process.cpp:2641
std::vector< std::string > m_profile_data
Definition Process.h:3200
bool m_can_interpret_function_calls
Definition Process.h:3256
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:3606
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:3197
bool RemoveInvalidMemoryRange(const LoadRange &region)
Definition Process.cpp:5837
uint32_t GetNextThreadIndexID(uint64_t thread_id)
Definition Process.cpp:1267
Status PrivateResume()
The "private" side of resuming a process.
Definition Process.cpp:3241
void SetDynamicCheckers(DynamicCheckerFunctions *dynamic_checkers)
Definition Process.cpp:1556
void SendAsyncInterrupt(Thread *thread=nullptr)
Send an async interrupt request.
Definition Process.cpp:3898
void AddInvalidMemoryRegion(const LoadRange &region)
Definition Process.cpp:5833
virtual void ModulesDidLoad(ModuleList &module_list)
Definition Process.cpp:6040
InstrumentationRuntimeCollection m_instrumentation_runtimes
Definition Process.h:3208
std::atomic< bool > m_destructing
Definition Process.h:3231
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:2899
int GetExitStatus()
Get the exit status for a process.
Definition Process.cpp:1008
OperatingSystem * GetOperatingSystem()
Definition Process.h:2398
Status WillAttachToProcessWithID(lldb::pid_t pid)
Called before attaching to a process.
Definition Process.cpp:2941
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:3264
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:3139
int64_t ReadSignedIntegerFromMemory(lldb::addr_t load_addr, size_t byte_size, int64_t fail_value, Status &error)
Definition Process.cpp:2249
Address AdvanceAddressToNextBranchInstruction(Address default_stop_addr, AddressRange range_bounds)
Find the next branch instruction to set a breakpoint on.
Definition Process.cpp:6163
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:2550
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:4563
lldb::addr_t FixDataAddress(lldb::addr_t pc)
Definition Process.cpp:5962
lldb::addr_t AllocateMemory(size_t size, uint32_t permissions, Status &error)
The public interface to allocating memory in the process.
Definition Process.cpp:2436
std::unique_ptr< NextEventAction > m_next_event_action_up
Definition Process.h:3209
void SetHighmemDataAddressMask(lldb::addr_t data_address_mask)
Definition Process.cpp:5949
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:1614
HostThread m_private_state_thread
Thread ID for the thread that watches internal state events.
Definition Process.h:3135
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:2165
size_t ReadScalarIntegerFromMemory(lldb::addr_t addr, uint32_t byte_size, bool is_signed, Scalar &scalar, Status &error)
Definition Process.cpp:2395
virtual Status Launch(ProcessLaunchInfo &launch_info)
Launch a new process.
Definition Process.cpp:2609
std::mutex m_run_thread_plan_lock
Definition Process.h:3259
static void SettingsInitialize()
Definition Process.cpp:4833
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:4547
void Flush()
Flush all data in the process.
Definition Process.cpp:5890
bool m_clear_thread_plans_on_stop
Definition Process.h:3249
ProcessRunLock m_public_run_lock
Definition Process.h:3211
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:2119
void ResumePrivateStateThread()
Definition Process.cpp:3833
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:6271
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:3190
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:2848
std::map< uint64_t, uint32_t > m_thread_id_to_index_id_map
Definition Process.h:3144
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:3133
uint32_t m_extended_thread_stop_id
The natural stop id when extended_thread_list was last updated.
Definition Process.h:3164
bool PreResumeActionCallback(void *)
Definition Process.h:2537
lldb::RunDirection m_base_direction
ThreadPlanBase run direction.
Definition Process.h:3163
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:2268
QueueList m_queue_list
The list of libdispatch queues at a given stop point.
Definition Process.h:3167
void ClearPreResumeAction(PreResumeActionCallback callback, void *baton)
Definition Process.cpp:5861
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:3210
void SetCanJIT(bool can_jit)
Sets whether executing JIT-compiled code in this process is possible.
Definition Process.cpp:2486
lldb::StateType GetStateChangedEventsPrivate(lldb::EventSP &event_sp, const Timeout< std::micro > &timeout)
Definition Process.cpp:973
void LoadOperatingSystemPlugin(bool flush)
Definition Process.cpp:2600
lldb::StructuredDataPluginSP GetStructuredDataPlugin(llvm::StringRef type_name) const
Returns the StructuredDataPlugin associated with a given type name, if there is one.
Definition Process.cpp:4555
lldb::DynamicLoaderUP m_dyld_up
Definition Process.h:3179
friend class ProcessEventData
Definition Process.h:361
void ResetExtendedCrashInfoDict()
Definition Process.h:2621
AddressRanges FindRangesInMemory(const uint8_t *buf, uint64_t size, const AddressRanges &ranges, size_t alignment, size_t max_matches, Status &error)
Definition Process.cpp:2005
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:6140
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:1719
virtual Status WriteObjectFile(std::vector< ObjectFile::LoadableData > entries)
Definition Process.cpp:2425
std::recursive_mutex m_stdio_communication_mutex
Definition Process.h:3194
@ eBroadcastInternalStateControlResume
Definition Process.h:386
@ eBroadcastInternalStateControlStop
Definition Process.h:384
@ eBroadcastInternalStateControlPause
Definition Process.h:385
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:3171
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:6451
~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:3099
std::recursive_mutex m_profile_data_comm_mutex
Definition Process.h:3199
lldb::InstrumentationRuntimeSP GetInstrumentationRuntime(lldb::InstrumentationRuntimeType type)
Definition Process.cpp:6131
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:5968
lldb::thread_result_t RunPrivateStateThread(bool is_secondary_thread)
Definition Process.cpp:4035
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:3199
void AppendSTDOUT(const char *s, size_t len)
Definition Process.cpp:4526
llvm::StringMap< lldb::StructuredDataPluginSP > m_structured_data_plugin_map
Definition Process.h:3260
virtual Status DisableBreakpointSite(BreakpointSite *bp_site)
Definition Process.h:2193
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:5787
void CalculateExecutionContext(ExecutionContext &exe_ctx) override
Reconstruct the object's execution context into sc.
Definition Process.cpp:4494
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
enum lldb_private::Process::@150350333335242132005356363062105110232161175371 m_can_jit
Event * PeekAtStateChangedEvents()
Definition Process.cpp:953
std::vector< Notifications > m_notifications
The list of notifications that this process can deliver.
Definition Process.h:3172
bool HasAssignedIndexIDToThread(uint64_t sb_thread_id)
Definition Process.cpp:1271
ThreadSafeValue< lldb::StateType > m_private_state
Definition Process.h:3125
size_t AddImageToken(lldb::addr_t image_ptr)
Definition Process.cpp:6146
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:1974
virtual bool DestroyRequiresHalt()
Definition Process.h:1229
lldb::EventSP CreateEventFromProcessState(uint32_t event_type)
Definition Process.cpp:4520
StructuredData::DictionarySP m_crash_info_dict_sp
A repository for extra crash information, consulted in GetExtendedCrashInformation.
Definition Process.h:3272
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:6734
lldb::TargetSP CalculateTarget() override
Definition Process.cpp:4492
void SetHighmemCodeAddressMask(lldb::addr_t code_address_mask)
Definition Process.cpp:5942
lldb::ByteOrder GetByteOrder() const
Definition Process.cpp:3616
Status Detach(bool keep_stopped)
Detaches from a running or stopped process.
Definition Process.cpp:3463
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:6470
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:5974
void SetCodeAddressMask(lldb::addr_t code_address_mask)
Definition Process.cpp:5930
AllocatedMemoryCache m_allocated_memory_cache
Definition Process.h:3203
virtual Status LoadCore()
Definition Process.cpp:2773
std::mutex m_exit_status_mutex
Mutex so m_exit_status m_exit_string can be safely accessed from multiple threads.
Definition Process.h:3147
Status Signal(int signal)
Sends a process a UNIX signal signal.
Definition Process.cpp:3596
void SetDynamicLoader(lldb::DynamicLoaderUP dyld)
Definition Process.cpp:2830
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:3156
std::recursive_mutex m_thread_mutex
Definition Process.h:3149
virtual Status ConfigureStructuredData(llvm::StringRef type_name, const StructuredData::ObjectSP &config_sp)
Configure asynchronous structured data feature.
Definition Process.cpp:6263
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:3213
bool StartPrivateStateThread(bool is_secondary_thread=false)
Definition Process.cpp:3778
void HandlePrivateEvent(lldb::EventSP &event_sp)
Definition Process.cpp:3910
void BroadcastAsyncProfileData(const std::string &one_profile_data)
Definition Process.cpp:4540
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:5871
virtual Status DoLoadCore()
Definition Process.h:634
Predicate< uint32_t > m_iohandler_sync
Definition Process.h:3201
LanguageRuntimeCollection m_language_runtimes
Should we detach if the process object goes away with an explicit call to Kill or Detach?
Definition Process.h:3206
virtual Status GetMemoryRegions(lldb_private::MemoryRegionInfos &region_list)
Obtain all the mapped memory regions within this process.
Definition Process.cpp:6226
size_t WriteMemoryPrivate(lldb::addr_t addr, const void *buf, size_t size, Status &error)
Definition Process.cpp:2280
void GetStatus(Stream &ostrm)
Definition Process.cpp:5767
void SetRunningUserExpression(bool on)
Definition Process.cpp:1471
bool IsPossibleDynamicValue(ValueObject &in_value)
Definition Process.cpp:1535
bool CurrentThreadPosesAsPrivateStateThread()
Definition Process.cpp:5882
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:3354
lldb::OperatingSystemUP m_os_up
Definition Process.h:3186
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:3189
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:3219
void SetDataAddressMask(lldb::addr_t data_address_mask)
Definition Process.cpp:5936
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:2238
llvm::once_flag m_dlopen_utility_func_flag_once
Definition Process.h:3265
virtual void UpdateQueueListIfNeeded()
Definition Process.cpp:1247
virtual Status UpdateAutomaticSignalFiltering()
Definition Process.cpp:6370
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:3254
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:2490
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:4533
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:3142
bool ProcessIOHandlerExists() const
Definition Process.h:3335
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:6341
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:2194
lldb::addr_t ReadPointerFromMemory(lldb::addr_t vm_addr, Status &error)
Definition Process.cpp:2260
Broadcaster m_private_state_control_broadcaster
Definition Process.h:3129
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:5912
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:3126
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:3150
ThreadSafeValue< lldb::StateType > m_public_state
Definition Process.h:3123
lldb::addr_t m_data_address_mask
Definition Process.h:3244
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:2495
virtual Status DisableWatchpoint(lldb::WatchpointSP wp_sp, bool notify=true)
Definition Process.cpp:2572
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:6010
lldb::StateType m_last_broadcast_state
Definition Process.h:3251
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:3137
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:2840
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:3168
void PrintWarningOptimization(const SymbolContext &sc)
Print a user-visible warning about a module being built with optimization.
Definition Process.cpp:6074
ProcessRunLock m_private_run_lock
Definition Process.h:3212
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:2919
static ProcessProperties & GetGlobalProperties()
Definition Process.cpp:530
lldb::addr_t m_highmem_code_address_mask
Definition Process.h:3245
lldb::addr_t GetImagePtrFromToken(size_t token) const
Definition Process.cpp:6151
int m_exit_status
The exit status of the process, or -1 if not set.
Definition Process.h:3145
std::vector< LanguageRuntime * > GetLanguageRuntimes()
Definition Process.cpp:1487
MemoryCache m_memory_cache
Definition Process.h:3202
static void STDIOReadThreadBytesReceived(void *baton, const void *src, size_t src_len)
Definition Process.cpp:4626
virtual bool GetProcessInfo(ProcessInstanceInfo &info)
Definition Process.cpp:6100
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:5956
lldb::StateType WaitForProcessStopPrivate(lldb::EventSP &event_sp, const Timeout< std::micro > &timeout)
Definition Process.cpp:2579
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:3055
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:3620
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:3246
virtual Status DoDestroy()=0
Status StopForDestroyOrDetach(lldb::EventSP &exit_event_sp)
Definition Process.cpp:3410
bool GetWatchpointReportedAfter()
Whether lldb will be notified about watchpoints after the instruction has completed executing,...
Definition Process.cpp:2504
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:3074
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:4607
size_t WriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size, Status &error)
Write memory to a process.
Definition Process.cpp:2296
virtual llvm::Expected< bool > SaveCore(llvm::StringRef outfile)
Save core dump into the specified file.
Definition Process.cpp:2836
bool ProcessIOHandlerIsActive()
Definition Process.cpp:4796
Status DestroyImpl(bool force_kill)
Definition Process.cpp:3523
bool m_force_next_event_delivery
Definition Process.h:3250
lldb::SystemRuntimeUP m_system_runtime_up
Definition Process.h:3187
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:3624
virtual DynamicLoader * GetDynamicLoader()
Get the dynamic loader plug-in for this process.
Definition Process.cpp:2824
std::string m_exit_string
A textual description of why a process exited.
Definition Process.h:3146
lldb::DynamicCheckerFunctionsUP m_dynamic_checkers_up
The functions used by the expression parser to validate data that expressions use.
Definition Process.h:3181
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:3005
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:4777
virtual Status Attach(ProcessAttachInfo &attach_info)
Attach to an existing process using the process attach info.
Definition Process.cpp:2950
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:5905
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:2457
virtual lldb_private::UUID FindModuleUUID(const llvm::StringRef path)
Definition Process.cpp:6110
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:3152
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:3611
void SetBaseDirection(lldb::RunDirection direction)
Set the base run direction for the process.
Definition Process.cpp:3234
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:6486
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:3121
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.
lldb::addr_t GetCodeAddressMask()
Get the current address mask in the Process.
Definition Process.cpp:5898
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:6214
friend class DynamicLoader
Definition Process.h:360
static void SettingsTerminate()
Definition Process.cpp:4835
lldb::addr_t GetHighmemDataAddressMask()
Definition Process.cpp:5921
ThreadList m_extended_thread_list
Constituent for extended threads that may be generated, cleared on natural stops.
Definition Process.h:3161
bool CallVoidArgVoidPtrReturn(const Address *address, lldb::addr_t &returned_func, bool trap_exceptions=false)
Definition Process.cpp:6393
bool CurrentThreadIsPrivateStateThread()
Definition Process.cpp:5877
void AddPreResumeAction(PreResumeActionCallback callback, void *baton)
Definition Process.cpp:5842
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:3308
lldb::pid_t m_pid
Definition Process.h:3122
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:2937
lldb::ModuleSP ReadModuleFromMemory(const FileSpec &file_spec, lldb::addr_t header_addr, size_t size_to_read=512)
Definition Process.cpp:2522
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:6792
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:2377
virtual size_t GetSTDOUT(char *buf, size_t buf_size, Status &error)
Get any available STDOUT.
Definition Process.cpp:4588
lldb::ThreadCollectionSP GetHistoryThreads(lldb::addr_t addr)
Definition Process.cpp:6114
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:3193
std::atomic< bool > m_finalizing
The tid of the thread that issued the async interrupt, used by thread plan timeout.
Definition Process.h:3226
std::recursive_mutex m_language_runtimes_mutex
Definition Process.h:3207
std::string m_stderr_data
Definition Process.h:3198
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:2566
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:776
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:802
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:4504
lldb::DynamicValueType GetPreferDynamicValue() const
Definition Target.cpp:4497
Module * GetExecutableModulePointer()
Definition Target.cpp:1533
Debugger & GetDebugger() const
Definition Target.h:1097
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:3821
void ClearAllLoadedSections()
Definition Target.cpp:3367
void ClearModules(bool delete_locations)
Definition Target.cpp:1555
Architecture * GetArchitecturePlugin() const
Definition Target.h:1095
TargetStats & GetStatistics()
Definition Target.h:1687
bool SetArchitecture(const ArchSpec &arch_spec, bool set_platform=false, bool merge=true)
Set the architecture for this target.
Definition Target.cpp:1697
llvm::Expected< lldb::TypeSystemSP > GetScratchTypeSystemForLanguage(lldb::LanguageType language, bool create_on_demand=true)
Definition Target.cpp:2606
lldb::ModuleSP GetExecutableModule()
Gets the module for the main executable.
Definition Target.cpp:1517
void DidExec()
Called as the last function in Process::DidExec().
Definition Target.cpp:1562
bool RunStopHooks(bool at_initial_stop=false)
Definition Target.cpp:3098
Status Install(ProcessLaunchInfo *launch_info)
Definition Target.cpp:3257
lldb::PlatformSP GetPlatform()
Definition Target.h:1510
const ArchSpec & GetArchitecture() const
Definition Target.h:1056
void SetExecutableModule(lldb::ModuleSP &module_sp, LoadDependentFiles load_dependent_files=eLoadDependentsDefault)
Set the main executable module.
Definition Target.cpp:1568
void SetPlatform(const lldb::PlatformSP &platform_sp)
Definition Target.h:1512
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:3379
"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