diff --git a/lib/internal/v8_prof_polyfill.js b/lib/internal/v8_prof_polyfill.js index 145b09e345bfa6..eed927f12a9b20 100644 --- a/lib/internal/v8_prof_polyfill.js +++ b/lib/internal/v8_prof_polyfill.js @@ -38,11 +38,12 @@ const os = { /^[0-9a-f]+-[0-9a-f]+$/.test(arg)) { return ''; } - } else if (process.platform === 'darwin') { - args.unshift('-c', name); - name = '/bin/sh'; } - return cp.spawnSync(name, args).stdout.toString(); + let out = cp.spawnSync(name, args).stdout.toString(); + // Auto c++filt names, but not [iItT] + if (process.platform === 'darwin' && name === 'nm') + out = macCppfiltNm(out); + return out; } }; const print = console.log; @@ -100,3 +101,30 @@ function versionCheck() { } } } + +function macCppfiltNm(out) { + // Re-grouped copy-paste from `tickprocessor.js` + const FUNC_RE = /^([0-9a-fA-F]{8,16} [iItT] )(.*)$/gm; + let entries = out.match(FUNC_RE); + if (entries === null) + return out; + + entries = entries.map((entry) => { + return entry.replace(/^[0-9a-fA-F]{8,16} [iItT] /, '') + }); + + let filtered; + try { + filtered = cp.spawnSync('c++filt', [ '-p' , '-i' ], { + input: entries.join('\n') + }).stdout.toString(); + } catch (e) { + return out; + } + + let i = 0; + filtered = filtered.split(/\n/g); + return out.replace(FUNC_RE, (all, prefix, postfix) => { + return prefix + (filtered[i++] || postfix); + }); +} diff --git a/lib/internal/v8_prof_processor.js b/lib/internal/v8_prof_processor.js index 86f06629e1b025..95b6254599a887 100644 --- a/lib/internal/v8_prof_processor.js +++ b/lib/internal/v8_prof_processor.js @@ -20,8 +20,7 @@ scriptFiles.forEach(function(s) { var tickArguments = []; if (process.platform === 'darwin') { - const nm = 'foo() { nm "$@" | (c++filt -p -i || cat) }; foo $@'; - tickArguments.push('--mac', '--nm=' + nm); + tickArguments.push('--mac'); } else if (process.platform === 'win32') { tickArguments.push('--windows'); } diff --git a/test/parallel/test-tick-processor.js b/test/parallel/test-tick-processor.js index 78fb2526fa6cfc..53dabeec638499 100644 --- a/test/parallel/test-tick-processor.js +++ b/test/parallel/test-tick-processor.js @@ -43,6 +43,14 @@ runTest(/RunInDebugContext/, setTimeout(function() { process.exit(0); }, 2000); f();`); +runTest(/Builtin_DateNow/, + `function f() { + this.ts = Date.now(); + setImmediate(function() { new f(); }); + }; + setTimeout(function() { process.exit(0); }, 2000); + f();`); + function runTest(pattern, code) { cp.execFileSync(process.execPath, ['-prof', '-pe', code]); var matches = fs.readdirSync(common.tmpDir);