diff options
Diffstat (limited to 'source/Plugins/Process/gdb-remote/ProcessGDBRemote.h')
-rw-r--r-- | source/Plugins/Process/gdb-remote/ProcessGDBRemote.h | 243 |
1 files changed, 150 insertions, 93 deletions
diff --git a/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h b/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h index e0c460a..0a5e4a8 100644 --- a/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h +++ b/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h @@ -34,29 +34,32 @@ #include "Utility/StringExtractor.h" #include "GDBRemoteRegisterContext.h" +namespace lldb_private { +namespace process_gdb_remote { + class ThreadGDBRemote; -class ProcessGDBRemote : public lldb_private::Process +class ProcessGDBRemote : public Process { public: //------------------------------------------------------------------ // Constructors and Destructors //------------------------------------------------------------------ static lldb::ProcessSP - CreateInstance (lldb_private::Target& target, - lldb_private::Listener &listener, - const lldb_private::FileSpec *crash_file_path); + CreateInstance (Target& target, + Listener &listener, + const FileSpec *crash_file_path); static void Initialize(); static void - DebuggerInitialize (lldb_private::Debugger &debugger); + DebuggerInitialize (Debugger &debugger); static void Terminate(); - static lldb_private::ConstString + static ConstString GetPluginNameStatic(); static const char * @@ -65,7 +68,7 @@ public: //------------------------------------------------------------------ // Constructors and Destructors //------------------------------------------------------------------ - ProcessGDBRemote(lldb_private::Target& target, lldb_private::Listener &listener); + ProcessGDBRemote(Target& target, Listener &listener); virtual ~ProcessGDBRemote(); @@ -73,149 +76,143 @@ public: //------------------------------------------------------------------ // Check if a given Process //------------------------------------------------------------------ - virtual bool - CanDebug (lldb_private::Target &target, - bool plugin_specified_by_name) override; + bool + CanDebug (Target &target, bool plugin_specified_by_name) override; - virtual lldb_private::CommandObject * + CommandObject * GetPluginCommandObject() override; //------------------------------------------------------------------ // Creating a new process, or attaching to an existing one //------------------------------------------------------------------ - virtual lldb_private::Error - WillLaunch (lldb_private::Module* module) override; + Error + WillLaunch (Module* module) override; - virtual lldb_private::Error - DoLaunch (lldb_private::Module *exe_module, - lldb_private::ProcessLaunchInfo &launch_info) override; + Error + DoLaunch (Module *exe_module, ProcessLaunchInfo &launch_info) override; - virtual void + void DidLaunch () override; - virtual lldb_private::Error + Error WillAttachToProcessWithID (lldb::pid_t pid) override; - virtual lldb_private::Error + Error WillAttachToProcessWithName (const char *process_name, bool wait_for_launch) override; - virtual lldb_private::Error - DoConnectRemote (lldb_private::Stream *strm, const char *remote_url) override; + Error + DoConnectRemote (Stream *strm, const char *remote_url) override; - lldb_private::Error + Error WillLaunchOrAttach (); - - virtual lldb_private::Error - DoAttachToProcessWithID (lldb::pid_t pid) override; - virtual lldb_private::Error - DoAttachToProcessWithID (lldb::pid_t pid, const lldb_private::ProcessAttachInfo &attach_info) override; + Error + DoAttachToProcessWithID (lldb::pid_t pid, const ProcessAttachInfo &attach_info) override; - virtual lldb_private::Error + Error DoAttachToProcessWithName (const char *process_name, - const lldb_private::ProcessAttachInfo &attach_info) override; + const ProcessAttachInfo &attach_info) override; - virtual void - DidAttach (lldb_private::ArchSpec &process_arch) override; + void + DidAttach (ArchSpec &process_arch) override; //------------------------------------------------------------------ // PluginInterface protocol //------------------------------------------------------------------ - virtual lldb_private::ConstString + ConstString GetPluginName() override; - virtual uint32_t + uint32_t GetPluginVersion() override; //------------------------------------------------------------------ // Process Control //------------------------------------------------------------------ - virtual lldb_private::Error + Error WillResume () override; - virtual lldb_private::Error + Error DoResume () override; - virtual lldb_private::Error + Error DoHalt (bool &caused_stop) override; - virtual lldb_private::Error + Error DoDetach (bool keep_stopped) override; - virtual bool + bool DetachRequiresHalt() override { return true; } - virtual lldb_private::Error + Error DoSignal (int signal) override; - virtual lldb_private::Error + Error DoDestroy () override; - virtual void + void RefreshStateAfterStop() override; //------------------------------------------------------------------ // Process Queries //------------------------------------------------------------------ - virtual bool + bool IsAlive () override; - virtual lldb::addr_t + lldb::addr_t GetImageInfoAddress() override; //------------------------------------------------------------------ // Process Memory //------------------------------------------------------------------ - virtual size_t - DoReadMemory (lldb::addr_t addr, void *buf, size_t size, lldb_private::Error &error) override; + size_t + DoReadMemory (lldb::addr_t addr, void *buf, size_t size, Error &error) override; - virtual size_t - DoWriteMemory (lldb::addr_t addr, const void *buf, size_t size, lldb_private::Error &error) override; + size_t + DoWriteMemory (lldb::addr_t addr, const void *buf, size_t size, Error &error) override; - virtual lldb::addr_t - DoAllocateMemory (size_t size, uint32_t permissions, lldb_private::Error &error) override; + lldb::addr_t + DoAllocateMemory (size_t size, uint32_t permissions, Error &error) override; - virtual lldb_private::Error - GetMemoryRegionInfo (lldb::addr_t load_addr, - lldb_private::MemoryRegionInfo ®ion_info) override; + Error + GetMemoryRegionInfo (lldb::addr_t load_addr, MemoryRegionInfo ®ion_info) override; - virtual lldb_private::Error + Error DoDeallocateMemory (lldb::addr_t ptr) override; //------------------------------------------------------------------ // Process STDIO //------------------------------------------------------------------ - virtual size_t - PutSTDIN (const char *buf, size_t buf_size, lldb_private::Error &error) override; + size_t + PutSTDIN (const char *buf, size_t buf_size, Error &error) override; //---------------------------------------------------------------------- // Process Breakpoints //---------------------------------------------------------------------- - virtual lldb_private::Error - EnableBreakpointSite (lldb_private::BreakpointSite *bp_site) override; + Error + EnableBreakpointSite (BreakpointSite *bp_site) override; - virtual lldb_private::Error - DisableBreakpointSite (lldb_private::BreakpointSite *bp_site) override; + Error + DisableBreakpointSite (BreakpointSite *bp_site) override; //---------------------------------------------------------------------- // Process Watchpoints //---------------------------------------------------------------------- - virtual lldb_private::Error - EnableWatchpoint (lldb_private::Watchpoint *wp, bool notify = true) override; + Error + EnableWatchpoint (Watchpoint *wp, bool notify = true) override; - virtual lldb_private::Error - DisableWatchpoint (lldb_private::Watchpoint *wp, bool notify = true) override; + Error + DisableWatchpoint (Watchpoint *wp, bool notify = true) override; - virtual lldb_private::Error + Error GetWatchpointSupportInfo (uint32_t &num) override; - virtual lldb_private::Error + Error GetWatchpointSupportInfo (uint32_t &num, bool& after) override; - virtual bool + bool StartNoticingNewThreads() override; - virtual bool + bool StopNoticingNewThreads() override; GDBRemoteCommunicationClient & @@ -224,23 +221,39 @@ public: return m_gdb_comm; } - virtual lldb_private::Error + Error SendEventData(const char *data) override; //---------------------------------------------------------------------- - // Override SetExitStatus so we can disconnect from the remote GDB server + // Override DidExit so we can disconnect from the remote GDB server //---------------------------------------------------------------------- - virtual bool - SetExitStatus (int exit_status, const char *cstr) override; + void + DidExit () override; void SetUserSpecifiedMaxMemoryTransferSize (uint64_t user_specified_max); + bool + GetModuleSpec(const FileSpec& module_file_spec, + const ArchSpec& arch, + ModuleSpec &module_spec) override; + + size_t + LoadModules() override; + + Error + GetFileLoadAddress(const FileSpec& file, bool& is_loaded, lldb::addr_t& load_addr) override; + + void + ModulesDidLoad (ModuleList &module_list) override; + protected: friend class ThreadGDBRemote; friend class GDBRemoteCommunicationClient; friend class GDBRemoteRegisterContext; + class GDBLoadedModuleInfoList; + //---------------------------------------------------------------------- // Accessors //---------------------------------------------------------------------- @@ -273,24 +286,24 @@ protected: void Clear ( ); - lldb_private::Flags & + Flags & GetFlags () { return m_flags; } - const lldb_private::Flags & + const Flags & GetFlags () const { return m_flags; } - virtual bool - UpdateThreadList (lldb_private::ThreadList &old_thread_list, - lldb_private::ThreadList &new_thread_list) override; + bool + UpdateThreadList (ThreadList &old_thread_list, + ThreadList &new_thread_list) override; - lldb_private::Error - LaunchAndConnectToDebugserver (const lldb_private::ProcessInfo &process_info); + Error + LaunchAndConnectToDebugserver (const ProcessInfo &process_info); void KillDebugserverProcess (); @@ -302,20 +315,23 @@ protected: SetLastStopPacket (const StringExtractorGDBRemote &response); bool - ParsePythonTargetDefinition(const lldb_private::FileSpec &target_definition_fspec); - - bool - ParseRegisters(lldb_private::ScriptInterpreterObject *registers_array); + ParsePythonTargetDefinition(const FileSpec &target_definition_fspec); const lldb::DataBufferSP GetAuxvData() override; - lldb_private::StructuredData::ObjectSP + StructuredData::ObjectSP GetExtendedInfoForThread (lldb::tid_t tid); void GetMaxMemorySize(); + bool + CalculateThreadStopInfo (ThreadGDBRemote *thread); + + size_t + UpdateThreadIDsFromStopReplyThreadsValue (std::string &value); + //------------------------------------------------------------------ /// Broadcaster event bits definitions. //------------------------------------------------------------------ @@ -326,19 +342,21 @@ protected: eBroadcastBitAsyncThreadDidExit = (1 << 2) }; - lldb_private::Flags m_flags; // Process specific flags (see eFlags enums) + Flags m_flags; // Process specific flags (see eFlags enums) GDBRemoteCommunicationClient m_gdb_comm; std::atomic<lldb::pid_t> m_debugserver_pid; - StringExtractorGDBRemote m_last_stop_packet; - lldb_private::Mutex m_last_stop_packet_mutex; + std::vector<StringExtractorGDBRemote> m_stop_packet_stack; // The stop packet stack replaces the last stop packet variable + Mutex m_last_stop_packet_mutex; GDBRemoteDynamicRegisterInfo m_register_info; - lldb_private::Broadcaster m_async_broadcaster; - lldb_private::HostThread m_async_thread; - lldb_private::Mutex m_async_thread_state_mutex; + Broadcaster m_async_broadcaster; + HostThread m_async_thread; + Mutex m_async_thread_state_mutex; typedef std::vector<lldb::tid_t> tid_collection; typedef std::vector< std::pair<lldb::tid_t,int> > tid_sig_collection; typedef std::map<lldb::addr_t, lldb::addr_t> MMapMap; + typedef std::map<uint32_t, std::string> ExpeditedRegisterMap; tid_collection m_thread_ids; // Thread IDs for all threads. This list gets updated after stopping + StructuredData::ObjectSP m_threads_info_sp; // Stop info for all threads if "jThreadsInfo" packet is supported tid_collection m_continue_c_tids; // 'c' for continue tid_sig_collection m_continue_C_tids; // 'C' for continue with signal tid_collection m_continue_s_tids; // 's' for step @@ -351,6 +369,10 @@ protected: bool m_destroy_tried_resuming; lldb::CommandObjectSP m_command_sp; int64_t m_breakpoint_pc_offset; + lldb::tid_t m_initial_tid; // The inital thread ID, given by stub on attach + + bool + HandleNotifyPacket(StringExtractorGDBRemote &packet); bool StartAsyncThread (); @@ -371,6 +393,27 @@ protected: lldb::StateType SetThreadStopInfo (StringExtractor& stop_packet); + lldb::StateType + SetThreadStopInfo (StructuredData::Dictionary *thread_dict); + + lldb::ThreadSP + SetThreadStopInfo (lldb::tid_t tid, + ExpeditedRegisterMap &expedited_register_map, + uint8_t signo, + const std::string &thread_name, + const std::string &reason, + const std::string &description, + uint32_t exc_type, + const std::vector<lldb::addr_t> &exc_data, + lldb::addr_t thread_dispatch_qaddr, + bool queue_vars_valid, + std::string &queue_name, + lldb::QueueKind queue_kind, + uint64_t queue_serial); + + void + HandleStopReplySequence (); + void ClearThreadIDList (); @@ -378,25 +421,36 @@ protected: UpdateThreadIDList (); void - DidLaunchOrAttach (lldb_private::ArchSpec& process_arch); + DidLaunchOrAttach (ArchSpec& process_arch); - lldb_private::Error + Error ConnectToDebugserver (const char *host_port); const char * GetDispatchQueueNameForThread (lldb::addr_t thread_dispatch_qaddr, std::string &dispatch_queue_name); - lldb_private::DynamicLoader * + DynamicLoader * GetDynamicLoader () override; + // Query remote GDBServer for register information + bool + GetGDBServerRegisterInfo (); + + // Query remote GDBServer for a detailed loaded library list + Error + GetLoadedModuleList (GDBLoadedModuleInfoList &); + + lldb::ModuleSP + LoadModuleAtAddress (const FileSpec &file, lldb::addr_t base_addr); + private: //------------------------------------------------------------------ // For ProcessGDBRemote only //------------------------------------------------------------------ static bool NewThreadNotifyBreakpointHit (void *baton, - lldb_private::StoppointCallbackContext *context, + StoppointCallbackContext *context, lldb::user_id_t break_id, lldb::user_id_t break_loc_id); @@ -404,4 +458,7 @@ private: }; +} // namespace process_gdb_remote +} // namespace lldb_private + #endif // liblldb_ProcessGDBRemote_h_ |