diff --git a/atom/common/lib/asar.js b/atom/common/lib/asar.js index 7033a95642092..f45e62b176ded 100644 --- a/atom/common/lib/asar.js +++ b/atom/common/lib/asar.js @@ -203,7 +203,24 @@ // Override fs APIs. exports.wrapFsWithAsar = function(fs) { - var exists, existsSync, internalModuleReadFile, internalModuleStat, lstat, lstatSync, mkdir, mkdirSync, readFile, readFileSync, readdir, readdirSync, realpath, realpathSync, stat, statSync, statSyncNoException; + var exists, existsSync, internalModuleReadFile, internalModuleStat, lstat, lstatSync, mkdir, mkdirSync, readFile, readFileSync, readdir, readdirSync, realpath, realpathSync, stat, statSync, statSyncNoException, logFDs, logASARAccess; + + logFDs = {}; + logASARAccess = function(asarPath, filePath, offset) { + if (!process.env.ELECTRON_LOG_ASAR_READS) { + return; + } + if (!logFDs[asarPath]) { + var logFilename, logPath; + const path = require('path'); + logFilename = path.basename(asarPath, '.asar') + '-access-log.txt'; + logPath = path.join(require('os').tmpdir(), logFilename); + logFDs[asarPath] = fs.openSync(logPath, 'a'); + console.log('Logging ' + asarPath + ' access to ' + logPath); + } + fs.writeSync(logFDs[asarPath], offset + ': ' + filePath + '\n'); + }; + lstatSync = fs.lstatSync; fs.lstatSync = function(p) { var archive, asarPath, filePath, isAsar, ref, stats; @@ -395,6 +412,7 @@ if (!(fd >= 0)) { return notFoundError(asarPath, filePath, callback); } + logASARAccess(asarPath, filePath, info.offset); return fs.read(fd, buffer, 0, info.size, info.offset, function(error) { return callback(error, encoding ? buffer.toString(encoding) : buffer); }); @@ -444,6 +462,7 @@ if (!(fd >= 0)) { notFoundError(asarPath, filePath); } + logASARAccess(asarPath, filePath, info.offset); fs.readSync(fd, buffer, 0, info.size, info.offset); if (encoding) { return buffer.toString(encoding); @@ -516,6 +535,7 @@ if (!(fd >= 0)) { return void 0; } + logASARAccess(asarPath, filePath, info.offset); fs.readSync(fd, buffer, 0, info.size, info.offset); return buffer.toString('utf8'); }; diff --git a/docs/api/environment-variables.md b/docs/api/environment-variables.md index 6b000aaa1080f..3483c19d6431d 100644 --- a/docs/api/environment-variables.md +++ b/docs/api/environment-variables.md @@ -25,6 +25,12 @@ Starts the process as a normal Node.js process. Prints Chrome's internal logging to console. +## `ELECTRON_LOG_ASAR_READS` + +When Electron reads from an ASAR file, log the read offset and file path to +the system `tmpdir`. The resulting file can be provided to the ASAR module +to optimize file ordering. + ## `ELECTRON_ENABLE_STACK_DUMPING` When Electron crashed, prints the stack trace to console.