MachTask.h revision fb190f3e1ddbaf9fb72e15a96e103de2b9c0dc44
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
34class MachProcess;
35
36typedef uint64_t MachMallocEventId;
37
38enum MachMallocEventType
39{
40    eMachMallocEventTypeAlloc = 2,
41    eMachMallocEventTypeDealloc = 4,
42    eMachMallocEventTypeOther = 1
43};
44
45struct 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
53class MachTask
54{
55public:
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
117protected:
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
129private:
130    MachTask(const MachTask&); // Outlaw
131    MachTask& operator=(const MachTask& rhs);// Outlaw
132};
133
134#endif  // __MachTask_h__
135