summaryrefslogtreecommitdiffstats
path: root/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
diff options
context:
space:
mode:
Diffstat (limited to 'source/Plugins/Process/gdb-remote/ProcessGDBRemote.h')
-rw-r--r--source/Plugins/Process/gdb-remote/ProcessGDBRemote.h243
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 &region_info) override;
+ Error
+ GetMemoryRegionInfo (lldb::addr_t load_addr, MemoryRegionInfo &region_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_
OpenPOWER on IntegriCloud