1 //===-- ScriptedProcess.h ------------------------------------- -*- C++ -*-===// 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 #ifndef LLDB_SOURCE_PLUGINS_SCRIPTED_PROCESS_H 10 #define LLDB_SOURCE_PLUGINS_SCRIPTED_PROCESS_H 11 12 #include "lldb/Target/Process.h" 13 #include "lldb/Utility/ConstString.h" 14 #include "lldb/Utility/ScriptedMetadata.h" 15 #include "lldb/Utility/State.h" 16 #include "lldb/Utility/Status.h" 17 18 #include "ScriptedThread.h" 19 20 #include <mutex> 21 22 namespace lldb_private { 23 class ScriptedProcess : public Process { 24 public: 25 static lldb::ProcessSP CreateInstance(lldb::TargetSP target_sp, 26 lldb::ListenerSP listener_sp, 27 const FileSpec *crash_file_path, 28 bool can_connect); 29 30 static void Initialize(); 31 32 static void Terminate(); 33 GetPluginNameStatic()34 static llvm::StringRef GetPluginNameStatic() { return "ScriptedProcess"; } 35 36 static llvm::StringRef GetPluginDescriptionStatic(); 37 38 ~ScriptedProcess() override; 39 40 bool CanDebug(lldb::TargetSP target_sp, 41 bool plugin_specified_by_name) override; 42 GetDynamicLoader()43 DynamicLoader *GetDynamicLoader() override { return nullptr; } 44 GetPluginName()45 llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 46 47 Status DoLoadCore() override; 48 49 Status DoLaunch(Module *exe_module, ProcessLaunchInfo &launch_info) override; 50 51 void DidLaunch() override; 52 53 void DidResume() override; 54 55 Status DoResume() override; 56 57 Status DoAttachToProcessWithID(lldb::pid_t pid, 58 const ProcessAttachInfo &attach_info) override; 59 60 Status 61 DoAttachToProcessWithName(const char *process_name, 62 const ProcessAttachInfo &attach_info) override; 63 64 void DidAttach(ArchSpec &process_arch) override; 65 66 Status DoDestroy() override; 67 68 void RefreshStateAfterStop() override; 69 70 bool IsAlive() override; 71 72 size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size, 73 Status &error) override; 74 75 size_t DoWriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size, 76 Status &error) override; 77 78 Status EnableBreakpointSite(BreakpointSite *bp_site) override; 79 80 ArchSpec GetArchitecture(); 81 82 Status 83 GetMemoryRegions(lldb_private::MemoryRegionInfos ®ion_list) override; 84 85 bool GetProcessInfo(ProcessInstanceInfo &info) override; 86 87 lldb_private::StructuredData::ObjectSP 88 GetLoadedDynamicLibrariesInfos() override; 89 90 lldb_private::StructuredData::DictionarySP GetMetadata() override; 91 92 void UpdateQueueListIfNeeded() override; 93 94 void *GetImplementation() override; 95 ForceScriptedState(lldb::StateType state)96 void ForceScriptedState(lldb::StateType state) override { 97 // If we're about to stop, we should fetch the loaded dynamic libraries 98 // dictionary before emitting the private stop event to avoid having the 99 // module loading happen while the process state is changing. 100 if (StateIsStoppedState(state, true)) 101 GetLoadedDynamicLibrariesInfos(); 102 SetPrivateState(state); 103 } 104 105 protected: 106 ScriptedProcess(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, 107 const ScriptedMetadata &scripted_metadata, Status &error); 108 109 void Clear(); 110 111 bool DoUpdateThreadList(ThreadList &old_thread_list, 112 ThreadList &new_thread_list) override; 113 114 Status DoGetMemoryRegionInfo(lldb::addr_t load_addr, 115 MemoryRegionInfo &range_info) override; 116 117 Status DoAttach(const ProcessAttachInfo &attach_info); 118 119 private: 120 friend class ScriptedThread; 121 CheckScriptedInterface()122 inline void CheckScriptedInterface() const { 123 lldbassert(m_interface_up && "Invalid scripted process interface."); 124 } 125 126 ScriptedProcessInterface &GetInterface() const; 127 static bool IsScriptLanguageSupported(lldb::ScriptLanguage language); 128 129 // Member variables. 130 const ScriptedMetadata m_scripted_metadata; 131 lldb::ScriptedProcessInterfaceUP m_interface_up; 132 }; 133 134 } // namespace lldb_private 135 136 #endif // LLDB_SOURCE_PLUGINS_SCRIPTED_PROCESS_H 137