| Index: tools/tickprocessor.js
|
| diff --git a/tools/tickprocessor.js b/tools/tickprocessor.js
|
| index 51b5ae6fea2bb4601fad2de7bd890a0f2bb6a262..2a80d54bd6c519cadc17928e55bc603ce00fe25e 100644
|
| --- a/tools/tickprocessor.js
|
| +++ b/tools/tickprocessor.js
|
| @@ -50,7 +50,7 @@ function readFile(fileName) {
|
| try {
|
| return read(fileName);
|
| } catch (e) {
|
| - print(fileName + ': ' + (e.message || e));
|
| + printErr(fileName + ': ' + (e.message || e));
|
| throw e;
|
| }
|
| }
|
| @@ -81,7 +81,9 @@ function TickProcessor(
|
| timedRange,
|
| pairwiseTimedRange,
|
| onlySummary,
|
| - runtimeTimerFilter) {
|
| + runtimeTimerFilter,
|
| + preprocessJson) {
|
| + this.preprocessJson = preprocessJson;
|
| LogReader.call(this, {
|
| 'shared-library': { parsers: [null, parseInt, parseInt, parseInt],
|
| processor: this.processSharedLibrary },
|
| @@ -149,10 +151,10 @@ function TickProcessor(
|
| var op = Profile.Operation;
|
| switch (operation) {
|
| case op.MOVE:
|
| - print('Code move event for unknown code: 0x' + addr.toString(16));
|
| + printErr('Code move event for unknown code: 0x' + addr.toString(16));
|
| break;
|
| case op.DELETE:
|
| - print('Code delete event for unknown code: 0x' + addr.toString(16));
|
| + printErr('Code delete event for unknown code: 0x' + addr.toString(16));
|
| break;
|
| case op.TICK:
|
| // Only unknown PCs (the first frame) are reported as unaccounted,
|
| @@ -165,7 +167,11 @@ function TickProcessor(
|
| }
|
| };
|
|
|
| - this.profile_ = new V8Profile(separateIc);
|
| + if (preprocessJson) {
|
| + this.profile_ = new JsonProfile();
|
| + } else {
|
| + this.profile_ = new V8Profile(separateIc);
|
| + }
|
| this.codeTypes_ = {};
|
| // Count each tick as a time unit.
|
| this.viewBuilder_ = new ViewBuilder(1);
|
| @@ -204,7 +210,7 @@ TickProcessor.CALL_GRAPH_SIZE = 5;
|
| * @override
|
| */
|
| TickProcessor.prototype.printError = function(str) {
|
| - print(str);
|
| + printErr(str);
|
| };
|
|
|
|
|
| @@ -333,7 +339,9 @@ TickProcessor.prototype.processTick = function(pc,
|
| }
|
| }
|
|
|
| - this.profile_.recordTick(this.processStack(pc, tos_or_external_callback, stack));
|
| + this.profile_.recordTick(
|
| + ns_since_start, vmState,
|
| + this.processStack(pc, tos_or_external_callback, stack));
|
| };
|
|
|
|
|
| @@ -367,6 +375,11 @@ TickProcessor.prototype.processHeapSampleEnd = function(space, state) {
|
|
|
|
|
| TickProcessor.prototype.printStatistics = function() {
|
| + if (this.preprocessJson) {
|
| + this.profile_.writeJson();
|
| + return;
|
| + }
|
| +
|
| print('Statistical profiling result from ' + this.lastLogFileName_ +
|
| ', (' + this.ticks_.total +
|
| ' ticks, ' + this.ticks_.unaccounted + ' unaccounted, ' +
|
| @@ -676,7 +689,7 @@ UnixCppEntriesProvider.prototype.parseNextLine = function() {
|
| function MacCppEntriesProvider(nmExec, targetRootFS) {
|
| UnixCppEntriesProvider.call(this, nmExec, targetRootFS);
|
| // Note an empty group. It is required, as UnixCppEntriesProvider expects 3 groups.
|
| - this.FUNC_RE = /^([0-9a-fA-F]{8,16}) ()[iItT] (.*)$/;
|
| + this.FUNC_RE = /^([0-9a-fA-F]{8,16})() (.*)$/;
|
| };
|
| inherits(MacCppEntriesProvider, UnixCppEntriesProvider);
|
|
|
| @@ -823,7 +836,9 @@ function ArgumentsProcessor(args) {
|
| '--pairwise-timed-range': ['pairwiseTimedRange', true,
|
| 'Ignore ticks outside pairs of Date.now() calls'],
|
| '--only-summary': ['onlySummary', true,
|
| - 'Print only tick summary, exclude other information']
|
| + 'Print only tick summary, exclude other information'],
|
| + '--preprocess': ['preprocessJson', true,
|
| + 'Preprocess for consumption with web interface']
|
| };
|
| this.argsDispatch_['--js'] = this.argsDispatch_['-j'];
|
| this.argsDispatch_['--gc'] = this.argsDispatch_['-g'];
|
| @@ -841,6 +856,7 @@ ArgumentsProcessor.DEFAULTS = {
|
| callGraphSize: 5,
|
| ignoreUnknown: false,
|
| separateIc: false,
|
| + preprocessJson: null,
|
| targetRootFS: '',
|
| nm: 'nm',
|
| range: 'auto,auto',
|
|
|