diff options
author | Matt Loring <mattloring@google.com> | 2015-11-25 06:08:58 -0800 |
---|---|---|
committer | Ben Noordhuis <info@bnoordhuis.nl> | 2015-12-08 02:00:46 +0100 |
commit | 49440b7ea2496dbb7b343cf1872d96b92be470db (patch) | |
tree | fc9dfd71b00d985c78952a17db65a8a3b7dd73ce /lib | |
parent | a04721df66db6d18f35116bcebcd3c2c6ddb2d19 (diff) | |
download | node-new-49440b7ea2496dbb7b343cf1872d96b92be470db.tar.gz |
tools: add --prof-process flag to node binary
This change cleans up outstanding comments on #3032. It improves error
handling when no isolate file is provided and adds the --prof-process
flag to the node binary which executes the tick processor on the
provided isolate file.
PR-URL: https://github.com/nodejs/node/pull/4021
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Evan Lucas <evanlucas@me.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/internal/v8_prof_polyfill.js | 100 | ||||
-rw-r--r-- | lib/internal/v8_prof_processor.js | 44 |
2 files changed, 144 insertions, 0 deletions
diff --git a/lib/internal/v8_prof_polyfill.js b/lib/internal/v8_prof_polyfill.js new file mode 100644 index 0000000000..1beae0e4e4 --- /dev/null +++ b/lib/internal/v8_prof_polyfill.js @@ -0,0 +1,100 @@ +// Copyright 2012 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Node polyfill +var fs = require('fs'); +var os = { + system: function(name, args) { + if (process.platform === 'linux' && name === 'nm') { + // Filter out vdso and vsyscall entries. + var arg = args[args.length - 1]; + if (arg === '[vdso]' || + arg == '[vsyscall]' || + /^[0-9a-f]+-[0-9a-f]+$/.test(arg)) { + return ''; + } + } + return require('child_process').execFileSync( + name, args, {encoding: 'utf8'}); + } +}; +var print = console.log; +function read(fileName) { + return fs.readFileSync(fileName, 'utf8'); +} +arguments = process.argv.slice(2); +var quit = process.exit; + +// Polyfill "readline()". +var logFile = arguments[arguments.length - 1]; +try { + fs.accessSync(logFile); +} catch(e) { + console.error('Please provide a valid isolate file as the final argument.'); + process.exit(1); +} +var fd = fs.openSync(logFile, 'r'); +var buf = new Buffer(4096); +var dec = new (require('string_decoder').StringDecoder)('utf-8'); +var line = ''; +versionCheck(); +function readline() { + while (true) { + var lineBreak = line.indexOf('\n'); + if (lineBreak !== -1) { + var res = line.slice(0, lineBreak); + line = line.slice(lineBreak + 1); + return res; + } + var bytes = fs.readSync(fd, buf, 0, buf.length); + line += dec.write(buf.slice(0, bytes)); + if (line.length === 0) { + return false; + } + } +} + +function versionCheck() { + // v8-version looks like "v8-version,$major,$minor,$build,$patch,$candidate" + // whereas process.versions.v8 is either "$major.$minor.$build" or + // "$major.$minor.$build.$patch". + var firstLine = readline(); + line = firstLine + '\n' + line; + firstLine = firstLine.split(','); + var curVer = process.versions.v8.split('.'); + if (firstLine.length !== 6 && firstLine[0] !== 'v8-version') { + console.log('Unable to read v8-version from log file.'); + return; + } + // Compare major, minor and build; ignore the patch and candidate fields. + for (var i = 0; i < 3; i++) { + if (curVer[i] !== firstLine[i + 1]) { + console.log('Testing v8 version different from logging version'); + return; + } + } +} diff --git a/lib/internal/v8_prof_processor.js b/lib/internal/v8_prof_processor.js new file mode 100644 index 0000000000..543f977d4a --- /dev/null +++ b/lib/internal/v8_prof_processor.js @@ -0,0 +1,44 @@ +'use strict'; +var cp = require('child_process'); +var fs = require('fs'); +var path = require('path'); + +var scriptFiles = [ + 'internal/v8_prof_polyfill', + 'v8/tools/splaytree', + 'v8/tools/codemap', + 'v8/tools/csvparser', + 'v8/tools/consarray', + 'v8/tools/profile', + 'v8/tools/profile_view', + 'v8/tools/logreader', + 'v8/tools/tickprocessor', + 'v8/tools/SourceMap', + 'v8/tools/tickprocessor-driver' +]; +var tempScript = 'tick-processor-tmp-' + process.pid; +var tempNm = 'mac-nm-' + process.pid; + +process.on('exit', function() { + try { fs.unlinkSync(tempScript); } catch (e) {} + try { fs.unlinkSync(tempNm); } catch (e) {} +}); +process.on('uncaughtException', function(err) { + try { fs.unlinkSync(tempScript); } catch (e) {} + try { fs.unlinkSync(tempNm); } catch (e) {} + throw err; +}); + +scriptFiles.forEach(function(script) { + fs.appendFileSync(tempScript, process.binding('natives')[script]); +}); +var tickArguments = [tempScript]; +if (process.platform === 'darwin') { + fs.writeFileSync(tempNm, process.binding('natives')['v8/tools/mac-nm'], + { mode: 0o555 }); + tickArguments.push('--mac', '--nm=' + path.join(process.cwd(), tempNm)); +} else if (process.platform === 'win32') { + tickArguments.push('--windows'); +} +tickArguments.push.apply(tickArguments, process.argv.slice(1)); +cp.spawn(process.execPath, tickArguments, { stdio: 'inherit' }); |