@@ -19,25 +19,13 @@ internal final class DarwinRemoteProcess: RemoteProcess {
19
19
public typealias ProcessIdentifier = pid_t
20
20
public typealias ProcessHandle = task_t
21
21
22
- private var task = Cleanup< task_t> {
23
- // task_stop_peeking does nothing if we didn't task_start_peeking first, so
24
- // we can call it unconditionally.
25
- task_stop_peeking ( $0)
26
- mach_port_deallocate ( mach_task_self_, $0)
27
- }
28
-
22
+ private var task : task_t
29
23
internal var processIdentifier : ProcessIdentifier
30
24
internal lazy var processName = getProcessName ( processId: processIdentifier) ?? " <unknown process> "
31
25
32
- public var process : ProcessHandle { task. value }
33
- private var _context = Cleanup< SwiftReflectionContextRef> {
34
- swift_reflection_destroyReflectionContext ( $0)
35
- }
36
- public var context : SwiftReflectionContextRef ! { _context. value }
37
-
38
- private var symbolicator = Cleanup< CSSymbolicatorRef> {
39
- CSRelease ( $0)
40
- }
26
+ public var process : ProcessHandle { task }
27
+ public private( set) var context : SwiftReflectionContextRef !
28
+ private var symbolicator : CSSymbolicatorRef
41
29
42
30
private var swiftCore : CSTypeRef
43
31
private let swiftConcurrency : CSTypeRef
@@ -84,7 +72,7 @@ internal final class DarwinRemoteProcess: RemoteProcess {
84
72
}
85
73
86
74
func read( address: swift_addr_t , size: Int ) -> UnsafeRawPointer ? {
87
- return task_peek ( task. value , address, mach_vm_size_t ( size) )
75
+ return task_peek ( task, address, mach_vm_size_t ( size) )
88
76
}
89
77
90
78
func getAddr( symbolName: String ) -> swift_addr_t {
@@ -110,7 +98,7 @@ internal final class DarwinRemoteProcess: RemoteProcess {
110
98
static var GetStringLength : GetStringLengthFunction {
111
99
return { ( context, address) in
112
100
let process : DarwinRemoteProcess = DarwinRemoteProcess . fromOpaque ( context!)
113
- if let str = task_peek_string ( process. task. value , address) {
101
+ if let str = task_peek_string ( process. task, address) {
114
102
return UInt64 ( strlen ( str) )
115
103
}
116
104
return 0
@@ -131,19 +119,18 @@ internal final class DarwinRemoteProcess: RemoteProcess {
131
119
132
120
init ? ( processId: ProcessIdentifier , forkCorpse: Bool ) {
133
121
processIdentifier = processId
134
- var processTask : task_t = task_t ( )
135
- let taskResult = task_for_pid ( mach_task_self_, processId, & processTask )
122
+ var task : task_t = task_t ( )
123
+ let taskResult = task_for_pid ( mach_task_self_, processId, & task )
136
124
guard taskResult == KERN_SUCCESS else {
137
125
print ( " unable to get task for pid \( processId) : \( String ( cString: mach_error_string ( taskResult) ) ) \( hex: taskResult) " ,
138
126
to: & Std. err)
139
127
return nil
140
128
}
141
- self . task. value = processTask
142
129
143
130
// Consult with VMUProcInfo to determine if we should force forkCorpse.
144
131
let forceForkCorpse : Bool
145
132
if let procInfoClass = getVMUProcInfoClass ( ) {
146
- let procInfo = procInfoClass. init ( task: self . task. value )
133
+ let procInfo = procInfoClass. init ( task: task)
147
134
forceForkCorpse = procInfo. shouldAnalyzeWithCorpse
148
135
} else {
149
136
// Default to not forcing forkCorpse.
@@ -154,9 +141,11 @@ internal final class DarwinRemoteProcess: RemoteProcess {
154
141
var corpse = task_t ( )
155
142
let maxRetry = 6
156
143
for retry in 0 ..< maxRetry {
157
- let corpseResult = task_generate_corpse ( task. value , & corpse)
144
+ let corpseResult = task_generate_corpse ( task, & corpse)
158
145
if corpseResult == KERN_SUCCESS {
159
- task. value = corpse
146
+ task_stop_peeking ( task)
147
+ mach_port_deallocate ( mach_task_self_, task)
148
+ task = corpse
160
149
break
161
150
}
162
151
if corpseResult != KERN_RESOURCE_SHORTAGE || retry == maxRetry {
@@ -168,19 +157,20 @@ internal final class DarwinRemoteProcess: RemoteProcess {
168
157
}
169
158
}
170
159
171
- self . symbolicator. value = CSSymbolicatorCreateWithTask ( self . task. value)
172
-
173
- self . swiftCore = CSSymbolicatorGetSymbolOwnerWithNameAtTime (
174
- self . symbolicator. value, " libswiftCore.dylib " , kCSNow)
175
- self . swiftConcurrency = CSSymbolicatorGetSymbolOwnerWithNameAtTime (
176
- self . symbolicator. value, " libswift_Concurrency.dylib " , kCSNow)
160
+ self . task = task
177
161
162
+ self . symbolicator = CSSymbolicatorCreateWithTask ( self . task)
163
+ self . swiftCore =
164
+ CSSymbolicatorGetSymbolOwnerWithNameAtTime ( self . symbolicator,
165
+ " libswiftCore.dylib " , kCSNow)
178
166
if CSIsNull ( self . swiftCore) {
179
167
print ( " pid \( processId) does not have libswiftCore.dylib loaded " )
180
168
return nil
181
169
}
182
170
183
- _ = task_start_peeking ( self . task. value)
171
+ self . swiftConcurrency = CSSymbolicatorGetSymbolOwnerWithNameAtTime (
172
+ symbolicator, " libswift_Concurrency.dylib " , kCSNow)
173
+ _ = task_start_peeking ( self . task)
184
174
185
175
guard let context =
186
176
swift_reflection_createReflectionContextWithDataLayout ( self . toOpaqueRef ( ) ,
@@ -191,17 +181,23 @@ internal final class DarwinRemoteProcess: RemoteProcess {
191
181
Self . GetSymbolAddress) else {
192
182
return nil
193
183
}
194
- self . _context . value = context
184
+ self . context = context
195
185
196
- _ = CSSymbolicatorForeachSymbolOwnerAtTime ( self . symbolicator. value , kCSNow, { owner in
186
+ _ = CSSymbolicatorForeachSymbolOwnerAtTime ( self . symbolicator, kCSNow, { owner in
197
187
let address = CSSymbolOwnerGetBaseAddress ( owner)
198
188
_ = swift_reflection_addImage ( self . context, address)
199
189
} )
200
190
}
201
191
192
+ deinit {
193
+ task_stop_peeking ( self . task)
194
+ CSRelease ( self . symbolicator)
195
+ mach_port_deallocate ( mach_task_self_, self . task)
196
+ }
197
+
202
198
func symbolicate( _ address: swift_addr_t ) -> ( module: String ? , symbol: String ? ) {
203
199
let symbol =
204
- CSSymbolicatorGetSymbolWithAddressAtTime ( self . symbolicator. value , address, kCSNow)
200
+ CSSymbolicatorGetSymbolWithAddressAtTime ( self . symbolicator, address, kCSNow)
205
201
206
202
let module = CSSymbolGetSymbolOwner ( symbol)
207
203
return ( CSSymbolOwnerGetName ( module) , CSSymbolGetName ( symbol) )
@@ -210,7 +206,7 @@ internal final class DarwinRemoteProcess: RemoteProcess {
210
206
internal func iterateHeap( _ body: ( swift_addr_t , UInt64 ) -> Void ) {
211
207
withoutActuallyEscaping ( body) {
212
208
withUnsafePointer ( to: $0) {
213
- task_enumerate_malloc_blocks ( self . task. value ,
209
+ task_enumerate_malloc_blocks ( self . task,
214
210
UnsafeMutableRawPointer ( mutating: $0) ,
215
211
CUnsignedInt ( MALLOC_PTR_IN_USE_RANGE_TYPE) ,
216
212
{ ( task, context, type, ranges, count) in
@@ -268,14 +264,14 @@ extension DarwinRemoteProcess {
268
264
}
269
265
270
266
private func getThreadInfos( ) -> [ ThreadInfo ] {
271
- guard let threads = PortList ( task: self . task. value ) else {
267
+ guard let threads = PortList ( task: self . task) else {
272
268
return [ ]
273
269
}
274
- return threads. compactMap { t -> ThreadInfo ? in
275
- guard let info = getThreadInfo ( thread: t ) else {
270
+ return threads. compactMap {
271
+ guard let info = getThreadInfo ( thread: $0 ) else {
276
272
return nil
277
273
}
278
- guard let kernelObj = getKernelObject ( task: mach_task_self_, port: t ) else {
274
+ guard let kernelObj = getKernelObject ( task: mach_task_self_, port: $0 ) else {
279
275
return nil
280
276
}
281
277
return ThreadInfo ( threadID: info. thread_id,
@@ -332,7 +328,7 @@ extension DarwinRemoteProcess {
332
328
}
333
329
334
330
internal func getThreadID( remotePort: thread_t ) -> UInt64 ? {
335
- guard let remoteThreadObj = getKernelObject ( task: self . task. value , port: remotePort) else {
331
+ guard let remoteThreadObj = getKernelObject ( task: self . task, port: remotePort) else {
336
332
return nil
337
333
}
338
334
return threadInfos. first { $0. kernelObject == remoteThreadObj } ? . threadID
0 commit comments