Skip to content

Commit 9295705

Browse files
committed
Tracing preferences.
1 parent 5714dbf commit 9295705

3 files changed

Lines changed: 103 additions & 13 deletions

File tree

App/InjectionNext/ConfigStore.swift

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,36 @@ final class ConfigStore: ObservableObject {
319319
client.writeCommand(InjectionCommand.setenv.rawValue,
320320
with: INJECTION_BENCH)
321321
client.write(benchmarking ? "1" : unsetVar)
322+
client.writeCommand(InjectionCommand.setenv.rawValue,
323+
with: INJECTION_TRACE_FILTER)
324+
client.write(traceFilter != "" ? traceFilter : ".")
325+
switch traceMode {
326+
case .injected:
327+
client.writeCommand(InjectionCommand.setenv.rawValue,
328+
with: INJECTION_TRACE)
329+
client.write("1")
330+
case .all:
331+
client.writeCommand(InjectionCommand.setenv.rawValue,
332+
with: INJECTION_TRACE_ALL)
333+
client.write("1")
334+
case .off:
335+
break
336+
}
337+
if traceFrameworks != "" {
338+
client.writeCommand(InjectionCommand.setenv.rawValue,
339+
with: INJECTION_TRACE_FRAMEWORKS)
340+
client.write(traceFrameworks)
341+
}
342+
if traceUIKit != "" {
343+
client.writeCommand(InjectionCommand.setenv.rawValue,
344+
with: INJECTION_TRACE_UIKIT)
345+
client.write(traceUIKit)
346+
}
347+
if traceLookup {
348+
client.writeCommand(InjectionCommand.setenv.rawValue,
349+
with: INJECTION_TRACE_LOOKUP)
350+
client.write(traceUIKit)
351+
}
322352
}
323353

324354
// MARK: - Devices
@@ -342,22 +372,22 @@ final class ConfigStore: ObservableObject {
342372
}
343373
@Published var availableIdentities: [String] = []
344374

345-
// MARK: - Tracing // difficult to implement as tracing happens early.
375+
// MARK: - Tracing
346376

347377
@Published var traceMode: TraceMode {
348-
didSet { ud.set(traceMode.rawValue, forKey: "traceMode") }
378+
didSet { ud.set(traceMode.rawValue, forKey: "traceMode"); updateEnvVars() }
349379
}
350380
@Published var traceFilter: String {
351-
didSet { ud.set(traceFilter, forKey: "traceFilter") }
381+
didSet { ud.set(traceFilter, forKey: "traceFilter"); updateEnvVars() }
352382
}
353383
@Published var traceFrameworks: String {
354-
didSet { ud.set(traceFrameworks, forKey: "traceFrameworks") }
384+
didSet { ud.set(traceFrameworks, forKey: "traceFrameworks"); updateEnvVars() }
355385
}
356386
@Published var traceLookup: Bool {
357-
didSet { ud.set(traceLookup, forKey: "traceLookup") }
387+
didSet { ud.set(traceLookup, forKey: "traceLookup"); updateEnvVars() }
358388
}
359389
@Published var traceUIKit: String {
360-
didSet { ud.set(traceUIKit, forKey: "traceUIKit") }
390+
didSet { ud.set(traceUIKit, forKey: "traceUIKit"); updateEnvVars() }
361391
}
362392

363393
// MARK: - File Watcher

App/InjectionNext/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<key>CFBundleShortVersionString</key>
2020
<string>$(MARKETING_VERSION)</string>
2121
<key>CFBundleVersion</key>
22-
<string>14172</string>
22+
<string>14181</string>
2323
<key>LSApplicationCategoryType</key>
2424
<string>public.app-category.developer-tools</string>
2525
<key>LSMinimumSystemVersion</key>

Sources/InjectionNext/InjectionNext.swift

Lines changed: 66 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -114,10 +114,15 @@ open class InjectionNext: SimpleSocket {
114114
log("Connection lost, disconnecting.")
115115
}
116116

