1 //===-- MachTask.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 // 11 // MachTask.h 12 // debugserver 13 // 14 // Created by Greg Clayton on 12/5/08. 15 // 16 //===----------------------------------------------------------------------===// 17 18 #ifndef __MachTask_h__ 19 #define __MachTask_h__ 20 21 // C Includes 22 #include <mach/mach.h> 23 #include <sys/socket.h> 24 // C++ Includes 25 #include <map> 26 #include <string> 27 // Other libraries and framework includes 28 // Project includes 29 #include "DNBDefs.h" 30 #include "MachException.h" 31 #include "MachVMMemory.h" 32 #include "PThreadMutex.h" 33 34 class MachProcess; 35 36 typedef uint64_t MachMallocEventId; 37 38 enum MachMallocEventType { 39 eMachMallocEventTypeAlloc = 2, 40 eMachMallocEventTypeDealloc = 4, 41 eMachMallocEventTypeOther = 1 42 }; 43 44 struct MachMallocEvent { 45 mach_vm_address_t m_base_address; 46 uint64_t m_size; 47 MachMallocEventType m_event_type; 48 MachMallocEventId m_event_id; 49 }; 50 51 class MachTask { 52 public: 53 //------------------------------------------------------------------ 54 // Constructors and Destructors 55 //------------------------------------------------------------------ 56 MachTask(MachProcess *process); 57 virtual ~MachTask(); 58 59 void Clear(); 60 61 kern_return_t Suspend(); 62 kern_return_t Resume(); 63 64 nub_size_t ReadMemory(nub_addr_t addr, nub_size_t size, void *buf); 65 nub_size_t WriteMemory(nub_addr_t addr, nub_size_t size, const void *buf); 66 int GetMemoryRegionInfo(nub_addr_t addr, DNBRegionInfo *region_info); 67 std::string GetProfileData(DNBProfileDataScanType scanType); 68 69 nub_addr_t AllocateMemory(nub_size_t size, uint32_t permissions); 70 nub_bool_t DeallocateMemory(nub_addr_t addr); 71 72 mach_port_t ExceptionPort() const; 73 bool ExceptionPortIsValid() const; 74 kern_return_t SaveExceptionPortInfo(); 75 kern_return_t RestoreExceptionPortInfo(); 76 kern_return_t ShutDownExcecptionThread(); 77 78 bool StartExceptionThread(DNBError &err); 79 nub_addr_t GetDYLDAllImageInfosAddress(DNBError &err); 80 kern_return_t BasicInfo(struct task_basic_info *info); 81 static kern_return_t BasicInfo(task_t task, struct task_basic_info *info); 82 bool IsValid() const; 83 static bool IsValid(task_t task); 84 static void *ExceptionThread(void *arg); 85 task_t TaskPort() const { return m_task; } 86 task_t TaskPortForProcessID(DNBError &err, bool force = false); 87 static task_t TaskPortForProcessID(pid_t pid, DNBError &err, 88 uint32_t num_retries = 10, 89 uint32_t usec_interval = 10000); 90 91 MachProcess *Process() { return m_process; } 92 const MachProcess *Process() const { return m_process; } 93 94 nub_size_t PageSize(); 95 96 protected: 97 MachProcess *m_process; // The mach process that owns this MachTask 98 task_t m_task; 99 MachVMMemory m_vm_memory; // Special mach memory reading class that will take 100 // care of watching for page and region boundaries 101 MachException::PortInfo 102 m_exc_port_info; // Saved settings for all exception ports 103 pthread_t m_exception_thread; // Thread ID for the exception thread in case we 104 // need it 105 mach_port_t m_exception_port; // Exception port on which we will receive child 106 // exceptions 107 108 typedef std::map<mach_vm_address_t, size_t> allocation_collection; 109 allocation_collection m_allocations; 110 111 private: 112 MachTask(const MachTask &); // Outlaw 113 MachTask &operator=(const MachTask &rhs); // Outlaw 114 }; 115 116 #endif // __MachTask_h__ 117