Skip to content

Commit e29434d

Browse files
committed
[swift-inspect] Fix the swift-inspect build on Darwin.
We had a few typos and such from the recent reorganization.
1 parent 10b5031 commit e29434d

File tree

4 files changed

+57
-32
lines changed

4 files changed

+57
-32
lines changed

tools/swift-inspect/Sources/swift-inspect/DarwinRemoteProcess.swift

Lines changed: 45 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
#if os(iOS) || os(macOS) || os(tvOS) || os(watchOS)
1414

1515
import SwiftRemoteMirror
16-
@_implementationOnly import SymbolicationShims
16+
import SymbolicationShims
1717

1818
internal 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))
@@ -153,8 +169,9 @@ extension DarwinRemoteProcess {
153169
{ (task, context, type, ranges, count) in
154170
let callback: (swift_addr_t, UInt64) -> Void =
155171
context!.assumingMemoryBound(to: ((swift_addr_t, UInt64) -> Void).self).pointee
156-
ranges.forEach {
157-
callback(swift_addr_t($0.address), UInt64($0.size))
172+
for i in 0..<Int(count) {
173+
let range = ranges[i]
174+
callback(swift_addr_t(range.address), UInt64(range.size))
158175
}
159176
})
160177
}
@@ -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

tools/swift-inspect/Sources/swift-inspect/Operations/DumpConcurrency.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#if os(iOS) || os(macOS) || os(tvOS) || os(watchOS)
1414

15+
import ArgumentParser
1516
import SwiftRemoteMirror
1617

1718
struct DumpConcurrency: ParsableCommand {
@@ -60,7 +61,7 @@ fileprivate class ConcurrencyDumper {
6061

6162
lazy var heapInfo: HeapInfo = gatherHeapInfo()
6263

63-
lazy var threadCurrentTasks = process.threadCurrentTasks().filter{ $0.currentTask != 0 }
64+
lazy var threadCurrentTasks = process.currentTasks.filter{ $0.currentTask != 0 }
6465

6566
lazy var tasks: [swift_reflection_ptr_t: TaskInfo] = gatherTasks()
6667

@@ -76,8 +77,8 @@ fileprivate class ConcurrencyDumper {
7677
self.process = process
7778

7879
func getMetadata(symbolName: String) -> swift_reflection_ptr_t? {
79-
let addr = process.GetSymbolAddress(symbolName)
80-
if let ptr = process.ReadBytes(addr, MemoryLayout<UInt>.size) {
80+
let addr = process.getAddr(symbolName: symbolName)
81+
if let ptr = process.read(address: addr, size: MemoryLayout<UInt>.size) {
8182
return swift_reflection_ptr_t(ptr.load(as: UInt.self))
8283
}
8384
return nil
@@ -148,7 +149,7 @@ fileprivate class ConcurrencyDumper {
148149
return cached
149150
}
150151

151-
let name = context.name(metadata: metadata)
152+
let name = context.name(type: metadata)
152153
metadataNameCache[metadata] = name
153154
return name
154155
}

tools/swift-inspect/Sources/swift-inspect/RemoteProcess.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ internal protocol RemoteProcess: AnyObject {
4242
static var GetSymbolAddress: GetSymbolAddressFunction { get }
4343

4444
func symbolicate(_ address: swift_addr_t) -> (module: String?, symbol: String?)
45+
func iterateHeap(_ body: (swift_addr_t, UInt64) -> Void)
4546
}
4647

4748
extension RemoteProcess {

tools/swift-inspect/Sources/swift-inspect/Symbolication+Extensions.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,4 +231,10 @@ func task_enumerate_malloc_blocks(
231231
Sym.task_enumerate_malloc_blocks(task, context, type_mask, recorder)
232232
}
233233

234+
func machErrStr(_ kr: kern_return_t) -> String {
235+
let errStr = String(cString: mach_error_string(kr))
236+
let errHex = String(kr, radix: 16)
237+
return "\(errStr) (0x\(errHex))"
238+
}
239+
234240
#endif

0 commit comments

Comments
 (0)