124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- MachTask.h ----------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// MachTask.h 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// debugserver 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Created by Greg Clayton on 12/5/08. 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef __MachTask_h__ 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define __MachTask_h__ 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <mach/mach.h> 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <sys/socket.h> 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <map> 26fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong#include <string> 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 29cec43ab7f30085ac7f65a26a58b956a69e363a3bHan Ming Ong#include "DNBDefs.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "MachException.h" 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "MachVMMemory.h" 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "PThreadMutex.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass MachProcess; 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granatatypedef uint64_t MachMallocEventId; 37520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata 38520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granataenum MachMallocEventType 39520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata{ 40520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata eMachMallocEventTypeAlloc = 2, 41520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata eMachMallocEventTypeDealloc = 4, 42520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata eMachMallocEventTypeOther = 1 43520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata}; 44520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata 45520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granatastruct MachMallocEvent 46520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata{ 47520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata mach_vm_address_t m_base_address; 48520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata uint64_t m_size; 49520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata MachMallocEventType m_event_type; 50520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata MachMallocEventId m_event_id; 51520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata}; 52520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass MachTask 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Constructors and Destructors 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner MachTask (MachProcess *process); 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ~MachTask (); 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void Clear (); 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner kern_return_t Suspend (); 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner kern_return_t Resume (); 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner nub_size_t ReadMemory (nub_addr_t addr, nub_size_t size, void *buf); 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner nub_size_t WriteMemory (nub_addr_t addr, nub_size_t size, const void *buf); 69a9385537809ef342c843c5ab972e513742652047Greg Clayton int GetMemoryRegionInfo (nub_addr_t addr, DNBRegionInfo *region_info); 70cec43ab7f30085ac7f65a26a58b956a69e363a3bHan Ming Ong std::string GetProfileData (DNBProfileDataScanType scanType); 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner nub_addr_t AllocateMemory (nub_size_t size, uint32_t permissions); 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner nub_bool_t DeallocateMemory (nub_addr_t addr); 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner mach_port_t ExceptionPort () const; 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool ExceptionPortIsValid () const; 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner kern_return_t SaveExceptionPortInfo (); 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner kern_return_t RestoreExceptionPortInfo (); 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner kern_return_t ShutDownExcecptionThread (); 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool StartExceptionThread (DNBError &err); 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner nub_addr_t GetDYLDAllImageInfosAddress (DNBError& err); 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner kern_return_t BasicInfo (struct task_basic_info *info); 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static kern_return_t BasicInfo (task_t task, struct task_basic_info *info); 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool IsValid () const; 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static bool IsValid (task_t task); 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static void * ExceptionThread (void *arg); 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner task_t TaskPort () const { return m_task; } 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner task_t TaskPortForProcessID (DNBError &err); 908016967553a0e818d57ce5f86230c8cee7be7ecfGreg Clayton static task_t TaskPortForProcessID (pid_t pid, DNBError &err, uint32_t num_retries = 10, uint32_t usec_interval = 10000); 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner MachProcess * Process () { return m_process; } 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const MachProcess * Process () const { return m_process; } 94520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata 95fb190f3e1ddbaf9fb72e15a96e103de2b9c0dc44Jason Molenda nub_size_t PageSize (); 96520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata 97520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata bool HasMallocLoggingEnabled (); 98520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata 99520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata // enumerate the malloc records for a given address (starting with Mac OS X 10.6 Snow Leopard it should include 100520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata // all allocations that *include* address, rather than just those *starting* at address) 101520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata bool EnumerateMallocRecords (mach_vm_address_t address, 102520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata MachMallocEvent *event_buffer, 103520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata uint32_t buffer_size, 104520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata uint32_t *count); 105520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata 106520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata // enumerate every malloc record generated by this task, no matter what the address 107520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata bool EnumerateMallocRecords (MachMallocEvent *event_buffer, 108520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata uint32_t buffer_size, 109520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata uint32_t *count); 110520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata 111520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata // given a malloc event, report every stack frame that led to this event 112520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata bool EnumerateMallocFrames (MachMallocEventId event_id, 113520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata mach_vm_address_t *function_addresses_buffer, 114520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata uint32_t buffer_size, 115520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata uint32_t *count); 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner MachProcess * m_process; // The mach process that owns this MachTask 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner task_t m_task; 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner MachVMMemory m_vm_memory; // Special mach memory reading class that will take care of watching for page and region boundaries 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner MachException::PortInfo 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_exc_port_info; // Saved settings for all exception ports 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pthread_t m_exception_thread; // Thread ID for the exception thread in case we need it 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner mach_port_t m_exception_port; // Exception port on which we will receive child exceptions 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef std::map <mach_vm_address_t, size_t> allocation_collection; 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner allocation_collection m_allocations; 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate: 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner MachTask(const MachTask&); // Outlaw 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner MachTask& operator=(const MachTask& rhs);// Outlaw 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // __MachTask_h__ 135