node-oom-heapdump
Version:
Create a V8 heap snapshot when an "Out of Memory" error occurs, or create a heap snapshot or CPU profile on request.
56 lines (46 loc) • 1.62 kB
JavaScript
let fs = require('fs');
let dns = require("dns");
// set global variables based on args passed on to this CPU profile worker
let devToolsPort = process.argv[2];
let path = process.argv[3];
let duration = process.argv[4];
console.error('Started CPU profile (duration: %sms) %s worker on DevTools port \'%s\'.', duration, path, devToolsPort);
let CDP = require('chrome-remote-interface');
let writeStream = fs.createWriteStream(path);
let handleError = function (arg1, arg2) {
console.error("Error occurred while creating CPU profile", arg1, arg2 || "");
writeStream.end();
process.exit(-1);
};
writeStream.on('error', (err) => {
handleError("CPU profile path not valid or writable", err);
});
try {
dns.setDefaultResultOrder('ipv4first');
} catch (e) {
// ignore, method not available before node16
}
CDP({
host: 'localhost',
port: devToolsPort
}, (debugInstance) => {
let cpuProfiler = debugInstance.Profiler;
cpuProfiler.enable();
cpuProfiler.start();
setTimeout(() => {
let Profile = cpuProfiler.stop();
Profile.then((p) => {
writeStream.write(JSON.stringify(p.profile));
writeStream.end();
cpuProfiler.disable();
console.error('CPU profile created in \'%s\'. Exiting worker now.', path);
// were done, exit normally
process.exit(0);
}).catch((err) => {
handleError(err);
});
}, duration);
}).on('error', (err) => {
// cannot connect to the remote endpoint
handleError(err);
});