llvm-capstone/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.h
Vince Harron 4a8abd3f94 Fix TestProcessIO.py when run against a remote target
Fixed test case to copy redirected stdout/stderr files from remote
target to host

llgs wasn't bothering to put the pty master file handle in the right
place if stdout/stderr were redirected to a file. It is still needed
for stdin.

Corrected some log message text

llvm-svn: 229141
2015-02-13 19:15:24 +00:00

297 lines
8.7 KiB
C++

//===-- GDBRemoteCommunicationServerLLGS.h ----------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef liblldb_GDBRemoteCommunicationServerLLGS_h_
#define liblldb_GDBRemoteCommunicationServerLLGS_h_
// C Includes
// C++ Includes
#include <unordered_map>
// Other libraries and framework includes
#include "lldb/lldb-private-forward.h"
#include "lldb/Core/Communication.h"
#include "lldb/Host/Mutex.h"
#include "lldb/Host/common/NativeProcessProtocol.h"
// Project includes
#include "GDBRemoteCommunicationServerCommon.h"
class ProcessGDBRemote;
class StringExtractorGDBRemote;
class GDBRemoteCommunicationServerLLGS :
public GDBRemoteCommunicationServerCommon,
public lldb_private::NativeProcessProtocol::NativeDelegate
{
public:
//------------------------------------------------------------------
// Constructors and Destructors
//------------------------------------------------------------------
GDBRemoteCommunicationServerLLGS(const lldb::PlatformSP& platform_sp,
lldb::DebuggerSP& debugger_sp);
virtual
~GDBRemoteCommunicationServerLLGS();
//------------------------------------------------------------------
/// Specify the program to launch and its arguments.
///
/// @param[in] args
/// The command line to launch.
///
/// @param[in] argc
/// The number of elements in the args array of cstring pointers.
///
/// @return
/// An Error object indicating the success or failure of making
/// the setting.
//------------------------------------------------------------------
lldb_private::Error
SetLaunchArguments (const char *const args[], int argc);
//------------------------------------------------------------------
/// Specify the launch flags for the process.
///
/// @param[in] launch_flags
/// The launch flags to use when launching this process.
///
/// @return
/// An Error object indicating the success or failure of making
/// the setting.
//------------------------------------------------------------------
lldb_private::Error
SetLaunchFlags (unsigned int launch_flags);
//------------------------------------------------------------------
/// Launch a process with the current launch settings.
///
/// This method supports running an lldb-gdbserver or similar
/// server in a situation where the startup code has been provided
/// with all the information for a child process to be launched.
///
/// @return
/// An Error object indicating the success or failure of the
/// launch.
//------------------------------------------------------------------
lldb_private::Error
LaunchProcess () override;
//------------------------------------------------------------------
/// Attach to a process.
///
/// This method supports attaching llgs to a process accessible via the
/// configured Platform.
///
/// @return
/// An Error object indicating the success or failure of the
/// attach operation.
//------------------------------------------------------------------
lldb_private::Error
AttachToProcess (lldb::pid_t pid);
//------------------------------------------------------------------
// NativeProcessProtocol::NativeDelegate overrides
//------------------------------------------------------------------
void
InitializeDelegate (lldb_private::NativeProcessProtocol *process) override;
void
ProcessStateChanged (lldb_private::NativeProcessProtocol *process, lldb::StateType state) override;
void
DidExec (lldb_private::NativeProcessProtocol *process) override;
protected:
lldb::PlatformSP m_platform_sp;
lldb::thread_t m_async_thread;
lldb::tid_t m_current_tid;
lldb::tid_t m_continue_tid;
lldb_private::Mutex m_debugged_process_mutex;
lldb_private::NativeProcessProtocolSP m_debugged_process_sp;
lldb::DebuggerSP m_debugger_sp;
Communication m_stdio_communication;
lldb::StateType m_inferior_prev_state;
lldb::DataBufferSP m_active_auxv_buffer_sp;
lldb_private::Mutex m_saved_registers_mutex;
std::unordered_map<uint32_t, lldb::DataBufferSP> m_saved_registers_map;
uint32_t m_next_saved_registers_id;
PacketResult
SendONotification (const char *buffer, uint32_t len);
PacketResult
SendWResponse (lldb_private::NativeProcessProtocol *process);
PacketResult
SendStopReplyPacketForThread (lldb::tid_t tid);
PacketResult
SendStopReasonForState (lldb::StateType process_state, bool flush_on_exit);
PacketResult
Handle_k (StringExtractorGDBRemote &packet);
PacketResult
Handle_qProcessInfo (StringExtractorGDBRemote &packet);
PacketResult
Handle_qC (StringExtractorGDBRemote &packet);
PacketResult
Handle_QSetDisableASLR (StringExtractorGDBRemote &packet);
PacketResult
Handle_QSetWorkingDir (StringExtractorGDBRemote &packet);
PacketResult
Handle_qGetWorkingDir (StringExtractorGDBRemote &packet);
PacketResult
Handle_C (StringExtractorGDBRemote &packet);
PacketResult
Handle_c (StringExtractorGDBRemote &packet);
PacketResult
Handle_vCont (StringExtractorGDBRemote &packet);
PacketResult
Handle_vCont_actions (StringExtractorGDBRemote &packet);
PacketResult
Handle_stop_reason (StringExtractorGDBRemote &packet);
PacketResult
Handle_qRegisterInfo (StringExtractorGDBRemote &packet);
PacketResult
Handle_qfThreadInfo (StringExtractorGDBRemote &packet);
PacketResult
Handle_qsThreadInfo (StringExtractorGDBRemote &packet);
PacketResult
Handle_p (StringExtractorGDBRemote &packet);
PacketResult
Handle_P (StringExtractorGDBRemote &packet);
PacketResult
Handle_H (StringExtractorGDBRemote &packet);
PacketResult
Handle_I (StringExtractorGDBRemote &packet);
PacketResult
Handle_interrupt (StringExtractorGDBRemote &packet);
PacketResult
Handle_m (StringExtractorGDBRemote &packet);
PacketResult
Handle_M (StringExtractorGDBRemote &packet);
PacketResult
Handle_qMemoryRegionInfoSupported (StringExtractorGDBRemote &packet);
PacketResult
Handle_qMemoryRegionInfo (StringExtractorGDBRemote &packet);
PacketResult
Handle_Z (StringExtractorGDBRemote &packet);
PacketResult
Handle_z (StringExtractorGDBRemote &packet);
PacketResult
Handle_s (StringExtractorGDBRemote &packet);
PacketResult
Handle_qXfer_auxv_read (StringExtractorGDBRemote &packet);
PacketResult
Handle_QSaveRegisterState (StringExtractorGDBRemote &packet);
PacketResult
Handle_QRestoreRegisterState (StringExtractorGDBRemote &packet);
PacketResult
Handle_vAttach (StringExtractorGDBRemote &packet);
PacketResult
Handle_D (StringExtractorGDBRemote &packet);
PacketResult
Handle_qThreadStopInfo (StringExtractorGDBRemote &packet);
PacketResult
Handle_qWatchpointSupportInfo (StringExtractorGDBRemote &packet);
void
SetCurrentThreadID (lldb::tid_t tid);
lldb::tid_t
GetCurrentThreadID () const;
void
SetContinueThreadID (lldb::tid_t tid);
lldb::tid_t
GetContinueThreadID () const { return m_continue_tid; }
lldb_private::Error
SetSTDIOFileDescriptor (int fd);
static void
STDIOReadThreadBytesReceived (void *baton, const void *src, size_t src_len);
private:
bool
DebuggedProcessReaped (lldb::pid_t pid);
static bool
ReapDebuggedProcess (void *callback_baton,
lldb::pid_t pid,
bool exited,
int signal,
int status);
void
HandleInferiorState_Exited (lldb_private::NativeProcessProtocol *process);
void
HandleInferiorState_Stopped (lldb_private::NativeProcessProtocol *process);
void
FlushInferiorOutput ();
lldb_private::NativeThreadProtocolSP
GetThreadFromSuffix (StringExtractorGDBRemote &packet);
uint32_t
GetNextSavedRegistersID ();
void
MaybeCloseInferiorTerminalConnection ();
void
ClearProcessSpecificData ();
void
RegisterPacketHandlers ();
//------------------------------------------------------------------
// For GDBRemoteCommunicationServerLLGS only
//------------------------------------------------------------------
DISALLOW_COPY_AND_ASSIGN (GDBRemoteCommunicationServerLLGS);
};
#endif // liblldb_GDBRemoteCommunicationServerLLGS_h_