memorydetective 1.13.0 → 1.15.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 +46 -0
- package/README.md +8 -2
- package/USAGE.md +29 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -1
- package/dist/parsers/schemaDiscovery.d.ts +88 -0
- package/dist/parsers/schemaDiscovery.js +144 -0
- package/dist/parsers/schemaDiscovery.js.map +1 -0
- package/dist/parsers/xctraceXml.d.ts +5 -0
- package/dist/parsers/xctraceXml.js +3 -0
- package/dist/parsers/xctraceXml.js.map +1 -1
- package/dist/tools/analyzeAllocations.d.ts +5 -1
- package/dist/tools/analyzeAllocations.js +17 -1
- package/dist/tools/analyzeAllocations.js.map +1 -1
- package/dist/tools/analyzeAnimationHitches.d.ts +5 -1
- package/dist/tools/analyzeAnimationHitches.js +17 -1
- package/dist/tools/analyzeAnimationHitches.js.map +1 -1
- package/dist/tools/analyzeAppLaunch.d.ts +3 -0
- package/dist/tools/analyzeAppLaunch.js +17 -1
- package/dist/tools/analyzeAppLaunch.js.map +1 -1
- package/dist/tools/analyzeEnergyImpact.d.ts +69 -0
- package/dist/tools/analyzeEnergyImpact.js +239 -0
- package/dist/tools/analyzeEnergyImpact.js.map +1 -0
- package/dist/tools/analyzeHangs.d.ts +63 -3
- package/dist/tools/analyzeHangs.js +143 -19
- package/dist/tools/analyzeHangs.js.map +1 -1
- package/dist/tools/analyzeLeakTimeline.d.ts +75 -0
- package/dist/tools/analyzeLeakTimeline.js +213 -0
- package/dist/tools/analyzeLeakTimeline.js.map +1 -0
- package/dist/tools/analyzeMemoryFootprint.d.ts +72 -0
- package/dist/tools/analyzeMemoryFootprint.js +234 -0
- package/dist/tools/analyzeMemoryFootprint.js.map +1 -0
- package/dist/tools/analyzeNetworkActivity.d.ts +99 -0
- package/dist/tools/analyzeNetworkActivity.js +312 -0
- package/dist/tools/analyzeNetworkActivity.js.map +1 -0
- package/dist/tools/analyzeTimeProfile.d.ts +10 -1
- package/dist/tools/analyzeTimeProfile.js +63 -8
- package/dist/tools/analyzeTimeProfile.js.map +1 -1
- package/dist/tools/countAlive.d.ts +35 -1
- package/dist/tools/countAlive.js +124 -29
- package/dist/tools/countAlive.js.map +1 -1
- package/dist/tools/inspectTrace.js +124 -18
- package/dist/tools/inspectTrace.js.map +1 -1
- package/dist/tools/recordTimeProfile.d.ts +83 -0
- package/dist/tools/recordTimeProfile.js +135 -0
- package/dist/tools/recordTimeProfile.js.map +1 -1
- package/dist/tools/replayScenario.d.ts +20 -4
- package/dist/tools/replayScenario.js +66 -0
- package/dist/tools/replayScenario.js.map +1 -1
- package/dist/tools/summarizeTrace.d.ts +6 -3
- package/dist/tools/summarizeTrace.js +49 -2
- package/dist/tools/summarizeTrace.js.map +1 -1
- package/dist/tools/verifyFix.d.ts +27 -0
- package/dist/tools/verifyFix.js +78 -4
- package/dist/tools/verifyFix.js.map +1 -1
- package/dist/types.d.ts +28 -0
- package/package.json +2 -2
|
@@ -2,6 +2,7 @@ import { z } from "zod";
|
|
|
2
2
|
import { existsSync } from "node:fs";
|
|
3
3
|
import { resolve as resolvePath } from "node:path";
|
|
4
4
|
import { runCommand } from "../runtime/exec.js";
|
|
5
|
+
import { fetchDiscoveredSchemas } from "../parsers/schemaDiscovery.js";
|
|
5
6
|
import { parseXctraceXml, asNumber, asFormatted, } from "../parsers/xctraceXml.js";
|
|
6
7
|
import { outputFormatField } from "../runtime/responseFormatter.js";
|
|
7
8
|
export const analyzeAllocationsSchema = z.object({
|
|
@@ -41,6 +42,13 @@ export function analyzeAllocationsFromXml(xml, tracePath, topN = 15, minBytes =
|
|
|
41
42
|
topByCount: [],
|
|
42
43
|
diagnosis: "No allocations table found in the trace.",
|
|
43
44
|
status: "not_present",
|
|
45
|
+
supportStatus: [
|
|
46
|
+
{
|
|
47
|
+
kind: "allocations",
|
|
48
|
+
status: "not_present",
|
|
49
|
+
reason: "Schema absent from the trace TOC.",
|
|
50
|
+
},
|
|
51
|
+
],
|
|
44
52
|
};
|
|
45
53
|
}
|
|
46
54
|
// The xctrace `allocations` schema has columns roughly like:
|
|
@@ -130,6 +138,13 @@ export function analyzeAllocationsFromXml(xml, tracePath, topN = 15, minBytes =
|
|
|
130
138
|
topByCount,
|
|
131
139
|
diagnosis,
|
|
132
140
|
status: "available",
|
|
141
|
+
supportStatus: [
|
|
142
|
+
{
|
|
143
|
+
kind: "allocations",
|
|
144
|
+
status: "available",
|
|
145
|
+
sourceSchemas: ["allocations"],
|
|
146
|
+
},
|
|
147
|
+
],
|
|
133
148
|
};
|
|
134
149
|
}
|
|
135
150
|
function buildDiagnosis(rows, cumulativeBytes, topByBytes) {
|
|
@@ -145,13 +160,14 @@ export async function analyzeAllocations(input) {
|
|
|
145
160
|
if (!existsSync(tracePath)) {
|
|
146
161
|
throw new Error(`Trace bundle not found: ${tracePath}`);
|
|
147
162
|
}
|
|
163
|
+
const { allocations: schemaName } = await fetchDiscoveredSchemas(runCommand, tracePath, ["allocations"]);
|
|
148
164
|
const result = await runCommand("xcrun", [
|
|
149
165
|
"xctrace",
|
|
150
166
|
"export",
|
|
151
167
|
"--input",
|
|
152
168
|
tracePath,
|
|
153
169
|
"--xpath",
|
|
154
|
-
|
|
170
|
+
`/trace-toc/run/data/table[@schema="${schemaName}"]`,
|
|
155
171
|
], { timeoutMs: 5 * 60_000 });
|
|
156
172
|
if (result.code !== 0) {
|
|
157
173
|
throw new Error(`xctrace export failed (code ${result.code}): ${result.stderr || result.stdout}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzeAllocations.js","sourceRoot":"","sources":["../../src/tools/analyzeAllocations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EACL,eAAe,EACf,QAAQ,EACR,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEpE,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CACP,+IAA+I,CAChJ;IACH,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,8DAA8D,CAAC;IAC3E,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,WAAW,EAAE;SACb,OAAO,CAAC,CAAC,CAAC;SACV,QAAQ,CACP,uHAAuH,CACxH;IACH,YAAY,EAAE,iBAAiB;CAChC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"analyzeAllocations.js","sourceRoot":"","sources":["../../src/tools/analyzeAllocations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import type { DataStatus } from "../types.js";
|
|
2
|
+
import type { DataStatus, SupportStatus } from "../types.js";
|
|
3
3
|
export declare const analyzeAnimationHitchesSchema: z.ZodObject<{
|
|
4
4
|
tracePath: z.ZodString;
|
|
5
5
|
topN: z.ZodDefault<z.ZodNumber>;
|
|
@@ -62,8 +62,12 @@ export interface AnalyzeAnimationHitchesResult {
|
|
|
62
62
|
/**
|
|
63
63
|
* Disambiguates empty arrays into "no data in the trace" vs "trace could
|
|
64
64
|
* not be exported" vs "data was exported partially". See {@link DataStatus}.
|
|
65
|
+
*
|
|
66
|
+
* @deprecated v1.14 item I. Use `supportStatus[]` instead.
|
|
65
67
|
*/
|
|
66
68
|
status: DataStatus;
|
|
69
|
+
/** v1.14+. Unified per-area status. See {@link SupportStatus}. */
|
|
70
|
+
supportStatus: SupportStatus[];
|
|
67
71
|
}
|
|
68
72
|
/** Pure: turn parsed XML into the analyzed result. */
|
|
69
73
|
export declare function analyzeAnimationHitchesFromXml(xml: string, tracePath: string, topN?: number, minDurationMs?: number, timeRangeMs?: {
|
|
@@ -2,6 +2,7 @@ import { z } from "zod";
|
|
|
2
2
|
import { existsSync } from "node:fs";
|
|
3
3
|
import { resolve as resolvePath } from "node:path";
|
|
4
4
|
import { runCommand } from "../runtime/exec.js";
|
|
5
|
+
import { fetchDiscoveredSchemas } from "../parsers/schemaDiscovery.js";
|
|
5
6
|
import { parseXctraceXml, asNumber, asFormatted, } from "../parsers/xctraceXml.js";
|
|
6
7
|
import { outputFormatField } from "../runtime/responseFormatter.js";
|
|
7
8
|
export const analyzeAnimationHitchesSchema = z.object({
|
|
@@ -49,6 +50,13 @@ export function analyzeAnimationHitchesFromXml(xml, tracePath, topN = 10, minDur
|
|
|
49
50
|
top: [],
|
|
50
51
|
diagnosis: "No animation-hitches table found in the trace.",
|
|
51
52
|
status: "not_present",
|
|
53
|
+
supportStatus: [
|
|
54
|
+
{
|
|
55
|
+
kind: "animation-hitches",
|
|
56
|
+
status: "not_present",
|
|
57
|
+
reason: "Schema absent from the trace TOC.",
|
|
58
|
+
},
|
|
59
|
+
],
|
|
52
60
|
};
|
|
53
61
|
}
|
|
54
62
|
const all = [];
|
|
@@ -104,6 +112,13 @@ export function analyzeAnimationHitchesFromXml(xml, tracePath, topN = 10, minDur
|
|
|
104
112
|
top,
|
|
105
113
|
diagnosis,
|
|
106
114
|
status: "available",
|
|
115
|
+
supportStatus: [
|
|
116
|
+
{
|
|
117
|
+
kind: "animation-hitches",
|
|
118
|
+
status: "available",
|
|
119
|
+
sourceSchemas: ["animation-hitches"],
|
|
120
|
+
},
|
|
121
|
+
],
|
|
107
122
|
};
|
|
108
123
|
}
|
|
109
124
|
function buildDiagnosis(rows, perceptible, longestMs, averageMs) {
|
|
@@ -126,13 +141,14 @@ export async function analyzeAnimationHitches(input) {
|
|
|
126
141
|
if (!existsSync(tracePath)) {
|
|
127
142
|
throw new Error(`Trace bundle not found: ${tracePath}`);
|
|
128
143
|
}
|
|
144
|
+
const { "animation-hitches": schemaName } = await fetchDiscoveredSchemas(runCommand, tracePath, ["animation-hitches"]);
|
|
129
145
|
const result = await runCommand("xcrun", [
|
|
130
146
|
"xctrace",
|
|
131
147
|
"export",
|
|
132
148
|
"--input",
|
|
133
149
|
tracePath,
|
|
134
150
|
"--xpath",
|
|
135
|
-
|
|
151
|
+
`/trace-toc/run/data/table[@schema="${schemaName}"]`,
|
|
136
152
|
], { timeoutMs: 5 * 60_000 });
|
|
137
153
|
if (result.code !== 0) {
|
|
138
154
|
throw new Error(`xctrace export failed (code ${result.code}): ${result.stderr || result.stdout}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzeAnimationHitches.js","sourceRoot":"","sources":["../../src/tools/analyzeAnimationHitches.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EACL,eAAe,EACf,QAAQ,EACR,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEpE,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IACpD,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CACP,6JAA6J,CAC9J;IACH,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,gEAAgE,CAAC;IAC7E,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,WAAW,EAAE;SACb,OAAO,CAAC,CAAC,CAAC;SACV,QAAQ,CACP,kJAAkJ,CACnJ;IACH,WAAW,EAAE,CAAC;SACX,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE;QACjC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE;KAChC,CAAC;SACD,QAAQ,EAAE;SACV,QAAQ,CACP,8PAA8P,CAC/P;IACH,YAAY,EAAE,iBAAiB;CAChC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"analyzeAnimationHitches.js","sourceRoot":"","sources":["../../src/tools/analyzeAnimationHitches.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import type { SupportStatus } from "../types.js";
|
|
2
3
|
export declare const analyzeAppLaunchSchema: z.ZodObject<{
|
|
3
4
|
tracePath: z.ZodString;
|
|
4
5
|
outputFormat: z.ZodOptional<z.ZodEnum<["markdown", "json", "both", "verify-fix-table"]>>;
|
|
@@ -31,6 +32,8 @@ export interface AnalyzeAppLaunchResult {
|
|
|
31
32
|
/** Phase that took the largest share of launch time. */
|
|
32
33
|
slowestPhase?: PhaseEntry;
|
|
33
34
|
diagnosis: string;
|
|
35
|
+
/** v1.14+. Unified per-area status. See {@link SupportStatus}. */
|
|
36
|
+
supportStatus: SupportStatus[];
|
|
34
37
|
}
|
|
35
38
|
/** Pure: turn parsed XML into the structured result. */
|
|
36
39
|
export declare function analyzeAppLaunchFromXml(xml: string, tracePath: string): AnalyzeAppLaunchResult;
|
|
@@ -2,6 +2,7 @@ import { z } from "zod";
|
|
|
2
2
|
import { existsSync } from "node:fs";
|
|
3
3
|
import { resolve as resolvePath } from "node:path";
|
|
4
4
|
import { runCommand } from "../runtime/exec.js";
|
|
5
|
+
import { fetchDiscoveredSchemas } from "../parsers/schemaDiscovery.js";
|
|
5
6
|
import { parseXctraceXml, asNumber, asFormatted, } from "../parsers/xctraceXml.js";
|
|
6
7
|
import { outputFormatField } from "../runtime/responseFormatter.js";
|
|
7
8
|
export const analyzeAppLaunchSchema = z.object({
|
|
@@ -33,6 +34,13 @@ export function analyzeAppLaunchFromXml(xml, tracePath) {
|
|
|
33
34
|
launchType: "unknown",
|
|
34
35
|
phases: [],
|
|
35
36
|
diagnosis: "No app-launch table found in the trace.",
|
|
37
|
+
supportStatus: [
|
|
38
|
+
{
|
|
39
|
+
kind: "app-launch",
|
|
40
|
+
status: "not_present",
|
|
41
|
+
reason: "Schema absent from the trace TOC.",
|
|
42
|
+
},
|
|
43
|
+
],
|
|
36
44
|
};
|
|
37
45
|
}
|
|
38
46
|
// The app-launch schema can include rows describing per-phase durations and
|
|
@@ -88,6 +96,13 @@ export function analyzeAppLaunchFromXml(xml, tracePath) {
|
|
|
88
96
|
phases,
|
|
89
97
|
slowestPhase,
|
|
90
98
|
diagnosis,
|
|
99
|
+
supportStatus: [
|
|
100
|
+
{
|
|
101
|
+
kind: "app-launch",
|
|
102
|
+
status: "available",
|
|
103
|
+
sourceSchemas: ["app-launch"],
|
|
104
|
+
},
|
|
105
|
+
],
|
|
91
106
|
};
|
|
92
107
|
}
|
|
93
108
|
function phaseOrder(phase) {
|
|
@@ -113,13 +128,14 @@ export async function analyzeAppLaunch(input) {
|
|
|
113
128
|
if (!existsSync(tracePath)) {
|
|
114
129
|
throw new Error(`Trace bundle not found: ${tracePath}`);
|
|
115
130
|
}
|
|
131
|
+
const { "app-launch": schemaName } = await fetchDiscoveredSchemas(runCommand, tracePath, ["app-launch"]);
|
|
116
132
|
const result = await runCommand("xcrun", [
|
|
117
133
|
"xctrace",
|
|
118
134
|
"export",
|
|
119
135
|
"--input",
|
|
120
136
|
tracePath,
|
|
121
137
|
"--xpath",
|
|
122
|
-
|
|
138
|
+
`/trace-toc/run/data/table[@schema="${schemaName}"]`,
|
|
123
139
|
], { timeoutMs: 5 * 60_000 });
|
|
124
140
|
if (result.code !== 0) {
|
|
125
141
|
throw new Error(`xctrace export failed (code ${result.code}): ${result.stderr || result.stdout}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzeAppLaunch.js","sourceRoot":"","sources":["../../src/tools/analyzeAppLaunch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EACL,eAAe,EACf,QAAQ,EACR,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"analyzeAppLaunch.js","sourceRoot":"","sources":["../../src/tools/analyzeAppLaunch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `analyzeEnergyImpact`: parses xctrace's energy-impact schema. v1.15 item D.
|
|
3
|
+
*
|
|
4
|
+
* The "why is my app draining battery?" investigation. iOS's Energy
|
|
5
|
+
* Log buckets samples into idle / passive / active / high categories
|
|
6
|
+
* and counts wakeups. Background apps that keep CPU active for too long
|
|
7
|
+
* burn battery and get throttled by the OS. wearables / location apps /
|
|
8
|
+
* background-fetch users are the typical audience for this analyzer.
|
|
9
|
+
*
|
|
10
|
+
* Distinct from analyzeTimeProfile (CPU sampling) which tells you which
|
|
11
|
+
* functions are hot but not how that maps to power draw. The energy
|
|
12
|
+
* schema is a different sensor: it reads from the OS power-management
|
|
13
|
+
* subsystem directly.
|
|
14
|
+
*/
|
|
15
|
+
import { z } from "zod";
|
|
16
|
+
import type { DataStatus, SupportStatus } from "../types.js";
|
|
17
|
+
export declare const analyzeEnergyImpactSchema: z.ZodObject<{
|
|
18
|
+
tracePath: z.ZodString;
|
|
19
|
+
topN: z.ZodDefault<z.ZodNumber>;
|
|
20
|
+
outputFormat: z.ZodOptional<z.ZodEnum<["markdown", "json", "both", "verify-fix-table"]>>;
|
|
21
|
+
}, "strip", z.ZodTypeAny, {
|
|
22
|
+
tracePath: string;
|
|
23
|
+
topN: number;
|
|
24
|
+
outputFormat?: "markdown" | "json" | "both" | "verify-fix-table" | undefined;
|
|
25
|
+
}, {
|
|
26
|
+
tracePath: string;
|
|
27
|
+
outputFormat?: "markdown" | "json" | "both" | "verify-fix-table" | undefined;
|
|
28
|
+
topN?: number | undefined;
|
|
29
|
+
}>;
|
|
30
|
+
export type AnalyzeEnergyImpactInput = z.infer<typeof analyzeEnergyImpactSchema>;
|
|
31
|
+
export type EnergyBucket = "idle" | "passive" | "active" | "high" | "unknown";
|
|
32
|
+
export interface EnergySample {
|
|
33
|
+
startNs: number;
|
|
34
|
+
startFmt?: string;
|
|
35
|
+
/** Apple's energy bucket classification. */
|
|
36
|
+
bucket: EnergyBucket;
|
|
37
|
+
/** Wakeups per second when present. */
|
|
38
|
+
wakeups?: number;
|
|
39
|
+
/** Raw energy cost score when xctrace exposes one (varies by Xcode version). */
|
|
40
|
+
cost?: number;
|
|
41
|
+
/** Optional sample-level label / event name. */
|
|
42
|
+
label?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface AnalyzeEnergyImpactResult {
|
|
45
|
+
ok: boolean;
|
|
46
|
+
tracePath: string;
|
|
47
|
+
totals: {
|
|
48
|
+
rows: number;
|
|
49
|
+
/** Aggregate wakeups across all samples. */
|
|
50
|
+
totalWakeups: number;
|
|
51
|
+
/** Ratio of samples in `active` + `high` buckets vs total. 0 means fully idle. */
|
|
52
|
+
activeRatio: number;
|
|
53
|
+
/** Per-bucket sample counts. */
|
|
54
|
+
bucketCounts: Record<EnergyBucket, number>;
|
|
55
|
+
};
|
|
56
|
+
/** Top N samples by energy cost desc. */
|
|
57
|
+
topByCost: EnergySample[];
|
|
58
|
+
diagnosis: string;
|
|
59
|
+
/** @deprecated v1.14 item I. Use `supportStatus[]`. */
|
|
60
|
+
status: DataStatus;
|
|
61
|
+
/** v1.14+. Unified per-area status. */
|
|
62
|
+
supportStatus: SupportStatus[];
|
|
63
|
+
}
|
|
64
|
+
/** Normalize whatever string xctrace puts in the bucket column to our
|
|
65
|
+
* canonical enum. v1.15. Exported for testing. */
|
|
66
|
+
export declare function normalizeBucket(raw: string | undefined): EnergyBucket;
|
|
67
|
+
/** Pure: turn the energy-impact XML into the analyzed result. */
|
|
68
|
+
export declare function analyzeEnergyImpactFromXml(xml: string, tracePath: string, topN?: number): AnalyzeEnergyImpactResult;
|
|
69
|
+
export declare function analyzeEnergyImpact(input: AnalyzeEnergyImpactInput): Promise<AnalyzeEnergyImpactResult>;
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `analyzeEnergyImpact`: parses xctrace's energy-impact schema. v1.15 item D.
|
|
3
|
+
*
|
|
4
|
+
* The "why is my app draining battery?" investigation. iOS's Energy
|
|
5
|
+
* Log buckets samples into idle / passive / active / high categories
|
|
6
|
+
* and counts wakeups. Background apps that keep CPU active for too long
|
|
7
|
+
* burn battery and get throttled by the OS. wearables / location apps /
|
|
8
|
+
* background-fetch users are the typical audience for this analyzer.
|
|
9
|
+
*
|
|
10
|
+
* Distinct from analyzeTimeProfile (CPU sampling) which tells you which
|
|
11
|
+
* functions are hot but not how that maps to power draw. The energy
|
|
12
|
+
* schema is a different sensor: it reads from the OS power-management
|
|
13
|
+
* subsystem directly.
|
|
14
|
+
*/
|
|
15
|
+
import { z } from "zod";
|
|
16
|
+
import { existsSync } from "node:fs";
|
|
17
|
+
import { resolve as resolvePath } from "node:path";
|
|
18
|
+
import { runCommand } from "../runtime/exec.js";
|
|
19
|
+
import { fetchDiscoveredSchemas } from "../parsers/schemaDiscovery.js";
|
|
20
|
+
import { parseXctraceXml, asNumber, asFormatted, } from "../parsers/xctraceXml.js";
|
|
21
|
+
import { outputFormatField } from "../runtime/responseFormatter.js";
|
|
22
|
+
export const analyzeEnergyImpactSchema = z.object({
|
|
23
|
+
tracePath: z
|
|
24
|
+
.string()
|
|
25
|
+
.min(1)
|
|
26
|
+
.describe("Absolute path to a `.trace` bundle recorded with an Energy Log template that includes the energy-impact instrument."),
|
|
27
|
+
topN: z
|
|
28
|
+
.number()
|
|
29
|
+
.int()
|
|
30
|
+
.positive()
|
|
31
|
+
.default(10)
|
|
32
|
+
.describe("Return the top N samples ranked by energy cost descending (default 10)."),
|
|
33
|
+
outputFormat: outputFormatField,
|
|
34
|
+
});
|
|
35
|
+
function pickNumber(row, keys) {
|
|
36
|
+
for (const k of keys) {
|
|
37
|
+
const v = asNumber(row[k]);
|
|
38
|
+
if (typeof v === "number" && Number.isFinite(v))
|
|
39
|
+
return v;
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
function pickString(row, keys) {
|
|
44
|
+
for (const k of keys) {
|
|
45
|
+
const v = asFormatted(row[k]);
|
|
46
|
+
if (v && v.trim().length > 0)
|
|
47
|
+
return v.trim();
|
|
48
|
+
}
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
/** Normalize whatever string xctrace puts in the bucket column to our
|
|
52
|
+
* canonical enum. v1.15. Exported for testing. */
|
|
53
|
+
export function normalizeBucket(raw) {
|
|
54
|
+
if (!raw)
|
|
55
|
+
return "unknown";
|
|
56
|
+
const lc = raw.toLowerCase();
|
|
57
|
+
if (lc.includes("idle"))
|
|
58
|
+
return "idle";
|
|
59
|
+
if (lc.includes("high"))
|
|
60
|
+
return "high";
|
|
61
|
+
if (lc.includes("active") || lc.includes("foreground"))
|
|
62
|
+
return "active";
|
|
63
|
+
if (lc.includes("passive") || lc.includes("background"))
|
|
64
|
+
return "passive";
|
|
65
|
+
return "unknown";
|
|
66
|
+
}
|
|
67
|
+
/** Pure: turn the energy-impact XML into the analyzed result. */
|
|
68
|
+
export function analyzeEnergyImpactFromXml(xml, tracePath, topN = 10) {
|
|
69
|
+
const tables = parseXctraceXml(xml);
|
|
70
|
+
const table = tables.find((t) => t.schema === "energy-impact" ||
|
|
71
|
+
/energy-impact/i.test(t.schema) ||
|
|
72
|
+
/power-draw/i.test(t.schema));
|
|
73
|
+
if (!table) {
|
|
74
|
+
return {
|
|
75
|
+
ok: true,
|
|
76
|
+
tracePath,
|
|
77
|
+
totals: {
|
|
78
|
+
rows: 0,
|
|
79
|
+
totalWakeups: 0,
|
|
80
|
+
activeRatio: 0,
|
|
81
|
+
bucketCounts: {
|
|
82
|
+
idle: 0,
|
|
83
|
+
passive: 0,
|
|
84
|
+
active: 0,
|
|
85
|
+
high: 0,
|
|
86
|
+
unknown: 0,
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
topByCost: [],
|
|
90
|
+
diagnosis: "No energy-impact table found in the trace.",
|
|
91
|
+
status: "not_present",
|
|
92
|
+
supportStatus: [
|
|
93
|
+
{
|
|
94
|
+
kind: "energy-impact",
|
|
95
|
+
status: "not_present",
|
|
96
|
+
reason: "Schema absent from the trace TOC.",
|
|
97
|
+
},
|
|
98
|
+
],
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
const samples = [];
|
|
102
|
+
for (const row of table.rows) {
|
|
103
|
+
const startNs = pickNumber(row, ["time", "sample-time", "event-time", "start"]) ?? 0;
|
|
104
|
+
const wakeups = pickNumber(row, [
|
|
105
|
+
"wakeups",
|
|
106
|
+
"wakeups-per-sec",
|
|
107
|
+
"wakeups-rate",
|
|
108
|
+
]);
|
|
109
|
+
const cost = pickNumber(row, [
|
|
110
|
+
"cost",
|
|
111
|
+
"energy-cost",
|
|
112
|
+
"energy",
|
|
113
|
+
"power",
|
|
114
|
+
"power-cost",
|
|
115
|
+
]);
|
|
116
|
+
const bucketRaw = pickString(row, [
|
|
117
|
+
"bucket",
|
|
118
|
+
"energy-bucket",
|
|
119
|
+
"category",
|
|
120
|
+
"state",
|
|
121
|
+
]);
|
|
122
|
+
const label = pickString(row, ["label", "event", "event-type"]);
|
|
123
|
+
samples.push({
|
|
124
|
+
startNs,
|
|
125
|
+
...(asFormatted(row.time) ? { startFmt: asFormatted(row.time) } : {}),
|
|
126
|
+
bucket: normalizeBucket(bucketRaw),
|
|
127
|
+
...(wakeups != null ? { wakeups } : {}),
|
|
128
|
+
...(cost != null ? { cost } : {}),
|
|
129
|
+
...(label ? { label } : {}),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
const bucketCounts = {
|
|
133
|
+
idle: 0,
|
|
134
|
+
passive: 0,
|
|
135
|
+
active: 0,
|
|
136
|
+
high: 0,
|
|
137
|
+
unknown: 0,
|
|
138
|
+
};
|
|
139
|
+
let totalWakeups = 0;
|
|
140
|
+
for (const s of samples) {
|
|
141
|
+
bucketCounts[s.bucket] += 1;
|
|
142
|
+
if (s.wakeups != null)
|
|
143
|
+
totalWakeups += s.wakeups;
|
|
144
|
+
}
|
|
145
|
+
const activeRatio = samples.length > 0
|
|
146
|
+
? (bucketCounts.active + bucketCounts.high) / samples.length
|
|
147
|
+
: 0;
|
|
148
|
+
const topByCost = [...samples]
|
|
149
|
+
.sort((a, b) => (b.cost ?? 0) - (a.cost ?? 0))
|
|
150
|
+
.slice(0, topN);
|
|
151
|
+
return {
|
|
152
|
+
ok: true,
|
|
153
|
+
tracePath,
|
|
154
|
+
totals: {
|
|
155
|
+
rows: samples.length,
|
|
156
|
+
totalWakeups,
|
|
157
|
+
activeRatio,
|
|
158
|
+
bucketCounts,
|
|
159
|
+
},
|
|
160
|
+
topByCost,
|
|
161
|
+
diagnosis: buildDiagnosis(samples.length, totalWakeups, activeRatio, bucketCounts),
|
|
162
|
+
status: "available",
|
|
163
|
+
supportStatus: [
|
|
164
|
+
{
|
|
165
|
+
kind: "energy-impact",
|
|
166
|
+
status: "available",
|
|
167
|
+
sourceSchemas: ["energy-impact"],
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function buildDiagnosis(rows, totalWakeups, activeRatio, bucketCounts) {
|
|
173
|
+
if (rows === 0) {
|
|
174
|
+
return "No energy-impact samples in the recording.";
|
|
175
|
+
}
|
|
176
|
+
const parts = [];
|
|
177
|
+
parts.push(`${rows} energy samples.`);
|
|
178
|
+
if (totalWakeups > 0) {
|
|
179
|
+
parts.push(`${totalWakeups.toLocaleString()} total wakeups.`);
|
|
180
|
+
}
|
|
181
|
+
const activePct = (activeRatio * 100).toFixed(1);
|
|
182
|
+
parts.push(`Active+high: ${activePct}% of samples.`);
|
|
183
|
+
if (bucketCounts.high > 0) {
|
|
184
|
+
parts.push(`${bucketCounts.high} sample${bucketCounts.high === 1 ? "" : "s"} in the 'high' bucket.`);
|
|
185
|
+
}
|
|
186
|
+
if (activeRatio > 0.5) {
|
|
187
|
+
parts.push("Over half the recording in active or high power state. Heavy battery drain.");
|
|
188
|
+
}
|
|
189
|
+
else if (totalWakeups > 500 && bucketCounts.idle / rows > 0.5) {
|
|
190
|
+
parts.push("High wakeup count despite idle bucket dominance. Likely background timer / notification storm.");
|
|
191
|
+
}
|
|
192
|
+
return parts.join(" ");
|
|
193
|
+
}
|
|
194
|
+
export async function analyzeEnergyImpact(input) {
|
|
195
|
+
const tracePath = resolvePath(input.tracePath);
|
|
196
|
+
if (!existsSync(tracePath)) {
|
|
197
|
+
throw new Error(`Trace bundle not found: ${tracePath}`);
|
|
198
|
+
}
|
|
199
|
+
const { energy: schemaName } = await fetchDiscoveredSchemas(runCommand, tracePath, ["energy"]);
|
|
200
|
+
const result = await runCommand("xcrun", [
|
|
201
|
+
"xctrace",
|
|
202
|
+
"export",
|
|
203
|
+
"--input",
|
|
204
|
+
tracePath,
|
|
205
|
+
"--xpath",
|
|
206
|
+
`/trace-toc/run/data/table[@schema="${schemaName}"]`,
|
|
207
|
+
], { timeoutMs: 5 * 60_000 });
|
|
208
|
+
if (result.code !== 0) {
|
|
209
|
+
return {
|
|
210
|
+
ok: true,
|
|
211
|
+
tracePath,
|
|
212
|
+
totals: {
|
|
213
|
+
rows: 0,
|
|
214
|
+
totalWakeups: 0,
|
|
215
|
+
activeRatio: 0,
|
|
216
|
+
bucketCounts: {
|
|
217
|
+
idle: 0,
|
|
218
|
+
passive: 0,
|
|
219
|
+
active: 0,
|
|
220
|
+
high: 0,
|
|
221
|
+
unknown: 0,
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
topByCost: [],
|
|
225
|
+
diagnosis: "Energy-impact schema not exportable from this trace (likely recorded with a non-Energy template).",
|
|
226
|
+
status: "not_present",
|
|
227
|
+
supportStatus: [
|
|
228
|
+
{
|
|
229
|
+
kind: "energy-impact",
|
|
230
|
+
status: "not_exportable",
|
|
231
|
+
reason: "xctrace export failed for the energy schema family.",
|
|
232
|
+
sourceSchemas: [schemaName],
|
|
233
|
+
},
|
|
234
|
+
],
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
return analyzeEnergyImpactFromXml(result.stdout, tracePath, input.topN ?? 10);
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=analyzeEnergyImpact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzeEnergyImpact.js","sourceRoot":"","sources":["../../src/tools/analyzeEnergyImpact.ts"],"names":[],"mappings":"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"}
|