From 84d9887d0b470966c590063eb1a13288a9df5460 Mon Sep 17 00:00:00 2001 From: Noah Martin Date: Fri, 1 Mar 2024 14:46:50 -0500 Subject: [PATCH] Stop using shell --- ETTrace/Symbolicator/Symbolicator.swift | 6 +---- ETTrace/Symbolicator/Utils.swift | 31 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/ETTrace/Symbolicator/Symbolicator.swift b/ETTrace/Symbolicator/Symbolicator.swift index 4369cb3..da6bf37 100644 --- a/ETTrace/Symbolicator/Symbolicator.swift +++ b/ETTrace/Symbolicator/Symbolicator.swift @@ -153,11 +153,7 @@ public class StackSymbolicator { let strs = addrsArray.map { String($0 + addition, radix: 16) } try! strs.joined(separator: "\n").write(toFile: addrsFile, atomically: true, encoding: .utf8) - let arch = try? safeShellWithOutput("/usr/bin/file \"\(binary)\"").contains("arm64e") ? "arm64e" : "arm64" - - try! strs.joined(separator: "\n").write(toFile: addrsFile, atomically: true, encoding: .utf8) - - let symsStr = try? safeShellWithOutput("/usr/bin/atos -l \(String(addition, radix: 16)) -arch \(arch!) -o \"\(binary)\" -f \(addrsFile)") + let symsStr = try? processWithOutput("/usr/bin/atos", args: ["-l", String(addition, radix: 16), "-o", binary, "-f", addrsFile]) let syms = symsStr!.split(separator: "\n").enumerated().map { (idx, sym) -> (UInt64, String?) in let trimmed = sym.trimmingCharacters(in: .whitespacesAndNewlines) diff --git a/ETTrace/Symbolicator/Utils.swift b/ETTrace/Symbolicator/Utils.swift index eec9764..e691219 100644 --- a/ETTrace/Symbolicator/Utils.swift +++ b/ETTrace/Symbolicator/Utils.swift @@ -20,6 +20,37 @@ func safeShell(_ command: String) throws { task.waitUntilExit() } +func processWithOutput(_ executable: String, args: [String]) throws -> String { + let task = Process() + let pipe = Pipe() + + task.standardOutput = pipe + task.arguments = args + task.executableURL = URL(fileURLWithPath: executable) + task.standardInput = nil + + let group = DispatchGroup() + group.enter() + var result = String() + pipe.fileHandleForReading.readabilityHandler = { fh in + let data = fh.availableData + if data.isEmpty { // EOF on the pipe + pipe.fileHandleForReading.readabilityHandler = nil + group.leave() + } else { + if let newString = String(data: data, encoding: .utf8) { + result.append(newString) + } + } + } + + try task.run() + task.waitUntilExit() + group.wait() + + return result +} + func safeShellWithOutput(_ command: String) throws -> String { let task = Process() let pipe = Pipe()