Skip to content

Commit 1028341

Browse files
committed
Consolidate.
1 parent f74a900 commit 1028341

2 files changed

Lines changed: 74 additions & 128 deletions

File tree

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>14187</string>
22+
<string>14193</string>
2323
<key>LSApplicationCategoryType</key>
2424
<string>public.app-category.developer-tools</string>
2525
<key>LSMinimumSystemVersion</key>

Sources/InjectionNext/InjectionNext.swift

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

117-
lazy var setupTraceAdjustments: Void = {
117+
func tracingOptions() {
118118
SwiftTrace.injectableSymbol = Reloader.injectableSymbol
119119
SwiftTrace.defaultMethodExclusions += // CoreFoundation
120120
#"|\[NS(Method|Tagged|Array|\w*Dict|Date|Data|Timer)|allocWithZone:|__unurl|_trueSelf"#
121121
+ #"|InjectionBundle.|fast_dl"#
122-
}()
123-
124-
func tracingOptions() {
125-
_ = setupTraceAdjustments
126-
/// Custom type lookup on tracing.
127-
if let exclude = getenv(INJECTION_TRACE_LOOKUP) {
128-
if exclude[0] == UInt8(ascii: "|") {
129-
SwiftTrace.defaultLookupExclusions += String(cString: exclude)
130-
}
131-
SwiftTrace.typeLookup = true
132-
}
133-
if let filter = getenv(INJECTION_TRACE_FILTER) {
134-
SwiftTrace.traceFilterInclude = String(cString: filter)
135-
}
136-
/// Entire App bundle tracing.
137-
if let exclude = getenv(INJECTION_TRACE_ALL) {
138-
if exclude[0] == UInt8(ascii: "|") {
139-
SwiftTrace.defaultMethodExclusions += String(cString: exclude)
140-
}
141-
SwiftTrace.interposeEclusions = SwiftTrace.exclusionRegexp
142-
appBundleImages { imageName, _, _ in
143-
if SwiftTrace.interposeMethods(inBundlePath: imageName) == 0,
144-
strstr(imageName, "XCT") == nil {
145-
self.error("""
146-
Unable to interpose to trace image \
147-
\(String(cString: imageName)), have you added \
148-
"Other Linker Flags" -Xlinker -interposable
149-
""")
150-
}
151-
SwiftTrace.trace(bundlePath: imageName)
152-
}
153-
}
154-
/// Trace calls to framework e.g. SwiftUI,SwiftUICore
155-
if let which = getenv(INJECTION_TRACE_FRAMEWORKS) {
156-
var frmwks = String(cString: which)
157-
if frmwks == "" || frmwks == "1" { frmwks = "SwiftUI,SwiftUICore" }
158-
for frmwk in frmwks.components(separatedBy: ",") {
159-
if let dylib = DLKit.imageMap[frmwk] {
160-
Self.target = dylib
161-
appBundleImages { path, header, slide in
162-
rebind_symbols_trace(autoBitCast(header), slide, Self.tracer)
163-
}
164-
} else {
165-
error("Invalid trace framework \(frmwk)")
166-
}
167-
}
168-
}
169-
// Trace UIKit internals using swizzling
170-
if let which = getenv(INJECTION_TRACE_UIKIT) {
171-
var frmwks = String(cString: which)
172-
if frmwks == "" || frmwks == "1" { frmwks = "UIKitCore" }
173-
for frmwk in frmwks.components(separatedBy: ",") {
174-
if let bundle = DLKit.imageMap[frmwk]?.imageName {
175-
SwiftTrace.trace(bundlePath: bundle)
176-
} else {
177-
error("Invalid swizzle framework \(frmwk)")
178-
}
179-
}
180-
}
181-
/// Function and class method tracing on injection.
182-
if getenv(INJECTION_TRACE) != nil {
183-
Reloader.traceHook = { (injected, name) in
184-
let name = SwiftMeta.demangle(symbol: name) ?? String(cString: name)
185-
detail("SwiftTracing \(name)")
186-
return autoBitCast(SwiftTrace.trace(name: name, original: injected)) ?? injected
122+
for name in [INJECTION_TRACE_LOOKUP, INJECTION_TRACE_LOOKUP, INJECTION_TRACE_FILTER,
123+
INJECTION_TRACE_ALL, INJECTION_TRACE_FRAMEWORKS, INJECTION_TRACE_UIKIT,
124+
INJECTION_TRACE] {
125+
if let value = getenv(name) {
126+
setVariable(name: name, to: String(cString: value), first: true)
187127
}
188128
}
189129
}
@@ -285,67 +225,7 @@ open class InjectionNext: SimpleSocket {
285225
}
286226
case .setenv:
287227
if let name = readString(), let value = readString() {
288-
if value == UNSETENV_VALUE {
289-
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)
348-
}
228+
setVariable(name: name, to: value, first: false)
349229
}
350230
case .EOF:
351231
return
@@ -355,5 +235,71 @@ open class InjectionNext: SimpleSocket {
355235
}
356236
}
357237
}
238+
239+
func setVariable(name: String, to value: String, first: Bool) {
240+
if value == UNSETENV_VALUE {
241+
unsetenv(name)
242+
} else {
243+
if name == INJECTION_TRACE_FILTER {
244+
SwiftTrace.traceFilterInclude = value
245+
} else if first || getenv(name) == nil {
246+
switch name {
247+
case INJECTION_TRACE_LOOKUP:
248+
if value.hasPrefix("|") {
249+
SwiftTrace.defaultLookupExclusions += value
250+
}
251+
SwiftTrace.typeLookup = true
252+
case INJECTION_TRACE_ALL:
253+
if value.hasPrefix("|") {
254+
SwiftTrace.defaultMethodExclusions += value
255+
}
256+
SwiftTrace.interposeEclusions = SwiftTrace.exclusionRegexp
257+
appBundleImages { imageName, _, _ in
258+
if SwiftTrace.interposeMethods(inBundlePath: imageName) == 0,
259+
strstr(imageName, "XCT") == nil {
260+
self.error("""
261+
Unable to interpose to trace image \
262+
\(String(cString: imageName)), have you added \
263+
"Other Linker Flags" -Xlinker -interposable
264+
""")
265+
}
266+
SwiftTrace.trace(bundlePath: imageName)
267+
}
268+
case INJECTION_TRACE_FRAMEWORKS:
269+
var frmwks = value
270+
if frmwks == "" || frmwks == "1" { frmwks = "SwiftUI,SwiftUICore" }
271+
for frmwk in frmwks.components(separatedBy: ",") {
272+
if let dylib = DLKit.imageMap[frmwk] {
273+
Self.target = dylib
274+
appBundleImages { path, header, slide in
275+
rebind_symbols_trace(autoBitCast(header), slide, Self.tracer)
276+
}
277+
} else {
278+
error("Invalid trace framework \(frmwk)")
279+
}
280+
}
281+
case INJECTION_TRACE_UIKIT:
282+
var frmwks = value
283+
if frmwks == "" || frmwks == "1" { frmwks = "UIKitCore" }
284+
for frmwk in frmwks.components(separatedBy: ",") {
285+
if let bundle = DLKit.imageMap[frmwk]?.imageName {
286+
SwiftTrace.trace(bundlePath: bundle)
287+
} else {
288+
error("Invalid swizzle framework \(frmwk)")
289+
}
290+
}
291+
case INJECTION_TRACE:
292+
Reloader.traceHook = { (injected, name) in
293+
let name = SwiftMeta.demangle(symbol: name) ?? String(cString: name)
294+
detail("SwiftTracing \(name)")
295+
return autoBitCast(SwiftTrace.trace(name: name, original: injected)) ?? injected
296+
}
297+
default:
298+
break
299+
}
300+
}
301+
setenv(name, value, 1)
302+
}
303+
}
358304
}
359305
#endif

0 commit comments

Comments
 (0)