@@ -88,6 +88,18 @@ internal struct Output: TextOutputStream {
88
88
}
89
89
}
90
90
91
+ internal func dumpJson( of: ( any Encodable ) , outputFile: String ? ) throws {
92
+ let encoder = JSONEncoder ( )
93
+ encoder. outputFormatting = [ . prettyPrinted, . sortedKeys]
94
+ let data = try encoder. encode ( of)
95
+ let jsonOutput = String ( data: data, encoding: . utf8) !
96
+ if let outputFile = outputFile {
97
+ try jsonOutput. write ( toFile: outputFile, atomically: true , encoding: . utf8)
98
+ } else {
99
+ print ( jsonOutput)
100
+ }
101
+ }
102
+
91
103
internal struct DumpGenericMetadata : ParsableCommand {
92
104
static let configuration = CommandConfiguration (
93
105
abstract: " Print the target's generic metadata allocations. " )
@@ -99,7 +111,10 @@ internal struct DumpGenericMetadata: ParsableCommand {
99
111
var backtraceOptions : BacktraceOptions
100
112
101
113
@OptionGroup ( )
102
- var genericMetadataOptions : GenericMetadataOptions
114
+ var metadataOptions : MetadataOptions
115
+
116
+ @Flag ( help: " Show allocations in mangled form " )
117
+ var mangled : Bool = false
103
118
104
119
func run( ) throws {
105
120
disableStdErrBuffer ( )
@@ -126,7 +141,7 @@ internal struct DumpGenericMetadata: ParsableCommand {
126
141
127
142
return Metadata ( ptr: pointer,
128
143
allocation: allocation,
129
- name: process. context. name ( type: pointer, mangled: genericMetadataOptions . mangled) ?? " <unknown> " ,
144
+ name: process. context. name ( type: pointer, mangled: mangled) ?? " <unknown> " ,
130
145
isArrayOfClass: process. context. isArrayOfClass ( pointer) ,
131
146
garbage: garbage,
132
147
backtrace: currentBacktrace)
@@ -146,30 +161,30 @@ internal struct DumpGenericMetadata: ParsableCommand {
146
161
}
147
162
}
148
163
149
- if genericMetadataOptions . json {
164
+ if metadataOptions . json {
150
165
let processMetadata = ProcessMetadata ( name: process. processName,
151
166
pid: process. processIdentifier as! ProcessIdentifier ,
152
167
metadata: generics)
153
168
allProcesses. append ( processMetadata)
154
- } else if !genericMetadataOptions . summary {
169
+ } else if !metadataOptions . summary {
155
170
try dumpText ( process: process, generics: generics)
156
171
}
157
172
} // inspect
158
173
159
- if genericMetadataOptions . json {
160
- if genericMetadataOptions . summary {
161
- try dumpJson ( of: metadataSummary)
174
+ if metadataOptions . json {
175
+ if metadataOptions . summary {
176
+ try dumpJson ( of: metadataSummary, outputFile : metadataOptions . outputFile )
162
177
} else {
163
- try dumpJson ( of: allProcesses)
178
+ try dumpJson ( of: allProcesses, outputFile : metadataOptions . outputFile )
164
179
}
165
- } else if genericMetadataOptions . summary {
180
+ } else if metadataOptions . summary {
166
181
try dumpTextSummary ( of: metadataSummary)
167
182
}
168
183
}
169
184
170
185
private func dumpText( process: any RemoteProcess , generics: [ Metadata ] ) throws {
171
186
var erroneousMetadata : [ ( ptr: swift_reflection_ptr_t , name: String ) ] = [ ]
172
- var output = try Output ( genericMetadataOptions . outputFile)
187
+ var output = try Output ( metadataOptions . outputFile)
173
188
print ( " \( process. processName) ( \( process. processIdentifier) ): \n " , to: & output)
174
189
print ( " Address " , " Allocation " , " Size " , " Offset " , " isArrayOfClass " , " Name " , separator: " \t " , to: & output)
175
190
generics. forEach {
@@ -198,20 +213,8 @@ internal struct DumpGenericMetadata: ParsableCommand {
198
213
print ( " " , to: & output)
199
214
}
200
215
201
- private func dumpJson( of: ( any Encodable ) ) throws {
202
- let encoder = JSONEncoder ( )
203
- encoder. outputFormatting = [ . prettyPrinted, . sortedKeys]
204
- let data = try encoder. encode ( of)
205
- let jsonOutput = String ( data: data, encoding: . utf8) !
206
- if let outputFile = genericMetadataOptions. outputFile {
207
- try jsonOutput. write ( toFile: outputFile, atomically: true , encoding: . utf8)
208
- } else {
209
- print ( jsonOutput)
210
- }
211
- }
212
-
213
216
private func dumpTextSummary( of: [ String : MetadataSummary ] ) throws {
214
- var output = try Output ( genericMetadataOptions . outputFile)
217
+ var output = try Output ( metadataOptions . outputFile)
215
218
print ( " Size " , " Owners " , " Name " , separator: " \t " , to: & output)
216
219
var totalSize = 0
217
220
var unknownSize = 0
0 commit comments