Home | History | Annotate | Download | only in MacOSX-Kernel
      1 //===-- ProcessKDP.h --------------------------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #ifndef liblldb_ProcessKDP_h_
     11 #define liblldb_ProcessKDP_h_
     12 
     13 // C Includes
     14 
     15 // C++ Includes
     16 #include <list>
     17 #include <vector>
     18 
     19 // Other libraries and framework includes
     20 #include "lldb/Core/ArchSpec.h"
     21 #include "lldb/Core/Broadcaster.h"
     22 #include "lldb/Core/ConstString.h"
     23 #include "lldb/Core/Error.h"
     24 #include "lldb/Core/InputReader.h"
     25 #include "lldb/Core/StreamString.h"
     26 #include "lldb/Core/StringList.h"
     27 #include "lldb/Core/ThreadSafeValue.h"
     28 #include "lldb/Target/Process.h"
     29 #include "lldb/Target/Thread.h"
     30 
     31 #include "CommunicationKDP.h"
     32 #include "Utility/StringExtractor.h"
     33 
     34 class ThreadKDP;
     35 
     36 class ProcessKDP : public lldb_private::Process
     37 {
     38 public:
     39     //------------------------------------------------------------------
     40     // Constructors and Destructors
     41     //------------------------------------------------------------------
     42     static lldb::ProcessSP
     43     CreateInstance (lldb_private::Target& target,
     44                     lldb_private::Listener &listener,
     45                     const lldb_private::FileSpec *crash_file_path);
     46 
     47     static void
     48     Initialize();
     49 
     50     static void
     51     DebuggerInitialize (lldb_private::Debugger &debugger);
     52 
     53     static void
     54     Terminate();
     55 
     56     static lldb_private::ConstString
     57     GetPluginNameStatic();
     58 
     59     static const char *
     60     GetPluginDescriptionStatic();
     61 
     62     //------------------------------------------------------------------
     63     // Constructors and Destructors
     64     //------------------------------------------------------------------
     65     ProcessKDP(lldb_private::Target& target, lldb_private::Listener &listener);
     66 
     67     virtual
     68     ~ProcessKDP();
     69 
     70     //------------------------------------------------------------------
     71     // Check if a given Process
     72     //------------------------------------------------------------------
     73     virtual bool
     74     CanDebug (lldb_private::Target &target,
     75               bool plugin_specified_by_name);
     76 
     77     virtual lldb_private::CommandObject *
     78     GetPluginCommandObject();
     79 
     80     //------------------------------------------------------------------
     81     // Creating a new process, or attaching to an existing one
     82     //------------------------------------------------------------------
     83     virtual lldb_private::Error
     84     WillLaunch (lldb_private::Module* module);
     85 
     86     virtual lldb_private::Error
     87     DoLaunch (lldb_private::Module *exe_module,
     88               const lldb_private::ProcessLaunchInfo &launch_info);
     89 
     90     virtual lldb_private::Error
     91     WillAttachToProcessWithID (lldb::pid_t pid);
     92 
     93     virtual lldb_private::Error
     94     WillAttachToProcessWithName (const char *process_name, bool wait_for_launch);
     95 
     96     virtual lldb_private::Error
     97     DoConnectRemote (lldb_private::Stream *strm, const char *remote_url);
     98 
     99     virtual lldb_private::Error
    100     DoAttachToProcessWithID (lldb::pid_t pid);
    101 
    102     virtual lldb_private::Error
    103     DoAttachToProcessWithID (lldb::pid_t pid, const lldb_private::ProcessAttachInfo &attach_info);
    104 
    105     virtual lldb_private::Error
    106     DoAttachToProcessWithName (const char *process_name, bool wait_for_launch, const lldb_private::ProcessAttachInfo &attach_info);
    107 
    108     virtual void
    109     DidAttach ();
    110 
    111     lldb::addr_t
    112     GetImageInfoAddress();
    113 
    114     lldb_private::DynamicLoader *
    115     GetDynamicLoader ();
    116 
    117     //------------------------------------------------------------------
    118     // PluginInterface protocol
    119     //------------------------------------------------------------------
    120     virtual lldb_private::ConstString
    121     GetPluginName();
    122 
    123     virtual uint32_t
    124     GetPluginVersion();
    125 
    126     //------------------------------------------------------------------
    127     // Process Control
    128     //------------------------------------------------------------------
    129     virtual lldb_private::Error
    130     WillResume ();
    131 
    132     virtual lldb_private::Error
    133     DoResume ();
    134 
    135     virtual lldb_private::Error
    136     DoHalt (bool &caused_stop);
    137 
    138     virtual lldb_private::Error
    139     DoDetach (bool keep_stopped);
    140 
    141     virtual lldb_private::Error
    142     DoSignal (int signal);
    143 
    144     virtual lldb_private::Error
    145     DoDestroy ();
    146 
    147     virtual void
    148     RefreshStateAfterStop();
    149 
    150     //------------------------------------------------------------------
    151     // Process Queries
    152     //------------------------------------------------------------------
    153     virtual bool
    154     IsAlive ();
    155 
    156     //------------------------------------------------------------------
    157     // Process Memory
    158     //------------------------------------------------------------------
    159     virtual size_t
    160     DoReadMemory (lldb::addr_t addr, void *buf, size_t size, lldb_private::Error &error);
    161 
    162     virtual size_t
    163     DoWriteMemory (lldb::addr_t addr, const void *buf, size_t size, lldb_private::Error &error);
    164 
    165     virtual lldb::addr_t
    166     DoAllocateMemory (size_t size, uint32_t permissions, lldb_private::Error &error);
    167 
    168     virtual lldb_private::Error
    169     DoDeallocateMemory (lldb::addr_t ptr);
    170 
    171     //----------------------------------------------------------------------
    172     // Process Breakpoints
    173     //----------------------------------------------------------------------
    174     virtual lldb_private::Error
    175     EnableBreakpointSite (lldb_private::BreakpointSite *bp_site);
    176 
    177     virtual lldb_private::Error
    178     DisableBreakpointSite (lldb_private::BreakpointSite *bp_site);
    179 
    180     //----------------------------------------------------------------------
    181     // Process Watchpoints
    182     //----------------------------------------------------------------------
    183     virtual lldb_private::Error
    184     EnableWatchpoint (lldb_private::Watchpoint *wp, bool notify = true);
    185 
    186     virtual lldb_private::Error
    187     DisableWatchpoint (lldb_private::Watchpoint *wp, bool notify = true);
    188 
    189     CommunicationKDP &
    190     GetCommunication()
    191     {
    192         return m_comm;
    193     }
    194 
    195 protected:
    196     friend class ThreadKDP;
    197     friend class CommunicationKDP;
    198 
    199     //----------------------------------------------------------------------
    200     // Accessors
    201     //----------------------------------------------------------------------
    202     bool
    203     IsRunning ( lldb::StateType state )
    204     {
    205         return    state == lldb::eStateRunning || IsStepping(state);
    206     }
    207 
    208     bool
    209     IsStepping ( lldb::StateType state)
    210     {
    211         return    state == lldb::eStateStepping;
    212     }
    213 
    214     bool
    215     CanResume ( lldb::StateType state)
    216     {
    217         return state == lldb::eStateStopped;
    218     }
    219 
    220     bool
    221     HasExited (lldb::StateType state)
    222     {
    223         return state == lldb::eStateExited;
    224     }
    225 
    226     bool
    227     ProcessIDIsValid ( ) const;
    228 
    229     void
    230     Clear ( );
    231 
    232     virtual bool
    233     UpdateThreadList (lldb_private::ThreadList &old_thread_list,
    234                       lldb_private::ThreadList &new_thread_list);
    235 
    236     enum
    237     {
    238         eBroadcastBitAsyncContinue                  = (1 << 0),
    239         eBroadcastBitAsyncThreadShouldExit          = (1 << 1)
    240     };
    241 
    242     lldb::ThreadSP
    243     GetKernelThread ();
    244 
    245     //------------------------------------------------------------------
    246     /// Broadcaster event bits definitions.
    247     //------------------------------------------------------------------
    248     CommunicationKDP m_comm;
    249     lldb_private::Broadcaster m_async_broadcaster;
    250     lldb::thread_t m_async_thread;
    251     lldb_private::ConstString m_dyld_plugin_name;
    252     lldb::addr_t m_kernel_load_addr;
    253     lldb::CommandObjectSP m_command_sp;
    254     lldb::ThreadWP m_kernel_thread_wp;
    255 
    256 
    257     bool
    258     StartAsyncThread ();
    259 
    260     void
    261     StopAsyncThread ();
    262 
    263     static void *
    264     AsyncThread (void *arg);
    265 
    266 private:
    267     //------------------------------------------------------------------
    268     // For ProcessKDP only
    269     //------------------------------------------------------------------
    270 
    271     DISALLOW_COPY_AND_ASSIGN (ProcessKDP);
    272 
    273 };
    274 
    275 #endif  // liblldb_ProcessKDP_h_
    276