@@ -33,6 +33,9 @@ internal struct DumpGenericMetadata: ParsableCommand {
3333 @OptionGroup ( )
3434 var backtraceOptions : BacktraceOptions
3535
36+ @OptionGroup ( )
37+ var genericMetadataOptions : GenericMetadataOptions
38+
3639 func run( ) throws {
3740 try inspect ( options: options) { process in
3841 let allocations : [ swift_metadata_allocation_t ] =
@@ -43,9 +46,8 @@ internal struct DumpGenericMetadata: ParsableCommand {
4346 if pointer == 0 { return nil }
4447
4548 return Metadata ( ptr: pointer,
46- allocation: allocations. last ( where: { pointer >= $0. ptr } ) ,
47- name: process. context. name ( type: pointer) ??
48- " <unknown> " ,
49+ allocation: allocations. last ( where: { pointer >= $0. ptr && pointer < $0. ptr + UInt64( $0. size) } ) ,
50+ name: ( process. context. name ( type: pointer, mangled: genericMetadataOptions. mangled) ?? " <unknown> " ) ,
4951 isArrayOfClass: process. context. isArrayOfClass ( pointer) )
5052 }
5153
@@ -54,12 +56,17 @@ internal struct DumpGenericMetadata: ParsableCommand {
5456 ? nil
5557 : try process. context. allocationStacks
5658
59+ var errorneousMetadata : [ ( ptr: swift_reflection_ptr_t , name: String ) ] = [ ]
60+
5761 print ( " Address " , " Allocation " , " Size " , " Offset " , " isArrayOfClass " , " Name " , separator: " \t " )
5862 generics. forEach {
5963 print ( " \( hex: $0. ptr) " , terminator: " \t " )
6064 if let allocation = $0. allocation, let offset = $0. offset {
6165 print ( " \( hex: allocation. ptr) \t \( allocation. size) \t \( offset) " , terminator: " \t " )
6266 } else {
67+ if ( swift_reflection_ownsAddressStrict ( process. context, UInt ( $0. ptr) ) ) == 0 {
68+ errorneousMetadata. append ( ( ptr: $0. ptr, name: $0. name) )
69+ }
6370 print ( " ??? \t ?? \t ??? " , terminator: " \t " )
6471 }
6572 print ( $0. isArrayOfClass, terminator: " \t " )
@@ -72,6 +79,14 @@ internal struct DumpGenericMetadata: ParsableCommand {
7279 }
7380 }
7481 }
82+
83+ if errorneousMetadata. count > 0 {
84+ print ( " Error: The following metadata was not found in any DATA or AUTH segments, may be garbage. " )
85+ errorneousMetadata. forEach {
86+ print ( " \( hex: $0. ptr) \t \( $0. name) " )
87+ }
88+ }
89+
7590 }
7691 }
7792}
0 commit comments