Skip to content

Commit 585c01c

Browse files
committed
Revert "[swift-inspect] Fix corpse leaks when target doesn't have libswiftCore loaded."
This reverts commit 9671d6b.
1 parent d4880cf commit 585c01c

File tree

3 files changed

+37
-89
lines changed

3 files changed

+37
-89
lines changed

tools/swift-inspect/Sources/swift-inspect/Cleanup.swift

Lines changed: 0 additions & 48 deletions
This file was deleted.

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

Lines changed: 36 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,13 @@ internal final class DarwinRemoteProcess: RemoteProcess {
1919
public typealias ProcessIdentifier = pid_t
2020
public typealias ProcessHandle = task_t
2121

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
2923
internal var processIdentifier: ProcessIdentifier
3024
internal lazy var processName = getProcessName(processId: processIdentifier) ?? "<unknown process>"
3125

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
4129

4230
private var swiftCore: CSTypeRef
4331
private let swiftConcurrency: CSTypeRef
@@ -84,7 +72,7 @@ internal final class DarwinRemoteProcess: RemoteProcess {
8472
}
8573

8674
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))
8876
}
8977

9078
func getAddr(symbolName: String) -> swift_addr_t {
@@ -110,7 +98,7 @@ internal final class DarwinRemoteProcess: RemoteProcess {
11098
static var GetStringLength: GetStringLengthFunction {
11199
return { (context, address) in
112100
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) {
114102
return UInt64(strlen(str))
115103
}
116104
return 0
@@ -131,19 +119,18 @@ internal final class DarwinRemoteProcess: RemoteProcess {
131119

132120
init?(processId: ProcessIdentifier, forkCorpse: Bool) {
133121
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)
136124
guard taskResult == KERN_SUCCESS else {
137125
print("unable to get task for pid \(processId): \(String(cString: mach_error_string(taskResult))) \(hex: taskResult)",
138126
to: &Std.err)
139127
return nil
140128
}
141-
self.task.value = processTask
142129

143130
// Consult with VMUProcInfo to determine if we should force forkCorpse.
144131
let forceForkCorpse: Bool
145132
if let procInfoClass = getVMUProcInfoClass() {
146-
let procInfo = procInfoClass.init(task: self.task.value)
133+
let procInfo = procInfoClass.init(task: task)
147134
forceForkCorpse = procInfo.shouldAnalyzeWithCorpse
148135
} else {
149136
// Default to not forcing forkCorpse.
@@ -154,9 +141,11 @@ internal final class DarwinRemoteProcess: RemoteProcess {
154141
var corpse = task_t()
155142
let maxRetry = 6
156143
for retry in 0..<maxRetry {
157-
let corpseResult = task_generate_corpse(task.value, &corpse)
144+
let corpseResult = task_generate_corpse(task, &corpse)
158145
if corpseResult == KERN_SUCCESS {
159-
task.value = corpse
146+
task_stop_peeking(task)
147+
mach_port_deallocate(mach_task_self_, task)
148+
task = corpse
160149
break
161150
}
162151
if corpseResult != KERN_RESOURCE_SHORTAGE || retry == maxRetry {
@@ -168,19 +157,20 @@ internal final class DarwinRemoteProcess: RemoteProcess {
168157
}
169158
}
170159

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
177161

162+
self.symbolicator = CSSymbolicatorCreateWithTask(self.task)
163+
self.swiftCore =
164+
CSSymbolicatorGetSymbolOwnerWithNameAtTime(self.symbolicator,
165+
"libswiftCore.dylib", kCSNow)
178166
if CSIsNull(self.swiftCore) {
179167
print("pid \(processId) does not have libswiftCore.dylib loaded")
180168
return nil
181169
}
182170

183-
_ = task_start_peeking(self.task.value)
171+
self.swiftConcurrency = CSSymbolicatorGetSymbolOwnerWithNameAtTime(
172+
symbolicator, "libswift_Concurrency.dylib", kCSNow)
173+
_ = task_start_peeking(self.task)
184174

185175
guard let context =
186176
swift_reflection_createReflectionContextWithDataLayout(self.toOpaqueRef(),
@@ -191,17 +181,23 @@ internal final class DarwinRemoteProcess: RemoteProcess {
191181
Self.GetSymbolAddress) else {
192182
return nil
193183
}
194-
self._context.value = context
184+
self.context = context
195185

196-
_ = CSSymbolicatorForeachSymbolOwnerAtTime(self.symbolicator.value, kCSNow, { owner in
186+
_ = CSSymbolicatorForeachSymbolOwnerAtTime(self.symbolicator, kCSNow, { owner in
197187
let address = CSSymbolOwnerGetBaseAddress(owner)
198188
_ = swift_reflection_addImage(self.context, address)
199189
})
200190
}
201191

192+
deinit {
193+
task_stop_peeking(self.task)
194+
CSRelease(self.symbolicator)
195+
mach_port_deallocate(mach_task_self_, self.task)
196+
}
197+
202198
func symbolicate(_ address: swift_addr_t) -> (module: String?, symbol: String?) {
203199
let symbol =
204-
CSSymbolicatorGetSymbolWithAddressAtTime(self.symbolicator.value, address, kCSNow)
200+
CSSymbolicatorGetSymbolWithAddressAtTime(self.symbolicator, address, kCSNow)
205201

206202
let module = CSSymbolGetSymbolOwner(symbol)
207203
return (CSSymbolOwnerGetName(module), CSSymbolGetName(symbol))
@@ -210,7 +206,7 @@ internal final class DarwinRemoteProcess: RemoteProcess {
210206
internal func iterateHeap(_ body: (swift_addr_t, UInt64) -> Void) {
211207
withoutActuallyEscaping(body) {
212208
withUnsafePointer(to: $0) {
213-
task_enumerate_malloc_blocks(self.task.value,
209+
task_enumerate_malloc_blocks(self.task,
214210
UnsafeMutableRawPointer(mutating: $0),
215211
CUnsignedInt(MALLOC_PTR_IN_USE_RANGE_TYPE),
216212
{ (task, context, type, ranges, count) in
@@ -268,14 +264,14 @@ extension DarwinRemoteProcess {
268264
}
269265

270266
private func getThreadInfos() -> [ThreadInfo] {
271-
guard let threads = PortList(task: self.task.value) else {
267+
guard let threads = PortList(task: self.task) else {
272268
return []
273269
}
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 {
276272
return nil
277273
}
278-
guard let kernelObj = getKernelObject(task: mach_task_self_, port: t) else {
274+
guard let kernelObj = getKernelObject(task: mach_task_self_, port: $0) else {
279275
return nil
280276
}
281277
return ThreadInfo(threadID: info.thread_id,
@@ -332,7 +328,7 @@ extension DarwinRemoteProcess {
332328
}
333329

334330
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 {
336332
return nil
337333
}
338334
return threadInfos.first{ $0.kernelObject == remoteThreadObj }?.threadID

tools/swift-inspect/Sources/swift-inspect/Process.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ internal func getAllProcesses(options: UniversalOptions) -> [ProcessIdentifier]?
8080
}
8181
let newCount = bufferSize / kinfo_stride
8282
if count > newCount {
83-
buffer.removeLast(count - newCount)
83+
buffer.dropLast(count - newCount)
8484
}
8585
let sorted = buffer.sorted { first, second in
8686
first.kp_proc.p_pid > second.kp_proc.p_pid

0 commit comments

Comments
 (0)