@memlab/core 1.0.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/README.md +11 -0
- package/dist/__tests__/parser/HeapParser.test.d.ts +11 -0
- package/dist/__tests__/parser/HeapParser.test.d.ts.map +1 -0
- package/dist/__tests__/parser/HeapParser.test.js +54 -0
- package/dist/__tests__/parser/NodeHeap.test.d.ts +11 -0
- package/dist/__tests__/parser/NodeHeap.test.d.ts.map +1 -0
- package/dist/__tests__/parser/NodeHeap.test.js +96 -0
- package/dist/__tests__/parser/StringNode.test.d.ts +11 -0
- package/dist/__tests__/parser/StringNode.test.d.ts.map +1 -0
- package/dist/__tests__/parser/StringNode.test.js +61 -0
- package/dist/__tests__/parser/traverse/HeapNodeTraverse.test.d.ts +16 -0
- package/dist/__tests__/parser/traverse/HeapNodeTraverse.test.d.ts.map +1 -0
- package/dist/__tests__/parser/traverse/HeapNodeTraverse.test.js +140 -0
- package/dist/__tests__/utils/utils.test.d.ts +11 -0
- package/dist/__tests__/utils/utils.test.d.ts.map +1 -0
- package/dist/__tests__/utils/utils.test.js +81 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +62 -0
- package/dist/lib/BaseOption.d.ts +31 -0
- package/dist/lib/BaseOption.d.ts.map +1 -0
- package/dist/lib/BaseOption.js +109 -0
- package/dist/lib/BrowserInfo.d.ts +33 -0
- package/dist/lib/BrowserInfo.d.ts.map +1 -0
- package/dist/lib/BrowserInfo.js +117 -0
- package/dist/lib/Config.d.ts +203 -0
- package/dist/lib/Config.d.ts.map +1 -0
- package/dist/lib/Config.js +427 -0
- package/dist/lib/Console.d.ts +67 -0
- package/dist/lib/Console.d.ts.map +1 -0
- package/dist/lib/Console.js +344 -0
- package/dist/lib/Constant.d.ts +38 -0
- package/dist/lib/Constant.d.ts.map +1 -0
- package/dist/lib/Constant.js +58 -0
- package/dist/lib/FileManager.d.ts +69 -0
- package/dist/lib/FileManager.d.ts.map +1 -0
- package/dist/lib/FileManager.js +309 -0
- package/dist/lib/HeapAnalyzer.d.ts +51 -0
- package/dist/lib/HeapAnalyzer.d.ts.map +1 -0
- package/dist/lib/HeapAnalyzer.js +719 -0
- package/dist/lib/HeapParser.d.ts +19 -0
- package/dist/lib/HeapParser.d.ts.map +1 -0
- package/dist/lib/HeapParser.js +128 -0
- package/dist/lib/InternalValueSetter.d.ts +14 -0
- package/dist/lib/InternalValueSetter.d.ts.map +1 -0
- package/dist/lib/InternalValueSetter.js +43 -0
- package/dist/lib/NodeHeap.d.ts +16 -0
- package/dist/lib/NodeHeap.d.ts.map +1 -0
- package/dist/lib/NodeHeap.js +62 -0
- package/dist/lib/ProcessManager.d.ts +25 -0
- package/dist/lib/ProcessManager.d.ts.map +1 -0
- package/dist/lib/ProcessManager.js +67 -0
- package/dist/lib/Serializer.d.ts +49 -0
- package/dist/lib/Serializer.d.ts.map +1 -0
- package/dist/lib/Serializer.js +702 -0
- package/dist/lib/StringLoader.d.ts +26 -0
- package/dist/lib/StringLoader.d.ts.map +1 -0
- package/dist/lib/StringLoader.js +290 -0
- package/dist/lib/Types.d.ts +432 -0
- package/dist/lib/Types.d.ts.map +1 -0
- package/dist/lib/Types.js +11 -0
- package/dist/lib/Utils.d.ts +223 -0
- package/dist/lib/Utils.d.ts.map +1 -0
- package/dist/lib/Utils.js +1736 -0
- package/dist/lib/heap-data/HeapEdge.d.ts +27 -0
- package/dist/lib/heap-data/HeapEdge.d.ts.map +1 -0
- package/dist/lib/heap-data/HeapEdge.js +75 -0
- package/dist/lib/heap-data/HeapLocation.d.ts +22 -0
- package/dist/lib/heap-data/HeapLocation.d.ts.map +1 -0
- package/dist/lib/heap-data/HeapLocation.js +40 -0
- package/dist/lib/heap-data/HeapNode.d.ts +55 -0
- package/dist/lib/heap-data/HeapNode.d.ts.map +1 -0
- package/dist/lib/heap-data/HeapNode.js +344 -0
- package/dist/lib/heap-data/HeapSnapshot.d.ts +85 -0
- package/dist/lib/heap-data/HeapSnapshot.d.ts.map +1 -0
- package/dist/lib/heap-data/HeapSnapshot.js +462 -0
- package/dist/lib/heap-data/HeapStringNode.d.ts +18 -0
- package/dist/lib/heap-data/HeapStringNode.d.ts.map +1 -0
- package/dist/lib/heap-data/HeapStringNode.js +43 -0
- package/dist/lib/heap-data/HeapUtils.d.ts +17 -0
- package/dist/lib/heap-data/HeapUtils.d.ts.map +1 -0
- package/dist/lib/heap-data/HeapUtils.js +25 -0
- package/dist/logger/LeakClusterLogger.d.ts +40 -0
- package/dist/logger/LeakClusterLogger.d.ts.map +1 -0
- package/dist/logger/LeakClusterLogger.js +228 -0
- package/dist/logger/LeakTraceDetailsLogger.d.ts +19 -0
- package/dist/logger/LeakTraceDetailsLogger.d.ts.map +1 -0
- package/dist/logger/LeakTraceDetailsLogger.js +50 -0
- package/dist/modes/BaseMode.d.ts +30 -0
- package/dist/modes/BaseMode.d.ts.map +1 -0
- package/dist/modes/BaseMode.js +95 -0
- package/dist/modes/InteractionTestMode.d.ts +23 -0
- package/dist/modes/InteractionTestMode.d.ts.map +1 -0
- package/dist/modes/InteractionTestMode.js +46 -0
- package/dist/modes/MeasureMode.d.ts +23 -0
- package/dist/modes/MeasureMode.d.ts.map +1 -0
- package/dist/modes/MeasureMode.js +58 -0
- package/dist/modes/RunningModes.d.ts +15 -0
- package/dist/modes/RunningModes.d.ts.map +1 -0
- package/dist/modes/RunningModes.js +40 -0
- package/dist/paths/TraceFinder.d.ts +31 -0
- package/dist/paths/TraceFinder.d.ts.map +1 -0
- package/dist/paths/TraceFinder.js +537 -0
- package/dist/trace-cluster/ClusterUtils.d.ts +14 -0
- package/dist/trace-cluster/ClusterUtils.d.ts.map +1 -0
- package/dist/trace-cluster/ClusterUtils.js +17 -0
- package/dist/trace-cluster/ClusterUtilsHelper.d.ts +38 -0
- package/dist/trace-cluster/ClusterUtilsHelper.d.ts.map +1 -0
- package/dist/trace-cluster/ClusterUtilsHelper.js +373 -0
- package/dist/trace-cluster/ClusteringHeuristics.d.ts +22 -0
- package/dist/trace-cluster/ClusteringHeuristics.d.ts.map +1 -0
- package/dist/trace-cluster/ClusteringHeuristics.js +23 -0
- package/dist/trace-cluster/EvalutationMetric.d.ts +22 -0
- package/dist/trace-cluster/EvalutationMetric.d.ts.map +1 -0
- package/dist/trace-cluster/EvalutationMetric.js +158 -0
- package/dist/trace-cluster/TraceBucket.d.ts +36 -0
- package/dist/trace-cluster/TraceBucket.d.ts.map +1 -0
- package/dist/trace-cluster/TraceBucket.js +238 -0
- package/dist/trace-cluster/TraceElement.d.ts +71 -0
- package/dist/trace-cluster/TraceElement.d.ts.map +1 -0
- package/dist/trace-cluster/TraceElement.js +182 -0
- package/dist/trace-cluster/strategies/TraceAsClusterStrategy.d.ts +15 -0
- package/dist/trace-cluster/strategies/TraceAsClusterStrategy.d.ts.map +1 -0
- package/dist/trace-cluster/strategies/TraceAsClusterStrategy.js +37 -0
- package/dist/trace-cluster/strategies/TraceSimilarityStrategy.d.ts +15 -0
- package/dist/trace-cluster/strategies/TraceSimilarityStrategy.d.ts.map +1 -0
- package/dist/trace-cluster/strategies/TraceSimilarityStrategy.js +60 -0
- package/package.json +60 -0
- package/static/run-meta.json +10 -0
- package/static/visit-order.json +27 -0
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*
|
|
8
|
+
* @emails oncall+ws_labs
|
|
9
|
+
* @format
|
|
10
|
+
*/
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.FileManager = void 0;
|
|
16
|
+
const minimist_1 = __importDefault(require("minimist"));
|
|
17
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
18
|
+
const os_1 = __importDefault(require("os"));
|
|
19
|
+
const path_1 = __importDefault(require("path"));
|
|
20
|
+
const Console_1 = __importDefault(require("./Console"));
|
|
21
|
+
const Constant_1 = __importDefault(require("./Constant"));
|
|
22
|
+
const Utils_1 = __importDefault(require("./Utils"));
|
|
23
|
+
function joinAndProcessDir(options, ...args) {
|
|
24
|
+
const filepath = path_1.default.join(...args);
|
|
25
|
+
if (!fs_extra_1.default.existsSync(filepath)) {
|
|
26
|
+
try {
|
|
27
|
+
fs_extra_1.default.mkdirSync(filepath);
|
|
28
|
+
}
|
|
29
|
+
catch (ex) {
|
|
30
|
+
const err = Utils_1.default.getError(ex);
|
|
31
|
+
if (!err.message.includes('already exists')) {
|
|
32
|
+
Utils_1.default.haltOrThrow(err);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return filepath;
|
|
37
|
+
}
|
|
38
|
+
class FileManager {
|
|
39
|
+
getDefaultWorkDir() {
|
|
40
|
+
return path_1.default.join(this.getTmpDir(), 'memlab');
|
|
41
|
+
}
|
|
42
|
+
generateTmpHeapDir() {
|
|
43
|
+
const dirPath = path_1.default.join(this.getTmpDir(), Utils_1.default.getUniqueID());
|
|
44
|
+
fs_extra_1.default.mkdirSync(dirPath);
|
|
45
|
+
return dirPath;
|
|
46
|
+
}
|
|
47
|
+
getWorkDir(options = {}) {
|
|
48
|
+
// workDir options supercedes all the other options
|
|
49
|
+
if (options.workDir) {
|
|
50
|
+
return path_1.default.resolve(options.workDir);
|
|
51
|
+
}
|
|
52
|
+
// transcient options supercedes other the CLI options
|
|
53
|
+
if (options.transcient) {
|
|
54
|
+
const idx = ++FileManager.transcientInstanceIdx;
|
|
55
|
+
const instanceId = `${process.pid}-${Date.now()}-${idx}`;
|
|
56
|
+
const workDir = path_1.default.join(this.getTmpDir(), `memlab-${instanceId}`);
|
|
57
|
+
return path_1.default.resolve(workDir);
|
|
58
|
+
}
|
|
59
|
+
// workDir from the CLI options
|
|
60
|
+
const argv = (0, minimist_1.default)(process.argv.slice(2));
|
|
61
|
+
const workDir = argv['work-dir'] || this.getDefaultWorkDir();
|
|
62
|
+
return path_1.default.resolve(workDir);
|
|
63
|
+
}
|
|
64
|
+
getChromeBinaryZipFile() {
|
|
65
|
+
return path_1.default.join(this.getDefaultWorkDir(), 'chrome.tar.gz');
|
|
66
|
+
}
|
|
67
|
+
getChromeBinaryTimeStampFile() {
|
|
68
|
+
return path_1.default.join(this.getChromeBinaryDir(), 'memlab-success');
|
|
69
|
+
}
|
|
70
|
+
getChromeBinaryDir() {
|
|
71
|
+
return path_1.default.join(this.getDefaultWorkDir(), 'chrome');
|
|
72
|
+
}
|
|
73
|
+
clearUserDataDir(options) {
|
|
74
|
+
const userDataDir = this.getUserDataDir(options);
|
|
75
|
+
this.rmDir(userDataDir);
|
|
76
|
+
}
|
|
77
|
+
getDataBaseDir(options) {
|
|
78
|
+
return path_1.default.join(this.getWorkDir(options), 'data');
|
|
79
|
+
}
|
|
80
|
+
getCodeDataDir() {
|
|
81
|
+
return path_1.default.join(this.getCoreProjectBaseDir(), 'static');
|
|
82
|
+
}
|
|
83
|
+
getClusterSampleDataDir() {
|
|
84
|
+
return path_1.default.join(this.getCodeDataDir(), 'cluster');
|
|
85
|
+
}
|
|
86
|
+
getUserDataDir(options) {
|
|
87
|
+
return path_1.default.join(this.getDataBaseDir(options), 'profile');
|
|
88
|
+
}
|
|
89
|
+
getCurDataDir(options) {
|
|
90
|
+
return path_1.default.join(this.getDataBaseDir(options), 'cur');
|
|
91
|
+
}
|
|
92
|
+
getPersistDataDir(options) {
|
|
93
|
+
return path_1.default.join(this.getDataBaseDir(options), 'persist');
|
|
94
|
+
}
|
|
95
|
+
getLoggerOutDir(options = {}) {
|
|
96
|
+
return path_1.default.join(this.getDataBaseDir(options), 'logger');
|
|
97
|
+
}
|
|
98
|
+
// all trace clusters generated from the current run
|
|
99
|
+
getTraceClustersDir(options = {}) {
|
|
100
|
+
return path_1.default.join(this.getLoggerOutDir(options), 'trace-clusters');
|
|
101
|
+
}
|
|
102
|
+
// stores JSON file (with heap object and reference details for visualization)
|
|
103
|
+
// of all trace clusters (each cluster has a representative trace)
|
|
104
|
+
getTraceJSONDir(options = {}) {
|
|
105
|
+
return path_1.default.join(this.getLoggerOutDir(options), 'trace-jsons');
|
|
106
|
+
}
|
|
107
|
+
getUnclassifiedTraceClusterDir(options = {}) {
|
|
108
|
+
return path_1.default.join(this.getLoggerOutDir(options), 'unclassified-clusters');
|
|
109
|
+
}
|
|
110
|
+
getUniqueTraceClusterDir(options = {}) {
|
|
111
|
+
return path_1.default.join(this.getLoggerOutDir(options), 'unique-trace-clusters');
|
|
112
|
+
}
|
|
113
|
+
getNewUniqueTraceClusterDir(options = {}) {
|
|
114
|
+
return path_1.default.join(this.getUniqueTraceClusterDir(options), 'add');
|
|
115
|
+
}
|
|
116
|
+
getStaleUniqueTraceClusterDir(options = {}) {
|
|
117
|
+
return path_1.default.join(this.getUniqueTraceClusterDir(options), 'delete');
|
|
118
|
+
}
|
|
119
|
+
getAllClusterSummaryFile(options = {}) {
|
|
120
|
+
return path_1.default.join(this.getUniqueTraceClusterDir(options), 'unique-clusters-summary.txt');
|
|
121
|
+
}
|
|
122
|
+
getExistingUniqueTraceClusterDir(options = {}) {
|
|
123
|
+
return path_1.default.join(this.getUniqueTraceClusterDir(options), 'existing');
|
|
124
|
+
}
|
|
125
|
+
getAllFilesInDir(dir) {
|
|
126
|
+
const files = fs_extra_1.default.readdirSync(dir);
|
|
127
|
+
return files.map((file) => path_1.default.join(dir, file));
|
|
128
|
+
}
|
|
129
|
+
getDataOutDir(options = {}) {
|
|
130
|
+
return path_1.default.join(this.getDataBaseDir(options), 'out');
|
|
131
|
+
}
|
|
132
|
+
getCoreProjectBaseDir() {
|
|
133
|
+
return path_1.default.join(__dirname, '..', '..');
|
|
134
|
+
}
|
|
135
|
+
getReportOutDir(options = {}) {
|
|
136
|
+
return path_1.default.join(this.getPersistDataDir(options), 'reports');
|
|
137
|
+
}
|
|
138
|
+
getPreviewReportDir(options = {}) {
|
|
139
|
+
return path_1.default.join(this.getPersistDataDir(options), 'report-preview');
|
|
140
|
+
}
|
|
141
|
+
getLeakSummaryFile(options = {}) {
|
|
142
|
+
return path_1.default.join(this.getDataOutDir(options), 'leaks.txt');
|
|
143
|
+
}
|
|
144
|
+
getInputDataDir() {
|
|
145
|
+
return path_1.default.join(this.getDefaultWorkDir(), 'input');
|
|
146
|
+
}
|
|
147
|
+
getAllFilesInSubDirs(dir) {
|
|
148
|
+
let ret = [];
|
|
149
|
+
if (!fs_extra_1.default.existsSync(dir)) {
|
|
150
|
+
return ret;
|
|
151
|
+
}
|
|
152
|
+
const files = fs_extra_1.default.readdirSync(dir);
|
|
153
|
+
for (const file of files) {
|
|
154
|
+
const p = path_1.default.join(dir, file);
|
|
155
|
+
if (fs_extra_1.default.lstatSync(p).isDirectory()) {
|
|
156
|
+
ret = ret.concat(this.getAllFilesInSubDirs(p));
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
ret.push(p);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return ret;
|
|
163
|
+
}
|
|
164
|
+
getTmpDir() {
|
|
165
|
+
return os_1.default.tmpdir();
|
|
166
|
+
}
|
|
167
|
+
rmDir(dir) {
|
|
168
|
+
if (fs_extra_1.default.existsSync(dir)) {
|
|
169
|
+
fs_extra_1.default.removeSync(dir);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
getExperimentsDir() {
|
|
173
|
+
return path_1.default.join(this.getTmpDir(), 'memlab-experiments');
|
|
174
|
+
}
|
|
175
|
+
initExperimentDir(experimentId) {
|
|
176
|
+
const expsDir = joinAndProcessDir({}, this.getExperimentsDir());
|
|
177
|
+
const expDir = joinAndProcessDir({}, expsDir, `exp-${experimentId}`);
|
|
178
|
+
const controlWorkDir = joinAndProcessDir({}, expDir, 'control');
|
|
179
|
+
const testWorkDir = joinAndProcessDir({}, expDir, 'test');
|
|
180
|
+
return { controlWorkDir, testWorkDir };
|
|
181
|
+
}
|
|
182
|
+
getAndInitTSCompileIntermediateDir() {
|
|
183
|
+
const dir = path_1.default.join(this.getTmpDir(), 'memlab-code');
|
|
184
|
+
this.rmDir(dir);
|
|
185
|
+
fs_extra_1.default.mkdirSync(dir);
|
|
186
|
+
return dir;
|
|
187
|
+
}
|
|
188
|
+
clearDataDirs(options = {}) {
|
|
189
|
+
const curDataDir = this.getCurDataDir(options);
|
|
190
|
+
if (!fs_extra_1.default.existsSync(curDataDir)) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const dataSuffix = ['.heapsnapshot', '.json', '.png'];
|
|
194
|
+
const files = fs_extra_1.default.readdirSync(curDataDir);
|
|
195
|
+
for (const file of files) {
|
|
196
|
+
inner: for (const suffix of dataSuffix) {
|
|
197
|
+
if (file.endsWith(suffix)) {
|
|
198
|
+
const filepath = path_1.default.join(curDataDir, file);
|
|
199
|
+
fs_extra_1.default.unlinkSync(filepath);
|
|
200
|
+
break inner;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
emptyDirIfExists(dir) {
|
|
206
|
+
if (this.isDirectory(dir)) {
|
|
207
|
+
fs_extra_1.default.emptyDirSync(dir);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
emptyTraceLogDataDir(options = {}) {
|
|
211
|
+
// all leak trace clusters
|
|
212
|
+
this.emptyDirIfExists(this.getTraceClustersDir(options));
|
|
213
|
+
// all JSON files for trace visualization
|
|
214
|
+
this.emptyDirIfExists(this.getTraceJSONDir(options));
|
|
215
|
+
// all unclassified clusters
|
|
216
|
+
this.emptyDirIfExists(this.getUnclassifiedTraceClusterDir(options));
|
|
217
|
+
// all unique cluster info
|
|
218
|
+
this.emptyDirIfExists(this.getUniqueTraceClusterDir(options));
|
|
219
|
+
}
|
|
220
|
+
resetBrowserDir() {
|
|
221
|
+
try {
|
|
222
|
+
const browserDir = this.getChromeBinaryDir();
|
|
223
|
+
const browserBinary = this.getChromeBinaryZipFile();
|
|
224
|
+
if (fs_extra_1.default.existsSync(browserBinary)) {
|
|
225
|
+
fs_extra_1.default.unlinkSync(browserBinary);
|
|
226
|
+
}
|
|
227
|
+
this.rmDir(browserDir);
|
|
228
|
+
joinAndProcessDir({}, browserDir);
|
|
229
|
+
}
|
|
230
|
+
catch (e) {
|
|
231
|
+
Console_1.default.error(Utils_1.default.getError(e).message);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
isDirectory(file) {
|
|
235
|
+
const stats = fs_extra_1.default.statSync(file);
|
|
236
|
+
return stats.isDirectory();
|
|
237
|
+
}
|
|
238
|
+
iterateAllFiles(dir, callback) {
|
|
239
|
+
if (!this.isDirectory(dir)) {
|
|
240
|
+
callback(dir);
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
const files = fs_extra_1.default.readdirSync(dir);
|
|
244
|
+
files.forEach((file) => {
|
|
245
|
+
const filepath = path_1.default.join(dir, file);
|
|
246
|
+
this.iterateAllFiles(filepath, callback);
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
rmWorkDir(options = {}) {
|
|
250
|
+
try {
|
|
251
|
+
this.rmDir(this.getWorkDir(options));
|
|
252
|
+
}
|
|
253
|
+
catch (e) {
|
|
254
|
+
Console_1.default.error(Utils_1.default.getError(e).message);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
isWithinInternalDirectory(filePath) {
|
|
258
|
+
const sep = path_1.default.sep;
|
|
259
|
+
const internalDir = Constant_1.default.internalDir;
|
|
260
|
+
return filePath.includes(`${sep}${internalDir}${sep}`);
|
|
261
|
+
}
|
|
262
|
+
initDirs(config, options = {}) {
|
|
263
|
+
config.monoRepoDir = Constant_1.default.monoRepoDir;
|
|
264
|
+
// make sure getWorkDir is called first before
|
|
265
|
+
// any other get file or get dir calls
|
|
266
|
+
const workDir = this.getWorkDir(options);
|
|
267
|
+
joinAndProcessDir(options, workDir);
|
|
268
|
+
options = Object.assign(Object.assign({}, options), { workDir });
|
|
269
|
+
config.dataBaseDir = joinAndProcessDir(options, this.getDataBaseDir(options));
|
|
270
|
+
config.browserDir = joinAndProcessDir(options, this.getChromeBinaryDir());
|
|
271
|
+
config.userDataDir = joinAndProcessDir(options, this.getUserDataDir(options));
|
|
272
|
+
const outDir = joinAndProcessDir(options, this.getDataOutDir(options));
|
|
273
|
+
config.curDataDir = joinAndProcessDir(options, this.getCurDataDir(options));
|
|
274
|
+
config.dataBuilderDataDir = joinAndProcessDir(options, config.dataBaseDir, 'dataBuilder');
|
|
275
|
+
config.persistentDataDir = joinAndProcessDir(options, this.getPersistDataDir(options));
|
|
276
|
+
config.consoleLogFile = path_1.default.join(config.curDataDir, 'console-log.txt');
|
|
277
|
+
config.runMetaFile = path_1.default.join(config.curDataDir, 'run-meta.json');
|
|
278
|
+
config.snapshotSequenceFile = path_1.default.join(config.curDataDir, 'snap-seq.json');
|
|
279
|
+
config.browserInfoSummary = path_1.default.join(config.curDataDir, 'browser-info.txt');
|
|
280
|
+
config.exploreResultFile = this.getLeakSummaryFile(options);
|
|
281
|
+
config.singleReportSummary = path_1.default.join(outDir, 'report.txt');
|
|
282
|
+
config.unboundObjectCSV = path_1.default.join(outDir, 'unbound-object.csv');
|
|
283
|
+
config.inputDataDir = joinAndProcessDir(options, this.getInputDataDir());
|
|
284
|
+
config.reportOutDir = joinAndProcessDir(options, this.getReportOutDir(options));
|
|
285
|
+
config.previewReportDir = joinAndProcessDir(options, this.getPreviewReportDir(options));
|
|
286
|
+
config.viewJsonFile = path_1.default.join(config.reportOutDir, 'js', 'gc-path.js');
|
|
287
|
+
config.cookieSettingFile = path_1.default.join(config.persistentDataDir, 'cookie-setting.json');
|
|
288
|
+
config.traceClusterFile = path_1.default.join(config.persistentDataDir, 'trace-cluster.json');
|
|
289
|
+
const loggerOutDir = joinAndProcessDir(options, this.getLoggerOutDir(options));
|
|
290
|
+
// trace cluster meta info
|
|
291
|
+
config.traceClusterOutDir = joinAndProcessDir(options, this.getTraceClustersDir(options));
|
|
292
|
+
// detailed trace json files for visualization
|
|
293
|
+
config.traceJsonOutDir = joinAndProcessDir(options, this.getTraceJSONDir(options));
|
|
294
|
+
config.metricsOutDir = joinAndProcessDir(options, loggerOutDir, 'metrics');
|
|
295
|
+
config.reportScreenshotFile = path_1.default.join(outDir, 'report.png');
|
|
296
|
+
const codeDataDir = this.getCodeDataDir();
|
|
297
|
+
config.externalRunMetaFile = path_1.default.join(codeDataDir, 'run-meta.json');
|
|
298
|
+
config.externalSnapshotVisitOrderFile = path_1.default.join(codeDataDir, 'visit-order.json');
|
|
299
|
+
joinAndProcessDir(options, this.getUniqueTraceClusterDir(options));
|
|
300
|
+
config.newUniqueClusterDir = joinAndProcessDir(options, this.getNewUniqueTraceClusterDir(options));
|
|
301
|
+
config.staleUniqueClusterDir = joinAndProcessDir(options, this.getStaleUniqueTraceClusterDir(options));
|
|
302
|
+
config.currentUniqueClusterDir = joinAndProcessDir(options, this.getExistingUniqueTraceClusterDir(options));
|
|
303
|
+
config.unclassifiedClusterDir = joinAndProcessDir(options, this.getUnclassifiedTraceClusterDir(options));
|
|
304
|
+
config.allClusterSummaryFile = this.getAllClusterSummaryFile(options);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
exports.FileManager = FileManager;
|
|
308
|
+
FileManager.transcientInstanceIdx = 0;
|
|
309
|
+
exports.default = new FileManager();
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
* @emails oncall+ws_labs
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
import type { E2EStepInfo, HeapNodeIdSet, IHeapNode, IHeapSnapshot, IMemoryAnalystOptions, IMemoryAnalystSnapshotDiff, LeakTracePathItem, Optional, IOveralLeakInfo, TraceCluster } from './Types';
|
|
11
|
+
import TraceFinder from '../paths/TraceFinder';
|
|
12
|
+
declare class MemoryAnalyst {
|
|
13
|
+
checkLeak(): Promise<void>;
|
|
14
|
+
checkUnbound(options?: IMemoryAnalystOptions): Promise<void>;
|
|
15
|
+
breakDownMemoryByShapes(options?: {
|
|
16
|
+
file?: string;
|
|
17
|
+
}): Promise<void>;
|
|
18
|
+
detectUnboundGrowth(options?: IMemoryAnalystOptions): Promise<void>;
|
|
19
|
+
detectMemoryLeaks(): Promise<void>;
|
|
20
|
+
visualizeMemoryUsage(options?: IMemoryAnalystOptions): void;
|
|
21
|
+
focus(options?: {
|
|
22
|
+
file?: string;
|
|
23
|
+
}): Promise<void>;
|
|
24
|
+
shouldLoadCompleteSnapshot(tabsOrder: E2EStepInfo[], tab: E2EStepInfo): boolean;
|
|
25
|
+
diffSnapshots(loadAll?: boolean): Promise<IMemoryAnalystSnapshotDiff>;
|
|
26
|
+
private calculateRetainedSizes;
|
|
27
|
+
preparePathFinder(snapshot: IHeapSnapshot): TraceFinder;
|
|
28
|
+
private dumpPageInteractionSummary;
|
|
29
|
+
private dumpLeakSummaryToConsole;
|
|
30
|
+
private checkDetachedFiberNode;
|
|
31
|
+
private isTrivialNode;
|
|
32
|
+
private filterLeakedObjects;
|
|
33
|
+
aggregateDominatorMetrics(ids: HeapNodeIdSet, snapshot: IHeapSnapshot, checkNodeCb: (node: IHeapNode) => boolean, nodeMetricsCb: (node: IHeapNode) => number): number;
|
|
34
|
+
private getOverallHeapInfo;
|
|
35
|
+
getRetainedSize(node: IHeapNode): number;
|
|
36
|
+
getOverallLeakInfo(leakedNodeIds: HeapNodeIdSet, snapshot: IHeapSnapshot): Optional<IOveralLeakInfo>;
|
|
37
|
+
private printHeapInfo;
|
|
38
|
+
private breakDownSnapshotByShapes;
|
|
39
|
+
private isTrivialEdgeForBreakDown;
|
|
40
|
+
private breakDownByReferrers;
|
|
41
|
+
searchLeakedTraces(leakedNodeIds: HeapNodeIdSet, snapshot: IHeapSnapshot): Promise<{
|
|
42
|
+
paths: LeakTracePathItem[];
|
|
43
|
+
}>;
|
|
44
|
+
serializeClusterUpdate(clusters: TraceCluster[], options?: {
|
|
45
|
+
reclusterOnly?: boolean;
|
|
46
|
+
}): Promise<void>;
|
|
47
|
+
dumpPathByNodeId(leakedIdSet: HeapNodeIdSet, snapshot: IHeapSnapshot, nodeIdsInSnapshots: Array<HeapNodeIdSet>, id: number, pathLoaderFile: string, summaryFile: string): void;
|
|
48
|
+
}
|
|
49
|
+
declare const _default: MemoryAnalyst;
|
|
50
|
+
export default _default;
|
|
51
|
+
//# sourceMappingURL=HeapAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HeapAnalyzer.d.ts","sourceRoot":"","sources":["../../src/lib/HeapAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EAEb,SAAS,EACT,aAAa,EAGb,qBAAqB,EACrB,0BAA0B,EAE1B,iBAAiB,EAEjB,QAAQ,EACR,eAAe,EACf,YAAY,EACb,MAAM,SAAS,CAAC;AAOjB,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAO/C,cAAM,aAAa;IACX,SAAS;IAMT,YAAY,CAAC,OAAO,GAAE,qBAA0B;IAMhD,uBAAuB,CAAC,OAAO,GAAE;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAM;IAgBrD,mBAAmB,CAAC,OAAO,GAAE,qBAA0B;IA8IvD,iBAAiB;IAgBvB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B;IAqDlD,KAAK,CAAC,OAAO,GAAE;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAM;IA0BzC,0BAA0B,CACxB,SAAS,EAAE,WAAW,EAAE,EACxB,GAAG,EAAE,WAAW,GACf,OAAO;IAUJ,aAAa,CAAC,OAAO,UAAQ,GAAG,OAAO,CAAC,0BAA0B,CAAC;IA8FzE,OAAO,CAAC,sBAAsB;IAO9B,iBAAiB,CAAC,QAAQ,EAAE,aAAa,GAAG,WAAW;IAavD,OAAO,CAAC,0BAA0B;IAOlC,OAAO,CAAC,wBAAwB;IA6ChC,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,mBAAmB;IA8C3B,yBAAyB,CACvB,GAAG,EAAE,aAAa,EAClB,QAAQ,EAAE,aAAa,EACvB,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,EACzC,aAAa,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,MAAM;IAc5C,OAAO,CAAC,kBAAkB;IA4C1B,eAAe,CAAC,IAAI,EAAE,SAAS;IAI/B,kBAAkB,CAChB,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,aAAa,GACtB,QAAQ,CAAC,eAAe,CAAC;IA4B5B,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,yBAAyB;IAoEjC,OAAO,CAAC,yBAAyB;IAWjC,OAAO,CAAC,oBAAoB;IAoDtB,kBAAkB,CACtB,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,aAAa;;;IA4FnB,sBAAsB,CAC1B,QAAQ,EAAE,YAAY,EAAE,EACxB,OAAO,GAAE;QAAC,aAAa,CAAC,EAAE,OAAO,CAAA;KAAM;IAqBzC,gBAAgB,CACd,WAAW,EAAE,aAAa,EAC1B,QAAQ,EAAE,aAAa,EACvB,kBAAkB,EAAE,KAAK,CAAC,aAAa,CAAC,EACxC,EAAE,EAAE,MAAM,EACV,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM;CAsCtB;;AAED,wBAAmC"}
|