memorydetective 1.8.1 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +75 -1
- package/README.md +84 -15
- package/USAGE.md +27 -4
- package/dist/cli.js +106 -3
- package/dist/cli.js.map +1 -1
- package/dist/index.js +42 -22
- package/dist/index.js.map +1 -1
- package/dist/parsers/referenceTree.d.ts +111 -0
- package/dist/parsers/referenceTree.js +328 -0
- package/dist/parsers/referenceTree.js.map +1 -0
- package/dist/runtime/axe.js +6 -1
- package/dist/runtime/axe.js.map +1 -1
- package/dist/runtime/exec.d.ts +30 -0
- package/dist/runtime/exec.js +30 -3
- package/dist/runtime/exec.js.map +1 -1
- package/dist/runtime/fixTemplates.js +67 -0
- package/dist/runtime/fixTemplates.js.map +1 -1
- package/dist/runtime/leakReport.d.ts +62 -0
- package/dist/runtime/leakReport.js +138 -0
- package/dist/runtime/leakReport.js.map +1 -0
- package/dist/runtime/platformCheck.d.ts +54 -0
- package/dist/runtime/platformCheck.js +94 -0
- package/dist/runtime/platformCheck.js.map +1 -0
- package/dist/runtime/redact.d.ts +66 -0
- package/dist/runtime/redact.js +146 -0
- package/dist/runtime/redact.js.map +1 -0
- package/dist/runtime/responseFormatter.d.ts +78 -0
- package/dist/runtime/responseFormatter.js +307 -0
- package/dist/runtime/responseFormatter.js.map +1 -0
- package/dist/runtime/securityFlags.d.ts +74 -0
- package/dist/runtime/securityFlags.js +90 -0
- package/dist/runtime/securityFlags.js.map +1 -0
- package/dist/runtime/staticAnalysisHints.js +14 -1
- package/dist/runtime/staticAnalysisHints.js.map +1 -1
- package/dist/templates/leak-report.html +39 -0
- package/dist/templates/templates/leak-report.html +39 -0
- package/dist/tools/analyzeAbandonedMemory.d.ts +162 -0
- package/dist/tools/analyzeAbandonedMemory.js +325 -0
- package/dist/tools/analyzeAbandonedMemory.js.map +1 -0
- package/dist/tools/analyzeAllocations.d.ts +11 -2
- package/dist/tools/analyzeAllocations.js +4 -0
- package/dist/tools/analyzeAllocations.js.map +1 -1
- package/dist/tools/analyzeAnimationHitches.d.ts +32 -2
- package/dist/tools/analyzeAnimationHitches.js +25 -4
- package/dist/tools/analyzeAnimationHitches.js.map +1 -1
- package/dist/tools/analyzeAppLaunch.d.ts +3 -0
- package/dist/tools/analyzeAppLaunch.js +2 -0
- package/dist/tools/analyzeAppLaunch.js.map +1 -1
- package/dist/tools/analyzeHangs.d.ts +78 -2
- package/dist/tools/analyzeHangs.js +117 -4
- package/dist/tools/analyzeHangs.js.map +1 -1
- package/dist/tools/analyzeMemgraph.d.ts +40 -1
- package/dist/tools/analyzeMemgraph.js +66 -2
- package/dist/tools/analyzeMemgraph.js.map +1 -1
- package/dist/tools/analyzeTimeProfile.d.ts +11 -1
- package/dist/tools/analyzeTimeProfile.js +5 -0
- package/dist/tools/analyzeTimeProfile.js.map +1 -1
- package/dist/tools/bootAndLaunchForLeakInvestigation.d.ts +18 -9
- package/dist/tools/bootAndLaunchForLeakInvestigation.js +27 -0
- package/dist/tools/bootAndLaunchForLeakInvestigation.js.map +1 -1
- package/dist/tools/captureMemgraph.d.ts +22 -4
- package/dist/tools/captureMemgraph.js +42 -9
- package/dist/tools/captureMemgraph.js.map +1 -1
- package/dist/tools/captureScenarioState.d.ts +12 -4
- package/dist/tools/captureScenarioState.js +4 -0
- package/dist/tools/captureScenarioState.js.map +1 -1
- package/dist/tools/classifyCycle.js +77 -0
- package/dist/tools/classifyCycle.js.map +1 -1
- package/dist/tools/cleanupTraces.d.ts +87 -0
- package/dist/tools/cleanupTraces.js +232 -0
- package/dist/tools/cleanupTraces.js.map +1 -0
- package/dist/tools/compareTracesByPattern.d.ts +2 -2
- package/dist/tools/detectLeaksInXCTest.d.ts +116 -0
- package/dist/tools/detectLeaksInXCTest.js +311 -0
- package/dist/tools/detectLeaksInXCTest.js.map +1 -0
- package/dist/tools/detectLeaksInXCUITest.d.ts +8 -3
- package/dist/tools/detectLeaksInXCUITest.js +30 -4
- package/dist/tools/detectLeaksInXCUITest.js.map +1 -1
- package/dist/tools/diffMemgraphs.d.ts +5 -2
- package/dist/tools/diffMemgraphs.js +2 -0
- package/dist/tools/diffMemgraphs.js.map +1 -1
- package/dist/tools/findCycles.d.ts +1 -1
- package/dist/tools/recordTimeProfile.d.ts +29 -9
- package/dist/tools/recordTimeProfile.js +70 -7
- package/dist/tools/recordTimeProfile.js.map +1 -1
- package/dist/tools/renderCycleGraph.d.ts +1 -1
- package/dist/tools/verifyFix.d.ts +2 -2
- package/dist/types.d.ts +24 -1
- package/package.json +3 -3
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser for `leaks <memgraph> --referenceTree --groupByType --noContent`.
|
|
3
|
+
*
|
|
4
|
+
* `leaks --referenceTree` walks the heap reachability graph and prints
|
|
5
|
+
* per-class instance counts plus total bytes. With `--groupByType`, instances
|
|
6
|
+
* of the same class are aggregated into a single entry; with `--noContent`,
|
|
7
|
+
* the inline ivar dumps are suppressed so the tree stays compact.
|
|
8
|
+
*
|
|
9
|
+
* Example input (excerpt from a real run on a notelet-like target):
|
|
10
|
+
*
|
|
11
|
+
* ```text
|
|
12
|
+
* + ! : 342 (28.8K) AVPlayerItem
|
|
13
|
+
* + ! : | 334 (28.7K) _playerItem --> AVPlayerItemInternal
|
|
14
|
+
* + ! : 290 (19.1K) AVPlayerPlaybackCoordinator
|
|
15
|
+
* + ! 1 (48 bytes) __strong _object --> NSKeyValueObservance
|
|
16
|
+
* + ! 15 (720 bytes) __strong _object --> NSKeyValueObservance
|
|
17
|
+
* + ! 8 (384 bytes) NSKeyValueObservance
|
|
18
|
+
* + ! 9 (400 bytes) NSKeyValueObservationInfo
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* Each data line has the shape:
|
|
22
|
+
*
|
|
23
|
+
* <tree indent> <count> (<size>) <name> [--> <className>]
|
|
24
|
+
*
|
|
25
|
+
* - When `--> ClassName` is present, the class name is the part AFTER the
|
|
26
|
+
* arrow (the value's type). The text before the arrow is the property /
|
|
27
|
+
* ivar name pointing at it.
|
|
28
|
+
* - When no arrow is present, the trailing token IS the class name.
|
|
29
|
+
*
|
|
30
|
+
* memorydetective's abandoned-memory surface aggregates by class name across
|
|
31
|
+
* the entire tree, summing counts and bytes, and returns the top N by
|
|
32
|
+
* instance count. The use case is "show me classes that are alive in the
|
|
33
|
+
* heap that the agent should suspect", which is orthogonal to leak count.
|
|
34
|
+
*/
|
|
35
|
+
const LINE_RE =
|
|
36
|
+
// Tree indent prefix is arbitrary, just match anything up to a sequence of digits at the start of the value column.
|
|
37
|
+
// Capture: 1=count, 2=size literal (e.g. "832 bytes", "28.8K", "1.5M")
|
|
38
|
+
// Then the trailing label, optionally containing "-->".
|
|
39
|
+
/(?:^|\s)(\d+)\s+\(([^)]+)\)\s+(.+?)\s*$/;
|
|
40
|
+
const KILO = 1024;
|
|
41
|
+
/**
|
|
42
|
+
* Pure: parse a size literal from leaks output like "832 bytes", "28.8K", "1.5M".
|
|
43
|
+
* Returns the value in BYTES. Unrecognized formats return 0 (parser is
|
|
44
|
+
* conservative; the aggregation that consumes this still produces a usable
|
|
45
|
+
* count even if the size is missing).
|
|
46
|
+
*/
|
|
47
|
+
export function parseSizeBytes(raw) {
|
|
48
|
+
const trimmed = raw.trim();
|
|
49
|
+
const m = /^([0-9]+(?:\.[0-9]+)?)\s*(bytes?|K|M|G)?$/.exec(trimmed);
|
|
50
|
+
if (!m)
|
|
51
|
+
return 0;
|
|
52
|
+
const value = Number.parseFloat(m[1]);
|
|
53
|
+
if (!Number.isFinite(value))
|
|
54
|
+
return 0;
|
|
55
|
+
const unit = (m[2] ?? "bytes").toLowerCase();
|
|
56
|
+
switch (unit) {
|
|
57
|
+
case "byte":
|
|
58
|
+
case "bytes":
|
|
59
|
+
return Math.round(value);
|
|
60
|
+
case "k":
|
|
61
|
+
return Math.round(value * KILO);
|
|
62
|
+
case "m":
|
|
63
|
+
return Math.round(value * KILO * KILO);
|
|
64
|
+
case "g":
|
|
65
|
+
return Math.round(value * KILO * KILO * KILO);
|
|
66
|
+
default:
|
|
67
|
+
return 0;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Pure: extract the class name from a leaks reference-tree line value.
|
|
72
|
+
*
|
|
73
|
+
* - "AVPlayerItem" -> "AVPlayerItem"
|
|
74
|
+
* - "_playerItem --> AVPlayerItemInternal" -> "AVPlayerItemInternal"
|
|
75
|
+
* - "__strong _object --> NSKeyValueObservance" -> "NSKeyValueObservance"
|
|
76
|
+
* - "<CFDictionary 0x6000029c4840> [64]" -> "CFDictionary"
|
|
77
|
+
* - "<NSMutableDictionary 0x600003ccf5c0> [32]" -> "NSMutableDictionary"
|
|
78
|
+
* - "_object --> <NSObject 0x14f100> [16]" -> "NSObject"
|
|
79
|
+
* - "" -> null (caller skips)
|
|
80
|
+
*
|
|
81
|
+
* The `<ClassName 0xADDR> [size]` form is what `leaks --referenceTree` emits
|
|
82
|
+
* for arrow-targeted instances (e.g. `_object --> <NSObject 0xADDR>`).
|
|
83
|
+
* Without normalization, each address becomes its own aggregation key and
|
|
84
|
+
* the same logical class shows up as N separate rows in the top-N list.
|
|
85
|
+
* Normalizing to the base class name (the token inside the `<...>`) folds
|
|
86
|
+
* those rows back together. This is the v1.10 fix for the gap where
|
|
87
|
+
* AVPlayerItem-style classes appeared aggregated at the root level but
|
|
88
|
+
* NSMutableDictionary-style classes appeared per-address in arrow targets.
|
|
89
|
+
*
|
|
90
|
+
* Excludes c-runtime allocations like `malloc in FigSimpleMutex...` AND the
|
|
91
|
+
* bracketed form `<malloc in ...>` / `<calloc in ...>` / `<realloc in ...>`
|
|
92
|
+
* that leaks emits alongside Obj-C/Swift classes; those are not actionable
|
|
93
|
+
* for abandoned-memory triage and would inflate the top-N list with
|
|
94
|
+
* low-signal entries.
|
|
95
|
+
*/
|
|
96
|
+
export function extractClassName(rawLabel) {
|
|
97
|
+
const label = rawLabel.trim();
|
|
98
|
+
if (label.length === 0)
|
|
99
|
+
return null;
|
|
100
|
+
// Resolve `--> Target` arrows first: the class name is the value's type,
|
|
101
|
+
// not the property name that points at it. Then run the allocator + size
|
|
102
|
+
// filters against the resolved candidate so entries like
|
|
103
|
+
// `unaligned --> calloc in quic_stream_allocate` are correctly dropped.
|
|
104
|
+
const arrowIdx = label.indexOf("-->");
|
|
105
|
+
let candidate = arrowIdx >= 0 ? label.slice(arrowIdx + 3).trim() : label;
|
|
106
|
+
if (candidate.length === 0)
|
|
107
|
+
return null;
|
|
108
|
+
// Raw allocator entries (`malloc in ...`, `calloc in ...`) are dropped.
|
|
109
|
+
// Same for the bracketed form: `<malloc in ...>` / `<calloc in ...>`.
|
|
110
|
+
if (/^(malloc|calloc|realloc)\b/i.test(candidate))
|
|
111
|
+
return null;
|
|
112
|
+
if (/^<\s*(malloc|calloc|realloc)\b/i.test(candidate))
|
|
113
|
+
return null;
|
|
114
|
+
// Normalize `<ClassName 0xADDR> [size]` and `<ClassName 0xADDR>` to
|
|
115
|
+
// `ClassName`. The base-class name is the leading token inside `<...>`,
|
|
116
|
+
// before the first space (which separates it from the address).
|
|
117
|
+
const bracketMatch = /^<\s*([^\s<>]+)\s+0x[0-9a-fA-F]+\s*>(?:\s*\[[^\]]+\])?\s*$/.exec(candidate);
|
|
118
|
+
if (bracketMatch) {
|
|
119
|
+
candidate = bracketMatch[1];
|
|
120
|
+
}
|
|
121
|
+
return candidate;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Pure: returns true when the class name is framework-noise that crowds out
|
|
125
|
+
* actionable classes in the abandoned-memory top-N list. Used by the
|
|
126
|
+
* `analyzeMemgraph` and `analyzeAbandonedMemory` tools to populate a
|
|
127
|
+
* `*Suspects[]` / `actionable*[]` field alongside the raw `*Top[]` field.
|
|
128
|
+
*
|
|
129
|
+
* The list catalogs:
|
|
130
|
+
* - Foundation collection types (`NSMutableDictionary`, `CFString`, etc.)
|
|
131
|
+
* that grow with normal app activity and are rarely the leak itself
|
|
132
|
+
* - ObjC runtime / metadata classes (`Class.data`, `OBJC_METACLASS_$...`)
|
|
133
|
+
* - Apple system frameworks' static data sections (`__DATA __bss`,
|
|
134
|
+
* `__DATA __data`, `__DATA __common`)
|
|
135
|
+
* - `<<TOTAL>>` summary row
|
|
136
|
+
* - "Stack of thread N" and similar meta-rows
|
|
137
|
+
* - Non-object zone descriptors and memory-zone metadata
|
|
138
|
+
*
|
|
139
|
+
* Deliberately NOT noise: AV*, NSKeyValueObserv*, SwiftUI app-level types,
|
|
140
|
+
* Combine, RxSwift, app-named classes, anonymous closures (`<closure ...>`).
|
|
141
|
+
*
|
|
142
|
+
* The default behavior of `analyzeMemgraph` continues to return the raw
|
|
143
|
+
* `abandonedMemoryTop[]` so callers who need framework-collection counts
|
|
144
|
+
* (e.g. cache-bloat investigations) still see them. The actionable field
|
|
145
|
+
* is parallel data, not a replacement.
|
|
146
|
+
*/
|
|
147
|
+
export function isFrameworkNoise(className) {
|
|
148
|
+
// Summary / meta-rows
|
|
149
|
+
if (className === "<<TOTAL>>" || className === "<< TOTAL >>")
|
|
150
|
+
return true;
|
|
151
|
+
if (/^Stack of thread\b/i.test(className))
|
|
152
|
+
return true;
|
|
153
|
+
if (/^non-object\b/i.test(className))
|
|
154
|
+
return true;
|
|
155
|
+
// Memory zones / VM regions
|
|
156
|
+
if (/^VM:\s/.test(className))
|
|
157
|
+
return true;
|
|
158
|
+
if (/(DefaultMallocZone|QuartzCore_0x|MALLOC_)/.test(className))
|
|
159
|
+
return true;
|
|
160
|
+
// ObjC runtime + metadata
|
|
161
|
+
if (/^Class\.(data|methodCache)/.test(className))
|
|
162
|
+
return true;
|
|
163
|
+
if (/^OBJC_METACLASS_/.test(className))
|
|
164
|
+
return true;
|
|
165
|
+
if (/^OBJC_CLASS_/.test(className))
|
|
166
|
+
return true;
|
|
167
|
+
// Apple framework static-data sections
|
|
168
|
+
if (/__DATA\s+__(bss|data|common|objc_data|objc_const)/.test(className))
|
|
169
|
+
return true;
|
|
170
|
+
if (/__DATA_DIRTY\b/.test(className))
|
|
171
|
+
return true;
|
|
172
|
+
if (/dylib\s+__DATA/.test(className))
|
|
173
|
+
return true;
|
|
174
|
+
// Block infrastructure (closures, GCD work items)
|
|
175
|
+
if (className === "__NSMallocBlock__")
|
|
176
|
+
return true;
|
|
177
|
+
if (className === "__NSConcreteMallocBlock")
|
|
178
|
+
return true;
|
|
179
|
+
if (className === "__NSStackBlock__")
|
|
180
|
+
return true;
|
|
181
|
+
if (className === "__NSGlobalBlock__")
|
|
182
|
+
return true;
|
|
183
|
+
// Swift runtime metadata
|
|
184
|
+
if (className === "Swift Metadata")
|
|
185
|
+
return true;
|
|
186
|
+
if (/^Swift\.OpaqueExistentialContainer\b/.test(className))
|
|
187
|
+
return true;
|
|
188
|
+
// GCD infrastructure (queue + group + semaphore types accumulate naturally).
|
|
189
|
+
// No word-boundary because `dispatch_queue_t` / `dispatch_semaphore_t`
|
|
190
|
+
// continue with `_t` after the type name (no `\b` between word chars).
|
|
191
|
+
if (/^dispatch_(queue|group|semaphore|source|io)(_t)?\b/.test(className))
|
|
192
|
+
return true;
|
|
193
|
+
// C++ stdlib bookkeeping
|
|
194
|
+
if (/^std::__shared_ptr_emplace</.test(className))
|
|
195
|
+
return true;
|
|
196
|
+
if (/^std::__1::shared_ptr</.test(className))
|
|
197
|
+
return true;
|
|
198
|
+
// Foundation key/value/map collections (scale with app activity, rarely
|
|
199
|
+
// the actionable leak site)
|
|
200
|
+
if (/^NSMapTable\b/.test(className))
|
|
201
|
+
return true;
|
|
202
|
+
if (/^NSHashTable\b/.test(className))
|
|
203
|
+
return true;
|
|
204
|
+
// Bundle metadata (loads + caches grow naturally with app activity)
|
|
205
|
+
if (className === "NSBundle" || className === "CFBundle")
|
|
206
|
+
return true;
|
|
207
|
+
// Network.framework / XPC / BackBoardServices internal types
|
|
208
|
+
if (/^OS_(nw|xpc|os_lock|object)_/.test(className))
|
|
209
|
+
return true;
|
|
210
|
+
if (/^NWConcrete_/.test(className))
|
|
211
|
+
return true;
|
|
212
|
+
if (/^nw_/.test(className))
|
|
213
|
+
return true;
|
|
214
|
+
if (/^BSObjC/.test(className))
|
|
215
|
+
return true;
|
|
216
|
+
// Font cache infrastructure (CoreText)
|
|
217
|
+
if (className === "UICTFont" || className === "TTenuousComponentFont")
|
|
218
|
+
return true;
|
|
219
|
+
// Block/closure infrastructure that leaks(1) labels generically
|
|
220
|
+
if (className === "Closure context (unknown layout)")
|
|
221
|
+
return true;
|
|
222
|
+
// Array storage (Foundation/CoreFoundation backing storage)
|
|
223
|
+
if (/^NSArray\._list/.test(className))
|
|
224
|
+
return true;
|
|
225
|
+
// SwiftUI internal anonymized buffers (private namespaces ending in dollar-tagged module ids).
|
|
226
|
+
// Real app-level SwiftUI types use module-qualified names like `MyApp.MyView`;
|
|
227
|
+
// these anonymized SwiftUI internals scale with view-graph activity.
|
|
228
|
+
if (/^SwiftUI\.\(.+ in \$[0-9a-f]+\)</.test(className))
|
|
229
|
+
return true;
|
|
230
|
+
// Foundation collection types that grow with normal app activity
|
|
231
|
+
const noiseCollections = new Set([
|
|
232
|
+
"NSMutableDictionary",
|
|
233
|
+
"NSMutableDictionary (Storage)",
|
|
234
|
+
"NSDictionary",
|
|
235
|
+
"NSDictionary (Storage)",
|
|
236
|
+
"NSMutableArray",
|
|
237
|
+
"NSMutableArray (Storage)",
|
|
238
|
+
"NSArray",
|
|
239
|
+
"NSArray (Storage)",
|
|
240
|
+
"NSMutableSet",
|
|
241
|
+
"NSSet",
|
|
242
|
+
"CFString",
|
|
243
|
+
"CFString (Storage)",
|
|
244
|
+
"CFDictionary",
|
|
245
|
+
"CFDictionary (Storage)",
|
|
246
|
+
"CFDictionary (Value Storage)",
|
|
247
|
+
"CFArray",
|
|
248
|
+
"CFSet",
|
|
249
|
+
"CFSet (Value Storage)",
|
|
250
|
+
"CFData",
|
|
251
|
+
"NSData",
|
|
252
|
+
"NSConcreteMutableData",
|
|
253
|
+
"__NSCFString",
|
|
254
|
+
"__NSCFData",
|
|
255
|
+
"__NSCFDictionary",
|
|
256
|
+
"__NSCFArray",
|
|
257
|
+
"NSConcreteAttributedString",
|
|
258
|
+
]);
|
|
259
|
+
if (noiseCollections.has(className))
|
|
260
|
+
return true;
|
|
261
|
+
// Closure contexts and Swift internal storage that scale with app activity
|
|
262
|
+
if (/^Swift\._ContiguousArrayStorage</.test(className))
|
|
263
|
+
return true;
|
|
264
|
+
if (/^Swift\._SwiftDeferredNSDictionary</.test(className))
|
|
265
|
+
return true;
|
|
266
|
+
// Anonymous bracketed instances that still leaked through (extractClassName
|
|
267
|
+
// missed them, e.g. closures with no class name).
|
|
268
|
+
if (/^<[^>]*0x[0-9a-fA-F]+>/.test(className))
|
|
269
|
+
return true;
|
|
270
|
+
// Foundation observer registry internals (these grow with KVO activity but
|
|
271
|
+
// are not the actionable site; the user's class is what to fix).
|
|
272
|
+
if (className === "CFXNotificationRegistrar")
|
|
273
|
+
return true;
|
|
274
|
+
if (/^_realloc in/.test(className))
|
|
275
|
+
return true;
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Pure: parse `leaks --referenceTree --groupByType --noContent` stdout,
|
|
280
|
+
* aggregate instance counts + bytes by class name, return the top N by
|
|
281
|
+
* instance count.
|
|
282
|
+
*
|
|
283
|
+
* Returned entries are sorted by `instanceCount` desc, ties broken by
|
|
284
|
+
* `totalBytes` desc, ties broken by alphabetic class name for stability.
|
|
285
|
+
*
|
|
286
|
+
* The caller passes `topN` so very large heaps do not produce massive
|
|
287
|
+
* responses; the default in the tool is 20 but the parser does not impose
|
|
288
|
+
* a default to keep the function pure.
|
|
289
|
+
*/
|
|
290
|
+
export function parseReferenceTreeText(text, topN) {
|
|
291
|
+
if (topN <= 0)
|
|
292
|
+
return [];
|
|
293
|
+
const counts = new Map();
|
|
294
|
+
for (const line of text.split(/\r?\n/)) {
|
|
295
|
+
const m = LINE_RE.exec(line);
|
|
296
|
+
if (!m)
|
|
297
|
+
continue;
|
|
298
|
+
const count = Number.parseInt(m[1], 10);
|
|
299
|
+
if (!Number.isFinite(count) || count <= 0)
|
|
300
|
+
continue;
|
|
301
|
+
const sizeBytes = parseSizeBytes(m[2]);
|
|
302
|
+
const className = extractClassName(m[3]);
|
|
303
|
+
if (className == null)
|
|
304
|
+
continue;
|
|
305
|
+
const existing = counts.get(className);
|
|
306
|
+
if (existing) {
|
|
307
|
+
existing.instanceCount += count;
|
|
308
|
+
existing.totalBytes += sizeBytes;
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
counts.set(className, { instanceCount: count, totalBytes: sizeBytes });
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
const entries = Array.from(counts, ([className, v]) => ({
|
|
315
|
+
className,
|
|
316
|
+
instanceCount: v.instanceCount,
|
|
317
|
+
totalBytes: v.totalBytes,
|
|
318
|
+
}));
|
|
319
|
+
entries.sort((a, b) => {
|
|
320
|
+
if (b.instanceCount !== a.instanceCount)
|
|
321
|
+
return b.instanceCount - a.instanceCount;
|
|
322
|
+
if (b.totalBytes !== a.totalBytes)
|
|
323
|
+
return b.totalBytes - a.totalBytes;
|
|
324
|
+
return a.className.localeCompare(b.className);
|
|
325
|
+
});
|
|
326
|
+
return entries.slice(0, topN);
|
|
327
|
+
}
|
|
328
|
+
//# sourceMappingURL=referenceTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"referenceTree.js","sourceRoot":"","sources":["../../src/parsers/referenceTree.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/axe.js
CHANGED
|
@@ -84,7 +84,12 @@ function normalizeAxeNode(raw) {
|
|
|
84
84
|
]);
|
|
85
85
|
if (labelKey != null)
|
|
86
86
|
out.label = labelKey;
|
|
87
|
-
const idKey = pickFirstString(obj, [
|
|
87
|
+
const idKey = pickFirstString(obj, [
|
|
88
|
+
"AXIdentifier",
|
|
89
|
+
"AXUniqueId",
|
|
90
|
+
"identifier",
|
|
91
|
+
"id",
|
|
92
|
+
]);
|
|
88
93
|
if (idKey != null)
|
|
89
94
|
out.identifier = idKey;
|
|
90
95
|
const roleKey = pickFirstString(obj, ["AXRole", "role", "type"]);
|
package/dist/runtime/axe.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axe.js","sourceRoot":"","sources":["../../src/runtime/axe.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"axe.js","sourceRoot":"","sources":["../../src/runtime/axe.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/exec.d.ts
CHANGED
|
@@ -2,6 +2,15 @@ export interface CommandResult {
|
|
|
2
2
|
stdout: string;
|
|
3
3
|
stderr: string;
|
|
4
4
|
code: number;
|
|
5
|
+
/**
|
|
6
|
+
* Present and `true` when the command was terminated by the
|
|
7
|
+
* `gracefulKillAfterMs` timeout-escalation path. Tools that wrote
|
|
8
|
+
* partial output before the timeout (e.g. `xctrace record` which
|
|
9
|
+
* incrementally flushes the `.trace` bundle) can return that output
|
|
10
|
+
* to the caller alongside this flag, rather than the caller having
|
|
11
|
+
* to choose between "throw on timeout" and "no timeout protection".
|
|
12
|
+
*/
|
|
13
|
+
timedOut?: boolean;
|
|
5
14
|
}
|
|
6
15
|
export interface RunCommandOptions {
|
|
7
16
|
/** Working directory to run the command in. */
|
|
@@ -15,6 +24,27 @@ export interface RunCommandOptions {
|
|
|
15
24
|
* unchanged; pass `undefined` (or omit) for the same default.
|
|
16
25
|
*/
|
|
17
26
|
env?: Record<string, string>;
|
|
27
|
+
/**
|
|
28
|
+
* Signal to send when the command exceeds `timeoutMs`. Defaults to
|
|
29
|
+
* `SIGTERM`. Pass `SIGINT` for processes that flush partial output on
|
|
30
|
+
* graceful interruption (e.g. xctrace writes the `.trace` bundle
|
|
31
|
+
* incrementally and needs SIGINT to finalize template metadata; SIGTERM
|
|
32
|
+
* leaves a corrupt trace that fails on export).
|
|
33
|
+
*/
|
|
34
|
+
timeoutSignal?: NodeJS.Signals;
|
|
35
|
+
/**
|
|
36
|
+
* When `> 0`, switches the timeout path from "kill + reject" to
|
|
37
|
+
* "graceful kill + resolve with partial output". On timeout: send
|
|
38
|
+
* `timeoutSignal`, wait this many ms for the child to exit, then
|
|
39
|
+
* escalate to SIGKILL if still alive. The promise resolves with the
|
|
40
|
+
* partial stdout/stderr + `timedOut: true` on the response, instead
|
|
41
|
+
* of rejecting with a timeout error.
|
|
42
|
+
*
|
|
43
|
+
* Use when partial output is meaningful (xctrace traces, long-running
|
|
44
|
+
* recordings, etc.). Default `0` preserves the historical
|
|
45
|
+
* "reject-on-timeout" behavior for all existing callers.
|
|
46
|
+
*/
|
|
47
|
+
gracefulKillAfterMs?: number;
|
|
18
48
|
}
|
|
19
49
|
/**
|
|
20
50
|
* Run a command and collect stdout/stderr. Does not throw on non-zero exit code,
|
package/dist/runtime/exec.js
CHANGED
|
@@ -17,10 +17,28 @@ export function runCommand(cmd, args, opts = {}) {
|
|
|
17
17
|
let stderr = "";
|
|
18
18
|
let killedByTimeout = false;
|
|
19
19
|
let timer;
|
|
20
|
+
let escalationTimer;
|
|
21
|
+
const timeoutSignal = opts.timeoutSignal ?? "SIGTERM";
|
|
22
|
+
const graceful = opts.gracefulKillAfterMs != null && opts.gracefulKillAfterMs > 0;
|
|
20
23
|
if (opts.timeoutMs && opts.timeoutMs > 0) {
|
|
21
24
|
timer = setTimeout(() => {
|
|
22
25
|
killedByTimeout = true;
|
|
23
|
-
child.kill(
|
|
26
|
+
child.kill(timeoutSignal);
|
|
27
|
+
if (graceful) {
|
|
28
|
+
// SIGKILL escalation: if the child does not exit cleanly within
|
|
29
|
+
// the grace window after the soft signal, force it down so the
|
|
30
|
+
// promise still settles. SIGKILL is irrecoverable but guarantees
|
|
31
|
+
// termination even if the process is wedged on a kernel call.
|
|
32
|
+
escalationTimer = setTimeout(() => {
|
|
33
|
+
try {
|
|
34
|
+
child.kill("SIGKILL");
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Child may already be gone between the check and the kill;
|
|
38
|
+
// ignore. The `close` handler will still fire.
|
|
39
|
+
}
|
|
40
|
+
}, opts.gracefulKillAfterMs);
|
|
41
|
+
}
|
|
24
42
|
}, opts.timeoutMs);
|
|
25
43
|
}
|
|
26
44
|
child.stdout.on("data", (chunk) => {
|
|
@@ -32,16 +50,25 @@ export function runCommand(cmd, args, opts = {}) {
|
|
|
32
50
|
child.on("error", (err) => {
|
|
33
51
|
if (timer)
|
|
34
52
|
clearTimeout(timer);
|
|
53
|
+
if (escalationTimer)
|
|
54
|
+
clearTimeout(escalationTimer);
|
|
35
55
|
reject(err);
|
|
36
56
|
});
|
|
37
57
|
child.on("close", (code) => {
|
|
38
58
|
if (timer)
|
|
39
59
|
clearTimeout(timer);
|
|
40
|
-
if (
|
|
60
|
+
if (escalationTimer)
|
|
61
|
+
clearTimeout(escalationTimer);
|
|
62
|
+
if (killedByTimeout && !graceful) {
|
|
41
63
|
reject(new Error(`Command timed out after ${opts.timeoutMs}ms: ${cmd} ${args.join(" ")}`));
|
|
42
64
|
return;
|
|
43
65
|
}
|
|
44
|
-
resolve({
|
|
66
|
+
resolve({
|
|
67
|
+
stdout,
|
|
68
|
+
stderr,
|
|
69
|
+
code: code ?? -1,
|
|
70
|
+
...(killedByTimeout ? { timedOut: true } : {}),
|
|
71
|
+
});
|
|
45
72
|
});
|
|
46
73
|
});
|
|
47
74
|
}
|
package/dist/runtime/exec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/runtime/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/runtime/exec.ts"],"names":[],"mappings":"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"}
|
|
@@ -720,6 +720,73 @@ class WebBridge: NSObject, WKScriptMessageHandler {
|
|
|
720
720
|
// ─────────────────────────────────────────────────────────────────────────
|
|
721
721
|
// v1.7 catalog
|
|
722
722
|
// ─────────────────────────────────────────────────────────────────────────
|
|
723
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
724
|
+
// v1.9 catalog (DebugSwift borrow)
|
|
725
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
726
|
+
"uikit.viewcontroller-retained-after-pop": {
|
|
727
|
+
before: `final class FeedViewController: UIViewController {
|
|
728
|
+
private var loader: FeedDataLoader?
|
|
729
|
+
|
|
730
|
+
override func viewDidLoad() {
|
|
731
|
+
super.viewDidLoad()
|
|
732
|
+
loader = FeedDataLoader()
|
|
733
|
+
loader?.onUpdate = { items in
|
|
734
|
+
self.tableView.reload(with: items) // strong capture -> VC outlives navigation
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
}`,
|
|
738
|
+
after: `final class FeedViewController: UIViewController {
|
|
739
|
+
private var loader: FeedDataLoader?
|
|
740
|
+
|
|
741
|
+
override func viewDidLoad() {
|
|
742
|
+
super.viewDidLoad()
|
|
743
|
+
loader = FeedDataLoader()
|
|
744
|
+
loader?.onUpdate = { [weak self] items in
|
|
745
|
+
self?.tableView.reload(with: items)
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
deinit {
|
|
750
|
+
loader?.onUpdate = nil // belt and suspenders for KVO/NotificationCenter wiring
|
|
751
|
+
}
|
|
752
|
+
}`,
|
|
753
|
+
notes: "Symptom: VC is alive in the heap but no _parentViewController / _presentingViewController edge appears in the cycle. Audit closures captured in viewDidLoad, Task { } blocks, KVO observations, and delegate properties without weak.",
|
|
754
|
+
},
|
|
755
|
+
"swiftui.observable-write-on-every-render": {
|
|
756
|
+
before: `@Observable
|
|
757
|
+
final class FeedModel {
|
|
758
|
+
var items: [Item] = []
|
|
759
|
+
var lastUpdated: Date = .now
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
struct FeedView: View {
|
|
763
|
+
@State private var model = FeedModel()
|
|
764
|
+
var body: some View {
|
|
765
|
+
List(model.items) { row in Text(row.title) }
|
|
766
|
+
.onAppear {
|
|
767
|
+
model.lastUpdated = .now // ⚠️ mutating inside body chain triggers re-render forever
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
}`,
|
|
771
|
+
after: `@Observable
|
|
772
|
+
final class FeedModel {
|
|
773
|
+
var items: [Item] = []
|
|
774
|
+
var lastUpdated: Date = .now
|
|
775
|
+
|
|
776
|
+
var lastUpdatedLabel: String { lastUpdated.formatted(.dateTime) } // derived, no mutation
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
struct FeedView: View {
|
|
780
|
+
@State private var model = FeedModel()
|
|
781
|
+
var body: some View {
|
|
782
|
+
List(model.items) { row in Text(row.title) }
|
|
783
|
+
.task(id: model.items) { // event-driven, fires once per items change
|
|
784
|
+
model.lastUpdated = .now
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
}`,
|
|
788
|
+
notes: "Move the mutation out of body. Use a computed property for derived values, or attach the side effect to .onChange / .task(id:) / .onAppear so it fires in response to an event, not on every render.",
|
|
789
|
+
},
|
|
723
790
|
"swiftdata.modelcontext-actor-cycle": {
|
|
724
791
|
before: `actor DataLayer {
|
|
725
792
|
let context: ModelContext
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixTemplates.js","sourceRoot":"","sources":["../../src/runtime/fixTemplates.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fixTemplates.js","sourceRoot":"","sources":["../../src/runtime/fixTemplates.ts"],"names":[],"mappings":"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"}
|