1313#if os(iOS) || os(macOS) || os(tvOS) || os(watchOS)
1414
1515import SwiftRemoteMirror
16- @ _implementationOnly import SymbolicationShims
16+ import SymbolicationShims
1717
1818internal final class DarwinRemoteProcess : RemoteProcess {
1919 public typealias ProcessIdentifier = pid_t
@@ -23,8 +23,10 @@ internal final class DarwinRemoteProcess: RemoteProcess {
2323
2424 public var process : ProcessHandle { task }
2525 public private( set) var context : SwiftReflectionContextRef !
26+ private var symbolicator : CSSymbolicatorRef
2627
2728 private var swiftCore : CSTypeRef
29+ private let swiftConcurrency : CSTypeRef
2830
2931 static var QueryDataLayout : QueryDataLayoutFunction {
3032 return { ( context, type, _, output) in
@@ -38,7 +40,7 @@ internal final class DarwinRemoteProcess: RemoteProcess {
3840
3941 case DLQ_GetPtrAuthMask:
4042 let mask = GetPtrauthMask ( )
41- output. storeBytes ( of: mask, toByteOffset: 0 , as: UInt . size )
43+ output. storeBytes ( of: mask, toByteOffset: 0 , as: UInt . self )
4244 return 1
4345
4446 case DLQ_GetObjCReservedLowBits:
@@ -65,10 +67,25 @@ internal final class DarwinRemoteProcess: RemoteProcess {
6567 }
6668 }
6769
70+ func read( address: swift_addr_t , size: Int ) -> UnsafeRawPointer ? {
71+ return task_peek ( task, address, mach_vm_size_t ( size) )
72+ }
73+
74+ func getAddr( symbolName: String ) -> swift_addr_t {
75+ // FIXME: use `__USER_LABEL_PREFIX__` instead of the hardcoded `_`.
76+ let fullName = " _ \( symbolName) "
77+ let symbol = CSSymbolOwnerGetSymbolWithMangledName ( swiftCore, fullName)
78+ if CSIsNull ( symbol) {
79+ symbol = CSSymbolOwnerGetSymbolWithMangledName ( swiftConcurrency, fullName)
80+ }
81+ let range = CSSymbolGetRange ( symbol)
82+ return swift_addr_t ( range. location)
83+ }
84+
6885 static var ReadBytes : ReadBytesFunction {
6986 return { ( context, address, size, _) in
7087 let process : DarwinRemoteProcess = DarwinRemoteProcess . fromOpaque ( context!)
71- return task_peek ( process. task , address, size)
88+ return process. read ( address : address, size: Int ( size ) )
7289 }
7390 }
7491
@@ -90,11 +107,7 @@ internal final class DarwinRemoteProcess: RemoteProcess {
90107 let buffer = UnsafeBufferPointer ( start: $0, count: Int ( length) )
91108 return String ( decoding: buffer, as: UTF8 . self)
92109 }
93-
94- let symbol =
95- CSSymbolOwnerGetSymbolWithMangledName ( process. swiftCore, " _ \( name) " )
96- // FIXME: use `__USER_LABEL_PREFIX__` instead of the hardcoded `_`.
97- return swift_addr_t ( CSSymbolGetRange ( symbol) . location)
110+ return process. getAddr ( symbolName: name)
98111 }
99112 }
100113
@@ -107,6 +120,14 @@ internal final class DarwinRemoteProcess: RemoteProcess {
107120 }
108121 self . task = task
109122
123+ self . symbolicator = CSSymbolicatorCreateWithTask ( self . task)
124+ self . swiftCore =
125+ CSSymbolicatorGetSymbolOwnerWithNameAtTime ( self . symbolicator,
126+ " libswiftCore.dylib " , kCSNow)
127+ self . swiftConcurrency = CSSymbolicatorGetSymbolOwnerWithNameAtTime (
128+ symbolicator, " libswift_Concurrency.dylib " , kCSNow)
129+ _ = task_start_peeking ( self . task)
130+
110131 guard let context =
111132 swift_reflection_createReflectionContextWithDataLayout ( self . toOpaqueRef ( ) ,
112133 Self . QueryDataLayout,
@@ -116,12 +137,7 @@ internal final class DarwinRemoteProcess: RemoteProcess {
116137 Self . GetSymbolAddress) else {
117138 return nil
118139 }
119-
120- self . symbolicator = CSSymbolicatorCreateWithTask ( self . task)
121- self . swiftCore =
122- CSSymbolicatorGetSymbolOwnerWithNameAtTime ( self . symbolicator,
123- " libswiftCore.dylib " , kCSNow)
124- _ = task_start_peeking ( self . task)
140+ self . context = context
125141
126142 _ = CSSymbolicatorForeachSymbolOwnerAtTime ( self . symbolicator, kCSNow, { owner in
127143 let address = CSSymbolOwnerGetBaseAddress ( owner)
@@ -136,7 +152,7 @@ internal final class DarwinRemoteProcess: RemoteProcess {
136152
137153 func symbolicate( _ address: swift_addr_t ) -> ( module: String ? , symbol: String ? ) {
138154 let symbol =
139- CSSymbolicatorGetSymbolWithAddressAtTime ( sself . symbolicator, address, kCSNow)
155+ CSSymbolicatorGetSymbolWithAddressAtTime ( self . symbolicator, address, kCSNow)
140156
141157 let module = CSSymbolGetSymbolOwner ( symbol)
142158 return ( CSSymbolOwnerGetName ( module) , CSSymbolGetName ( symbol) )
@@ -151,8 +167,9 @@ internal final class DarwinRemoteProcess: RemoteProcess {
151167 { ( task, context, type, ranges, count) in
152168 let callback : ( swift_addr_t , UInt64 ) -> Void =
153169 context!. assumingMemoryBound ( to: ( ( swift_addr_t, UInt64) - > Void) . self) . pointee
154- ranges. forEach {
155- callback ( swift_addr_t ( $0. address) , UInt64 ( $0. size) )
170+ for i in 0 ..< Int ( count) {
171+ let range = ranges [ i]
172+ callback ( swift_addr_t ( range. address) , UInt64 ( range. size) )
156173 }
157174 } )
158175 }
@@ -196,24 +213,24 @@ extension DarwinRemoteProcess {
196213 let result =
197214 thread_info ( threadList![ i] , thread_flavor_t ( THREAD_IDENTIFIER_INFO) ,
198215 $0, & infoCount)
199- guard result == ERROR_SUCCESS else {
216+ guard result == KERN_SUCCESS else {
200217 print ( " unable to get info for thread \( i) : \( String ( cString: mach_error_string ( result) ) ) (0x \( String ( result, radix: 16 ) ) ) " )
201218 return
202219 }
220+ }
221+ }
203222
204- let tlsStart = info. thread_handle
205- if tlsStart == 0 { return }
223+ let tlsStart = info. thread_handle
224+ if tlsStart == 0 { continue }
206225
207- let SWIFT_CONCURRENCY_TASK_KEY = 103
208- let currentTaskPointer = tlsStart + UInt64( SWIFT_CONCURRENCY_TASK_KEY * MemoryLayout< UnsafeRawPointer> . size)
209- if let pointer = ReadBytes ( currentTaskPointer, size: MemoryLayout< UnsafeRawPointer> . size) {
210- let currentTask = pointer. load ( as: UInt . self)
211- results. append ( ( threadID: info. thread_id, currentTask: swift_addr_t ( currentTask) ) )
212- }
213- }
226+ let SWIFT_CONCURRENCY_TASK_KEY = 103
227+ let currentTaskPointer = tlsStart + UInt64( SWIFT_CONCURRENCY_TASK_KEY * MemoryLayout< UnsafeRawPointer> . size)
228+ if let pointer = read ( address: currentTaskPointer, size: MemoryLayout< UnsafeRawPointer> . size) {
229+ let currentTask = pointer. load ( as: UInt . self)
230+ results. append ( ( threadID: info. thread_id, currentTask: swift_addr_t ( currentTask) ) )
214231 }
215232 }
216- return result
233+ return results
217234 }
218235}
219236
0 commit comments