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 void TaskPortChanged(task_t task); 86 task_t TaskPort() const { return m_task; } 87 task_t TaskPortForProcessID(DNBError &err, bool force = false); 88 static task_t TaskPortForProcessID(pid_t pid, DNBError &err, 89 uint32_t num_retries = 10, 90 uint32_t usec_interval = 10000); 91 92 MachProcess *Process() { return m_process; } 93 const MachProcess *Process() const { return m_process; } 94 95 nub_size_t PageSize(); 96 97 protected: 98 MachProcess *m_process; // The mach process that owns this MachTask 99 task_t m_task; 100 MachVMMemory m_vm_memory; // Special mach memory reading class that will take 101 // care of watching for page and region boundaries 102 MachException::PortInfo 103 m_exc_port_info; // Saved settings for all exception ports 104 pthread_t m_exception_thread; // Thread ID for the exception thread in case we 105 // need it 106 mach_port_t m_exception_port; // Exception port on which we will receive child 107 // exceptions 108 109 typedef std::map<mach_vm_address_t, size_t> allocation_collection; 110 allocation_collection m_allocations; 111 112 private: 113 MachTask(const MachTask &); // Outlaw 114 MachTask &operator=(const MachTask &rhs); // Outlaw 115 }; 116 117 #endif // __MachTask_h__ 118