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