MachTask.h revision a9385537809ef342c843c5ab972e513742652047
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// Other libraries and framework includes 27// Project includes 28#include "MachException.h" 29#include "MachVMMemory.h" 30#include "PThreadMutex.h" 31 32class MachProcess; 33 34typedef uint64_t MachMallocEventId; 35 36enum MachMallocEventType 37{ 38 eMachMallocEventTypeAlloc = 2, 39 eMachMallocEventTypeDealloc = 4, 40 eMachMallocEventTypeOther = 1 41}; 42 43struct MachMallocEvent 44{ 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 51class MachTask 52{ 53public: 54 //------------------------------------------------------------------ 55 // Constructors and Destructors 56 //------------------------------------------------------------------ 57 MachTask (MachProcess *process); 58 virtual ~MachTask (); 59 60 void Clear (); 61 62 kern_return_t Suspend (); 63 kern_return_t Resume (); 64 65 nub_size_t ReadMemory (nub_addr_t addr, nub_size_t size, void *buf); 66 nub_size_t WriteMemory (nub_addr_t addr, nub_size_t size, const void *buf); 67 int GetMemoryRegionInfo (nub_addr_t addr, DNBRegionInfo *region_info); 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); 87 static task_t TaskPortForProcessID (pid_t pid, DNBError &err, uint32_t num_retries = 10, uint32_t usec_interval = 10000); 88 89 MachProcess * Process () { return m_process; } 90 const MachProcess * Process () const { return m_process; } 91 92 93 bool HasMallocLoggingEnabled (); 94 95 // enumerate the malloc records for a given address (starting with Mac OS X 10.6 Snow Leopard it should include 96 // all allocations that *include* address, rather than just those *starting* at address) 97 bool EnumerateMallocRecords (mach_vm_address_t address, 98 MachMallocEvent *event_buffer, 99 uint32_t buffer_size, 100 uint32_t *count); 101 102 // enumerate every malloc record generated by this task, no matter what the address 103 bool EnumerateMallocRecords (MachMallocEvent *event_buffer, 104 uint32_t buffer_size, 105 uint32_t *count); 106 107 // given a malloc event, report every stack frame that led to this event 108 bool EnumerateMallocFrames (MachMallocEventId event_id, 109 mach_vm_address_t *function_addresses_buffer, 110 uint32_t buffer_size, 111 uint32_t *count); 112 113protected: 114 MachProcess * m_process; // The mach process that owns this MachTask 115 task_t m_task; 116 MachVMMemory m_vm_memory; // Special mach memory reading class that will take care of watching for page and region boundaries 117 MachException::PortInfo 118 m_exc_port_info; // Saved settings for all exception ports 119 pthread_t m_exception_thread; // Thread ID for the exception thread in case we need it 120 mach_port_t m_exception_port; // Exception port on which we will receive child exceptions 121 122 typedef std::map <mach_vm_address_t, size_t> allocation_collection; 123 allocation_collection m_allocations; 124 125private: 126 MachTask(const MachTask&); // Outlaw 127 MachTask& operator=(const MachTask& rhs);// Outlaw 128}; 129 130#endif // __MachTask_h__ 131