@@ -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