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);
TaskPort()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 
Process()92             MachProcess *   Process () { return m_process; }
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