117-
func tracingOptions() {
117+
lazy var setupTraceAdjustments: Void = {
118118
SwiftTrace.injectableSymbol = Reloader.injectableSymbol
119119
SwiftTrace.defaultMethodExclusions += // CoreFoundation
120120
#"|\[NS(Method|Tagged|Array|\w*Dict|Date|Data|Timer)|allocWithZone:|__unurl|_trueSelf"#
121+
+ #"|InjectionBundle.|fast_dl"#
122+
}()
123+
124+
func tracingOptions() {
125+
_ = setupTraceAdjustments
121126
/// Custom type lookup on tracing.
122127
if let exclude = getenv(INJECTION_TRACE_LOOKUP) {
123128
if exclude[0] == UInt8(ascii: "|") {
@@ -126,8 +131,7 @@ open class InjectionNext: SimpleSocket {
126131
SwiftTrace.typeLookup = true
127132
}
128133
if let filter = getenv(INJECTION_TRACE_FILTER) {
129-
SwiftTrace.inclusionRegexp =
130-
NSRegularExpression(regexp: String(cString: filter))
134+
SwiftTrace.traceFilterInclude = String(cString: filter)
131135
}
132136
/// Entire App bundle tracing.
133137
if let exclude = getenv(INJECTION_TRACE_ALL) {
@@ -281,10 +285,66 @@ open class InjectionNext: SimpleSocket {
281285
}
282286
case .setenv:
283287
if let name = readString(), let value = readString() {
284-
if value != "0" {
285-
setenv(name, value, 1)
286-
} else {
288+
if value == "0" {
287289
unsetenv(name)
290+
} else {
291+
_ = setupTraceAdjustments
292+
if name == INJECTION_TRACE_FILTER {
293+
SwiftTrace.traceFilterInclude = value
294+
} else if getenv(name) == nil {
295+
switch name {
296+
case INJECTION_TRACE_LOOKUP:
297+
if value.hasPrefix("|") {
298+
SwiftTrace.defaultLookupExclusions += value
299+
}
300+
SwiftTrace.typeLookup = true
301+
case INJECTION_TRACE_ALL:
302+
SwiftTrace.interposeEclusions = SwiftTrace.exclusionRegexp
303+
appBundleImages { imageName, _, _ in
304+
if SwiftTrace.interposeMethods(inBundlePath: imageName) == 0,
305+
strstr(imageName, "XCT") == nil {
306+
self.error("""
307+
Unable to interpose to trace image \
308+
\(String(cString: imageName)), have you added \
309+
"Other Linker Flags" -Xlinker -interposable
310+
""")
311+
}
312+
SwiftTrace.trace(bundlePath: imageName)
313+
}
314+
case INJECTION_TRACE_FRAMEWORKS:
315+
var frmwks = value
316+
if frmwks == "" || frmwks == "1" { frmwks = "SwiftUI,SwiftUICore" }
317+
for frmwk in frmwks.components(separatedBy: ",") {
318+
if let dylib = DLKit.imageMap[frmwk] {
319+
Self.target = dylib
320+
appBundleImages { path, header, slide in
321+
rebind_symbols_trace(autoBitCast(header), slide, Self.tracer)
322+
}
323+
} else {
324+
error("Invalid trace framework \(frmwk)")
325+
}
326+
}
327+
case INJECTION_TRACE_UIKIT:
328+
var frmwks = value
329+
if frmwks == "" || frmwks == "1" { frmwks = "UIKitCore" }
330+
for frmwk in frmwks.components(separatedBy: ",") {
331+
if let bundle = DLKit.imageMap[frmwk]?.imageName {
332+
SwiftTrace.trace(bundlePath: bundle)
333+
} else {
334+
error("Invalid swizzle framework \(frmwk)")
335+
}
336+
}
337+
case INJECTION_TRACE:
338+
Reloader.traceHook = { (injected, name) in
339+
let name = SwiftMeta.demangle(symbol: name) ?? String(cString: name)
340+
detail("SwiftTracing \(name)")
341+
return autoBitCast(SwiftTrace.trace(name: name, original: injected)) ?? injected
342+
}
343+
default:
344+
break
345+
}
346+
}
347+
setenv(name, value, 1)
288348
}
289349
}
290350
case .EOF:

0 commit comments

Comments
 (0)