Home | History | Annotate | Download | only in MacOSX
      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 {
     40     eMachMallocEventTypeAlloc = 2,
     41     eMachMallocEventTypeDealloc = 4,
     42     eMachMallocEventTypeOther = 1
     43 };
     44 
     45 struct MachMallocEvent
     46 {
     47     mach_vm_address_t m_base_address;
     48     uint64_t m_size;
     49     MachMallocEventType m_event_type;
     50     MachMallocEventId m_event_id;
     51 };
     52 
     53 class MachTask
     54 {
     55 public:
     56     //------------------------------------------------------------------
     57     // Constructors and Destructors
     58     //------------------------------------------------------------------
     59                             MachTask (MachProcess *process);
     60     virtual                 ~MachTask ();
     61 
     62             void            Clear ();
     63 
     64             kern_return_t   Suspend ();
     65             kern_return_t   Resume ();
     66 
     67             nub_size_t      ReadMemory (nub_addr_t addr, nub_size_t size, void *buf);
     68             nub_size_t      WriteMemory (nub_addr_t addr, nub_size_t size, const void *buf);
     69             int             GetMemoryRegionInfo (nub_addr_t addr, DNBRegionInfo *region_info);
     70             std::string     GetProfileData (DNBProfileDataScanType scanType);
     71 
     72             nub_addr_t      AllocateMemory (nub_size_t size, uint32_t permissions);
     73             nub_bool_t      DeallocateMemory (nub_addr_t addr);
     74 
     75             mach_port_t     ExceptionPort () const;
     76             bool            ExceptionPortIsValid () const;
     77             kern_return_t   SaveExceptionPortInfo ();
     78             kern_return_t   RestoreExceptionPortInfo ();
     79             kern_return_t   ShutDownExcecptionThread ();
     80 
     81             bool            StartExceptionThread (DNBError &err);
     82             nub_addr_t      GetDYLDAllImageInfosAddress (DNBError& err);
     83             kern_return_t   BasicInfo (struct task_basic_info *info);
     84     static  kern_return_t   BasicInfo (task_t task, struct task_basic_info *info);
     85             bool            IsValid () const;
     86     static  bool            IsValid (task_t task);
     87     static  void *          ExceptionThread (void *arg);
     88             task_t          TaskPort () const { return m_task; }
     89             task_t          TaskPortForProcessID (DNBError &err);
     90     static  task_t          TaskPortForProcessID (pid_t pid, DNBError &err, uint32_t num_retries = 10, 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             bool            HasMallocLoggingEnabled ();
     98 
     99             // enumerate the malloc records for a given address (starting with Mac OS X 10.6 Snow Leopard it should include
    100             // all allocations that *include* address, rather than just those *starting* at address)
    101             bool            EnumerateMallocRecords (mach_vm_address_t address,
    102                                                     MachMallocEvent *event_buffer,
    103                                                     uint32_t buffer_size,
    104                                                     uint32_t *count);
    105 
    106             // enumerate every malloc record generated by this task, no matter what the address
    107             bool            EnumerateMallocRecords (MachMallocEvent *event_buffer,
    108                                                     uint32_t buffer_size,
    109                                                     uint32_t *count);
    110 
    111             // given a malloc event, report every stack frame that led to this event
    112             bool            EnumerateMallocFrames (MachMallocEventId event_id,
    113                                                    mach_vm_address_t *function_addresses_buffer,
    114                                                    uint32_t buffer_size,
    115                                                    uint32_t *count);
    116 
    117 protected:
    118             MachProcess *   m_process;                  // The mach process that owns this MachTask
    119             task_t          m_task;
    120             MachVMMemory    m_vm_memory;                // Special mach memory reading class that will take care of watching for page and region boundaries
    121             MachException::PortInfo
    122                             m_exc_port_info;            // Saved settings for all exception ports
    123             pthread_t       m_exception_thread;         // Thread ID for the exception thread in case we need it
    124             mach_port_t     m_exception_port;           // Exception port on which we will receive child exceptions
    125 
    126             typedef std::map <mach_vm_address_t, size_t> allocation_collection;
    127             allocation_collection m_allocations;
    128 
    129 private:
    130     MachTask(const MachTask&); // Outlaw
    131     MachTask& operator=(const MachTask& rhs);// Outlaw
    132 };
    133 
    134 #endif  // __MachTask_h__
    135