Using SlowCalls
Getting a tree with instrumentation
First, you need to get a tree containing Javascript instrumentation that is fully working. (bug 507012 added the instrumentation, but it keeps getting perturbed by JS engine changes, so that it ends up getting mismatched JS function enters/exits.)
I've updated the patches in bug 605330 to work on top of dvander's recent refactoring of the tracemonkey branch (bug 603044). So to get it working, you'll need to apply two sets of patches:
- First, checkout the tracemonkey branch.
- Apply everything in bug 605330
- Add in an instrumentation client that just logs everything to a file (bug 580055, which needs to be updated at the time of this writing)
Building with instrumentation
You will need to configure with both --enable-functiontimer and --enable-trace-jscalls:
ac_add_options --enable-trace-jscalls ac_add_options --enable-functiontimer
I've also been running with --enable-debug, which probably provides a lot more verbosity in the functiontimer logs. But I haven't tried without it, so I'm not sure.
ac_add_options --enable-debug
Run your scenario
Set the following environment variables before running your scenario:
NSPR_LOG_MODULES=JSDiagnostics:5 NSPR_LOG_FILE=/tmp/minefield.log MOZ_FT=/tmp/minefield.tl
For example, I run with this command:
NSPR_LOG_MODULES=JSDiagnostics:5 NSPR_LOG_FILE=/tmp/minefield.log MOZ_FT=/tmp/minefield.tl dist/bin/firefox -no-remote -P Blank
Exit the browser when done.
Produce the jscalls output
Run the 'process-jscall-logs' script from bug 558200 giving the two log files generated above as options, and the '-f slowcalls' flag:
process-jscall-logs -f slowcalls /tmp/minefield.log /tmp/minefield.tl
(though if you're using the default names, you don't actually have to give them on the command line.) This will produce a file /tmp/slowcalls.html. Go to file:///tmp/slowcalls.html in a browser to view the output.