`/bin/sh -c` trick wasn't working for several reasons: * `/bin/sh -c "..."` expects the first argument after `"..."` to be a `$0`, not a `$1`. Previously `-n` wasn't passed to `nm` because of this, and many symbols were ordered improperly * `c++filt` was applied not only to the names of the functions but to their `nm` prefixes like `t` and `a` (`t xxx` turns into `unsigned char xxx`). Instead of applying `c++filt` wide and using `sh -c`, execute `nm` as requested by `deps/v8/tools/tickprocessor.js` and apply `c++filt` to all matching entries manually. Included test demonstrates where previous approach failed: all builtins were merged into `v8::internal::Builtins::~Builtins`, because they were prefixed by `t` in `nm` output. PR-URL: https://github.com/nodejs/node/pull/8480 Reviewed-By: Matthew Loring <mattloring@google.com>
66 lines
2 KiB
JavaScript
66 lines
2 KiB
JavaScript
'use strict';
|
|
const fs = require('fs');
|
|
const assert = require('assert');
|
|
const cp = require('child_process');
|
|
const common = require('../common');
|
|
|
|
// TODO(mhdawson) Currently the test-tick-processor functionality in V8
|
|
// depends on addresses being smaller than a full 64 bits. Aix supports
|
|
// the full 64 bits and the result is that it does not process the
|
|
// addresses correctly and runs out of memory
|
|
// Disabling until we get a fix upstreamed into V8
|
|
if (common.isAix) {
|
|
common.skip('Aix address range too big for scripts.');
|
|
return;
|
|
}
|
|
|
|
common.refreshTmpDir();
|
|
process.chdir(common.tmpDir);
|
|
// Unknown checked for to prevent flakiness, if pattern is not found,
|
|
// then a large number of unknown ticks should be present
|
|
runTest(/LazyCompile.*\[eval\]:1|.*% UNKNOWN/,
|
|
`function f() {
|
|
for (var i = 0; i < 1000000; i++) {
|
|
i++;
|
|
}
|
|
setImmediate(function() { f(); });
|
|
};
|
|
setTimeout(function() { process.exit(0); }, 2000);
|
|
f();`);
|
|
if (common.isWindows ||
|
|
common.isSunOS ||
|
|
common.isAix ||
|
|
common.isLinuxPPCBE ||
|
|
common.isFreeBSD) {
|
|
common.skip('C++ symbols are not mapped for this os.');
|
|
return;
|
|
}
|
|
runTest(/RunInDebugContext/,
|
|
`function f() {
|
|
require(\'vm\').runInDebugContext(\'Debug\');
|
|
setImmediate(function() { f(); });
|
|
};
|
|
setTimeout(function() { process.exit(0); }, 2000);
|
|
f();`);
|
|
|
|
runTest(/Runtime_DateCurrentTime/,
|
|
`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);
|
|
|
|
assert.strictEqual(matches.length, 1, 'There should be a single log file.');
|
|
|
|
var log = matches[0];
|
|
var out = cp.execSync(process.execPath +
|
|
' --prof-process --call-graph-size=10 ' + log,
|
|
{encoding: 'utf8'});
|
|
assert(pattern.test(out), `${pattern} not matching ${out}`);
|
|
fs.unlinkSync(log);
|
|
}
|