ProcessPOSIX.h revision 3bd2ebd670677dae45010bf53084ff85da7c6a5e
12341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//===-- ProcessPOSIX.h ------------------------------------------*- C++ -*-===// 22341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// 32341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// The LLVM Compiler Infrastructure 42341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// 52341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// This file is distributed under the University of Illinois Open Source 62341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// License. See LICENSE.TXT for details. 72341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// 82341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//===----------------------------------------------------------------------===// 92341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#ifndef liblldb_ProcessPOSIX_H_ 112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#define liblldb_ProcessPOSIX_H_ 122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// C Includes 142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// C++ Includes 162341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include <queue> 172341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// Other libraries and framework includes 192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/Target/Process.h" 202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/Target/UnixSignals.h" 212341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "ProcessMessage.h" 222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenclass ProcessMonitor; 242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenclass ProcessPOSIX : 262341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen public lldb_private::Process 272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenpublic: 292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen //------------------------------------------------------------------ 312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen // Constructors and destructors 322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen //------------------------------------------------------------------ 332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen ProcessPOSIX(lldb_private::Target& target, 342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb_private::Listener &listener); 352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual 372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen ~ProcessPOSIX(); 382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen //------------------------------------------------------------------ 402341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen // Process protocol. 412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen //------------------------------------------------------------------ 422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual bool 432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen CanDebug(lldb_private::Target &target, bool plugin_specified_by_name); 442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb_private::Error 462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen WillLaunch(lldb_private::Module *module); 472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb_private::Error 492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DoAttachToProcessWithID(lldb::pid_t pid); 502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb_private::Error 52c643077dd2048204d78bc8b19629d0a3dca055fdGreg Clayton DoAttachToProcessWithID (lldb::pid_t pid, const lldb_private::ProcessAttachInfo &attach_info); 53c643077dd2048204d78bc8b19629d0a3dca055fdGreg Clayton 54c643077dd2048204d78bc8b19629d0a3dca055fdGreg Clayton virtual lldb_private::Error 552341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DoLaunch (lldb_private::Module *exe_module, 562341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen const lldb_private::ProcessLaunchInfo &launch_info); 572341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual void 592341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DidLaunch(); 602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb_private::Error 622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DoResume(); 632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb_private::Error 652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DoHalt(bool &caused_stop); 662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 672341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb_private::Error 68761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham DoDetach(bool keep_stopped); 692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb_private::Error 712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DoSignal(int signal); 722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 732341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb_private::Error 742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DoDestroy(); 752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual void 772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen RefreshStateAfterStop(); 782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual bool 802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen IsAlive(); 812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual size_t 832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DoReadMemory(lldb::addr_t vm_addr, 842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen void *buf, 852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen size_t size, 862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb_private::Error &error); 872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual size_t 892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DoWriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size, 902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb_private::Error &error); 912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb::addr_t 932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DoAllocateMemory(size_t size, uint32_t permissions, 942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb_private::Error &error); 952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb_private::Error 972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DoDeallocateMemory(lldb::addr_t ptr); 982341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 994f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec virtual lldb::addr_t 1004f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec ResolveIndirectFunction(const lldb_private::Address *address, lldb_private::Error &error); 1014f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec 1022341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual size_t 1032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetSoftwareBreakpointTrapOpcode(lldb_private::BreakpointSite* bp_site); 1042341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1052341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb_private::Error 10652d8dd99f9610d28e8f5bbec0de2efcfdafed026Daniel Malea EnableBreakpointSite(lldb_private::BreakpointSite *bp_site); 1072341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1082341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb_private::Error 10952d8dd99f9610d28e8f5bbec0de2efcfdafed026Daniel Malea DisableBreakpointSite(lldb_private::BreakpointSite *bp_site); 1102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1113d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec virtual lldb_private::Error 1123d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec EnableWatchpoint(lldb_private::Watchpoint *wp, bool notify = true); 1133d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec 1143d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec virtual lldb_private::Error 1153d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec DisableWatchpoint(lldb_private::Watchpoint *wp, bool notify = true); 1163d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec 1173d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec virtual lldb_private::Error 1183d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec GetWatchpointSupportInfo(uint32_t &num); 1193d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec 1203d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec virtual lldb_private::Error 1213d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec GetWatchpointSupportInfo(uint32_t &num, bool &after); 1223d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec 1232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual uint32_t 1242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen UpdateThreadListIfNeeded(); 1252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 126c8dd570dddf0b73b74db5c1ecb8f18f023f864e7Greg Clayton virtual bool 1272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen UpdateThreadList(lldb_private::ThreadList &old_thread_list, 1282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb_private::ThreadList &new_thread_list) = 0; 1292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb::ByteOrder 1312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetByteOrder() const; 1322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb::addr_t 1342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetImageInfoAddress(); 1352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual size_t 1372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen PutSTDIN(const char *buf, size_t len, lldb_private::Error &error); 1382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen //-------------------------------------------------------------------------- 1402341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen // ProcessPOSIX internal API. 1412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Registers the given message with this process. 1432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen void SendMessage(const ProcessMessage &message); 1442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen ProcessMonitor & 1462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetMonitor() { assert(m_monitor); return *m_monitor; } 1472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb_private::UnixSignals & 1492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetUnixSignals(); 1502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen const char * 1522341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetFilePath(const lldb_private::ProcessLaunchInfo::FileAction *file_action, 1532341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen const char *default_path); 1542341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1553bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor /// Stops all threads in the process. 1563bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor /// The \p stop_tid parameter indicates the thread which initiated the stop. 1573bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor virtual void 1583bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor StopAllThreads(lldb::tid_t stop_tid); 1593bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor 1602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenprotected: 1612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Target byte order. 1622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb::ByteOrder m_byte_order; 1632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Process monitor; 1652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen ProcessMonitor *m_monitor; 1662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1672341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// The module we are executing. 1682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb_private::Module *m_module; 1692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Message queue notifying this instance of inferior process state changes. 1712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb_private::Mutex m_message_mutex; 1722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen std::queue<ProcessMessage> m_message_queue; 1732341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// True when the process has entered a state of "limbo". 1752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// 1762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// This flag qualifies eStateStopped. It lets us know that when we 1772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// continue from this state the process will exit. Also, when true, 1782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Process::m_exit_status is set. 1792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen bool m_in_limbo; 1802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Drive any exit events to completion. 1822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen bool m_exit_now; 1832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// OS-specific signal set. 1852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb_private::UnixSignals m_signals; 1862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Returns true if the process has exited. 1882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen bool HasExited(); 1892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Returns true if the process is stopped. 1912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen bool IsStopped(); 1922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen typedef std::map<lldb::addr_t, lldb::addr_t> MMapMap; 1942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen MMapMap m_addr_to_mmap_size; 1952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}; 1962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#endif // liblldb_MacOSXProcess_H_ 198