TraceJS V2 R.I.P.
A couple of years ago I posted a small blog entry on a throwaway tool that I had created that uses the Debug API to log all JavaScript that Internet Explorer executes.
A year ago I decided to take a year off from consulting, mainly to spend a lot more time with our kids while they are still young, but also to have some time to explore some product ideas.
The first idea I wanted to explore was whether or not it might be possible to extend the idea I'd had in that older blog post to actually make a commercial product that would not only trace all JavaScript, but would also show call stacks, and show how often functions were executed.
Technically it was tricky because I wanted my custom JavaScript debugger to be loaded in-process into Internet Explorer, since I thought that this might speed it up considerably. The secret turned out to be that I needed to pass a special flag to IDebugProgramProvider2->GetProviderProcessData (the PFLAG_DEBUGGEE flag).
After a couple of months of development I finally got it all working.
You started it from the IE Tools menu:
This would create a separate TraceJS dialog:
Then as you access a page that contains JavaScript the TraceJS Window shows the statements that are being executed:
Once you'd captured the JavaScript execution, you could replay the executed JavaScript, either step-by-step, or continually at a pace you define:
Finally you could drill-down to see which functions are called the most, and who calls them:
I had it all working in my initial build environment, which was XP based. Then I tested in Vista, and I couldn't get it to work (the GetProviderProcessData failed). Ouch!
I took a step back, gave the product a long hard look, and decided to stop development. It was too slow (despite being entirely in-process), I couldn't implement features I needed such as timing (the debugging/tracing added too much overhead), and I couldn't get it working on Vista.
Now that IE8 has similar profiling features I'm happy I stopped when I did.
Of course the biggest mistake I made was to register the domain names for the product before it was completed (tracejs.com, jsprof.com, jsprofiler.com and javascriptprofiler.com are all mine).
If there is one sure way to kill a product idea it is to register domain names before you've executed on the product idea itself :-).