38 return "Scripted Process plug-in.";
46 llvm::ArrayRef<lldb::ScriptLanguage> supported_languages =
49 return llvm::is_contained(supported_languages, language);
63 auto process_sp = std::shared_ptr<ScriptedProcess>(
66 if (
error.Fail() || !process_sp || !process_sp->m_interface_up) {
75 bool plugin_specified_by_name) {
87 "ScriptedProcess::%s () - ERROR: %s", __FUNCTION__,
"Invalid target");
92 target_sp->GetDebugger().GetScriptInterpreter();
96 "ScriptedProcess::%s () - ERROR: %s", __FUNCTION__,
97 "Debugger has no Script Interpreter");
105 "ScriptedProcess::%s () - ERROR: %s", __FUNCTION__,
106 "Script interpreter couldn't create Scripted Process Interface");
118 llvm::consumeError(obj_or_err.takeError());
125 if (!object_sp || !object_sp->IsValid()) {
127 "ScriptedProcess::%s () - ERROR: %s", __FUNCTION__,
128 "Failed to create valid script object");
149 static llvm::once_flag g_once_flag;
151 llvm::call_once(g_once_flag, []() {
164 return DoLaunch(
nullptr, launch_info);
194 "{0} does not support reverse execution of processes",
GetPluginName());
234 if (!data_extractor_sp || !data_extractor_sp->GetByteSize() ||
error.Fail())
237 offset_t bytes_copied = data_extractor_sp->CopyByteOrderedData(
238 0, data_extractor_sp->GetByteSize(), buf, size,
GetByteOrder());
242 LLVM_PRETTY_FUNCTION,
"Failed to copy read memory to buffer.",
error);
255 if (!data_extractor_sp || !data_extractor_sp->GetByteSize())
263 LLVM_PRETTY_FUNCTION,
"Failed to copy write buffer to memory.",
error);
268 return bytes_written;
272 assert(bp_site !=
nullptr);
280 "Scripted Processes don't support hardware breakpoints");
296 if (
auto region_or_err =
298 region = *region_or_err;
307 while (
auto region_or_err =
314 address += range.GetRangeBase() + range.GetByteSize();
315 region_list.push_back(mem_region);
336 LLVM_PRETTY_FUNCTION,
337 "Couldn't fetch thread list from Scripted Process.",
error);
347 std::map<size_t, StructuredData::ObjectSP> sorted_threads;
348 auto sort_keys = [&sorted_threads,
353 llvm::StringRef key = item->GetStringValue();
357 if (!llvm::to_integer(key, idx))
360 sorted_threads[idx] = thread_info_sp->GetValueForKey(key);
364 size_t thread_count = thread_info_sp->GetSize();
366 if (!keys->ForEach(sort_keys) || sorted_threads.size() != thread_count)
369 LLVM_PRETTY_FUNCTION,
"Couldn't sort thread list.",
error);
371 auto create_scripted_thread =
372 [
this, &
error, &new_thread_list](
373 const std::pair<size_t, StructuredData::ObjectSP> pair) ->
bool {
374 size_t idx = pair.first;
379 LLVM_PRETTY_FUNCTION,
"Invalid thread info object",
error);
381 auto thread_or_error =
384 if (!thread_or_error)
386 LLVM_PRETTY_FUNCTION,
toString(thread_or_error.takeError()),
error);
388 ThreadSP thread_sp = thread_or_error.get();
389 lldbassert(thread_sp &&
"Couldn't initialize scripted thread.");
394 LLVM_PRETTY_FUNCTION,
395 llvm::Twine(
"Invalid Register Context for thread " + llvm::Twine(idx))
404 llvm::for_each(sorted_threads, create_scripted_thread);
406 return new_thread_list.
GetSize(
false) > 0;
421 const bool add_exe_file_as_first_arg =
false;
423 add_exe_file_as_first_arg);
431 auto error_with_message = [&
error](llvm::StringRef message) {
433 message.data(),
error);
438 if (!loaded_images_sp || !loaded_images_sp->GetSize())
440 LLVM_PRETTY_FUNCTION,
"No loaded images.",
error);
445 auto reload_image = [&target, &module_list, &error_with_message](
450 return error_with_message(
"Couldn't cast image object into dictionary.");
454 bool has_path = dict->
HasKey(
"path");
455 bool has_uuid = dict->
HasKey(
"uuid");
456 if (!has_path && !has_uuid)
457 return error_with_message(
"Dictionary should have key 'path' or 'uuid'");
458 if (!dict->
HasKey(
"load_addr"))
459 return error_with_message(
"Dictionary is missing key 'load_addr'");
461 llvm::StringRef path =
"";
467 llvm::StringRef uuid =
"";
478 return error_with_message(
479 "Couldn't get valid load address or slide offset.");
489 bool is_placeholder_module =
false;
495 "ScriptedProcess::%s unable to locate the matching "
496 "object file path %s, creating a placeholder module at 0x%" PRIx64,
497 __FUNCTION__, path.str().c_str(), load_addr);
502 is_placeholder_module =
true;
505 bool changed =
false;
506 module_sp->SetLoadAddress(target, load_addr,
false ,
509 if (!changed && !module_sp->GetObjectFile())
510 return error_with_message(
"Couldn't set the load address for module.");
513 module_sp->SetFileSpecAndObjectName(objfile, objfile.
GetFilename());
515 if (is_placeholder_module) {
523 size_t loaded_images_size = loaded_images_sp->GetSize();
524 bool print_error =
true;
525 for (
size_t idx = 0; idx < loaded_images_size; idx++) {
526 const auto &loaded_image = loaded_images_sp->GetItemAtIndex(idx);
527 if (!reload_image(loaded_image.get()) && print_error) {
530 LLVM_PRETTY_FUNCTION,
"Couldn't reload all images.",
error);
536 return loaded_images_sp;
543 if (!metadata_sp || !metadata_sp->GetSize())
545 LLVM_PRETTY_FUNCTION,
"No metadata.",
error);
553 if (
const char *queue_name = thread_sp->GetQueueName()) {
554 QueueSP queue_sp = std::make_shared<Queue>(
555 m_process->shared_from_this(), thread_sp->GetQueueID(), queue_name);
569 if (object_instance_sp &&
571 return object_instance_sp->GetAsGeneric()->GetValue();
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOGF(log,...)
#define LLDB_PLUGIN_DEFINE(PluginName)
static constexpr lldb::ScriptLanguage g_supported_script_languages[]
An architecture specification class.
Class that manages the actual breakpoint that will be inserted into the running program.
bool IsEnabled() const
Tells whether the current breakpoint site is enabled or not.
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
const ConstString & GetFilename() const
Filename string const get accessor.
void SetPath(llvm::StringRef p)
Temporary helper for FileSystem change.
size_t MemorySize() const
Get the memory cost of this object.
A collection class for Module objects.
bool AppendIfNeeded(const lldb::ModuleSP &new_module, bool notify=true)
Append a module to the module list, if it is not already there.
ArchSpec & GetArchitecture()
A class that describes an executable image and its associated object and symbol files.
static lldb::ModuleSP CreateModuleFromObjectFile(Args &&...args)
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, ABICreateInstance create_callback)
static bool UnregisterPlugin(ABICreateInstance create_callback)
void SetExecutableFile(const FileSpec &exe_file, bool add_exe_file_as_first_arg)
void SetArchitecture(const ArchSpec &arch)
void SetProcessID(lldb::pid_t pid)
lldb::pid_t GetID() const
Returns the pid of the process or LLDB_INVALID_PROCESS_ID if there is no known pid.
Process(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp)
Construct with a shared pointer to a target, and the Process listener.
QueueList m_queue_list
The list of libdispatch queues at a given stop point.
lldb::ByteOrder GetByteOrder() const
ThreadList::ThreadIterable Threads()
ThreadPlanStackMap m_thread_plans
This is the list of thread plans for threads in m_thread_list, as well as threads we knew existed,...
uint32_t GetAddressByteSize() const
void SetPrivateState(lldb::StateType state)
virtual void Finalize(bool destructing)
This object is about to be destroyed, do any necessary cleanup.
ThreadList m_thread_list
The threads for this process as the user will see them.
Target & GetTarget()
Get the target object pointer for this module.
virtual lldb::ScriptedProcessInterfaceUP CreateScriptedProcessInterface()
static Ret ErrorWithMessage(llvm::StringRef caller_name, llvm::StringRef error_msg, Status &error, LLDBLog log_category=LLDBLog::Process)
StructuredData::GenericSP GetScriptObjectInstance()
virtual lldb::DataExtractorSP ReadMemoryAtAddress(lldb::addr_t address, size_t size, Status &error)
virtual StructuredData::DictionarySP GetThreadsInfo()
virtual Status Attach(const ProcessAttachInfo &attach_info)
virtual lldb::pid_t GetProcessID()
virtual bool CreateBreakpoint(lldb::addr_t addr, Status &error)
virtual StructuredData::DictionarySP GetMetadata()
virtual StructuredData::ArraySP GetLoadedImages()
virtual lldb::offset_t WriteMemoryAtAddress(lldb::addr_t addr, lldb::DataExtractorSP data_sp, Status &error)
virtual llvm::Expected< StructuredData::GenericSP > CreatePluginObject(llvm::StringRef class_name, ExecutionContext &exe_ctx, StructuredData::DictionarySP args_sp, StructuredData::Generic *script_obj=nullptr)=0
Status DoAttachToProcessWithID(lldb::pid_t pid, const ProcessAttachInfo &attach_info) override
Attach to an existing process using a process ID.
void * GetImplementation() override
bool CanDebug(lldb::TargetSP target_sp, bool plugin_specified_by_name) override
Check if a plug-in instance can debug the file in module.
bool DoUpdateThreadList(ThreadList &old_thread_list, ThreadList &new_thread_list) override
Update the thread list following process plug-in's specific logic.
size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size, Status &error) override
Actually do the reading of memory from a process.
lldb_private::StructuredData::ObjectSP GetLoadedDynamicLibrariesInfos() override
const ScriptedMetadata m_scripted_metadata
void DidAttach(ArchSpec &process_arch) override
Called after attaching a process.
Status DoDestroy() override
static llvm::StringRef GetPluginNameStatic()
Status GetMemoryRegions(lldb_private::MemoryRegionInfos ®ion_list) override
Obtain all the mapped memory regions within this process.
static bool IsScriptLanguageSupported(lldb::ScriptLanguage language)
ArchSpec GetArchitecture()
bool IsAlive() override
Check if a process is still alive.
Status DoAttach(const ProcessAttachInfo &attach_info)
Status DoLoadCore() override
bool GetProcessInfo(ProcessInstanceInfo &info) override
void DidResume() override
Called after resuming a process.
Status DoLaunch(Module *exe_module, ProcessLaunchInfo &launch_info) override
Launch a new process.
size_t DoWriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size, Status &error) override
Actually do the writing of memory to a process.
void CheckScriptedInterface() const
Status DoResume(lldb::RunDirection direction) override
Resumes all of a process's threads as configured using the Thread run control functions.
ScriptedProcess(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, const ScriptedMetadata &scripted_metadata, Status &error)
lldb::ScriptedProcessInterfaceUP m_interface_up
llvm::StringRef GetPluginName() override
Status EnableBreakpointSite(BreakpointSite *bp_site) override
lldb_private::StructuredData::DictionarySP GetMetadata() override
Fetch process defined metadata.
Status DoAttachToProcessWithName(const char *process_name, const ProcessAttachInfo &attach_info) override
Attach to an existing process using a partial process name.
void RefreshStateAfterStop() override
Currently called as part of ShouldStop.
~ScriptedProcess() override
static lldb::ProcessSP CreateInstance(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, const FileSpec *crash_file_path, bool can_connect)
static llvm::StringRef GetPluginDescriptionStatic()
void UpdateQueueListIfNeeded() override
ScriptedProcessInterface & GetInterface() const
void DidLaunch() override
Called after launching a process.
Status DoGetMemoryRegionInfo(lldb::addr_t load_addr, MemoryRegionInfo &range_info) override
DoGetMemoryRegionInfo is called by GetMemoryRegionInfo after it has removed non address bits from loa...
static llvm::Expected< std::shared_ptr< ScriptedThread > > Create(ScriptedProcess &process, StructuredData::Generic *script_object=nullptr)
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
static Status static Status FromErrorStringWithFormatv(const char *format, Args &&...args)
virtual lldb::addr_t GetLoadAddress() const
bool HardwareRequired() const
bool GetValueForKeyAsInteger(llvm::StringRef key, IntType &result) const
bool GetValueForKeyAsString(llvm::StringRef key, llvm::StringRef &result) const
bool HasKey(llvm::StringRef key) const
Dictionary * GetAsDictionary()
std::shared_ptr< Generic > GenericSP
std::shared_ptr< Dictionary > DictionarySP
std::shared_ptr< Object > ObjectSP
std::shared_ptr< Array > ArraySP
const ProcessLaunchInfo & GetProcessLaunchInfo() const
void ModulesDidLoad(ModuleList &module_list)
lldb::ModuleSP GetOrCreateModule(const ModuleSpec &module_spec, bool notify, Status *error_ptr=nullptr)
Find a binary on the system and return its Module, or return an existing Module that is already in th...
lldb::ModuleSP GetExecutableModule()
Gets the module for the main executable.
const ModuleList & GetImages() const
Get accessor for the images for this process.
const ArchSpec & GetArchitecture() const
void AddThread(const lldb::ThreadSP &thread_sp)
uint32_t GetSize(bool can_update=true)
bool SetFromStringRef(llvm::StringRef str)
#define LLDB_INVALID_ADDRESS
#define LLDB_INVALID_OFFSET
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.
const char * toString(AppleArm64ExceptionClass EC)
ScriptLanguage
Script interpreter types.
std::shared_ptr< lldb_private::Queue > QueueSP
RunDirection
Execution directions.
std::shared_ptr< lldb_private::Thread > ThreadSP
@ eStateStopped
Process or thread is stopped and can be examined.
@ eStateRunning
Process or thread is running and can't be examined.
std::shared_ptr< lldb_private::Process > ProcessSP
std::shared_ptr< lldb_private::Listener > ListenerSP
std::shared_ptr< lldb_private::Target > TargetSP
@ eStructuredDataTypeGeneric
std::shared_ptr< lldb_private::RegisterContext > RegisterContextSP
std::shared_ptr< lldb_private::DataExtractor > DataExtractorSP
std::shared_ptr< lldb_private::Module > ModuleSP