I’m the type of guy that when I fire up a new PC game my first stop before I even start playing is the options menu. I like to tweak things to my liking and even if I leave everything at default I like to know what options are there. If you have the same personality type then when you break out your fresh install of Visual Studio 2010 Ultimate and hear about the new debugging feature IntelliTrace then you might go straightaway to Tools->Options to see what setting you can tweak for this new feature. If so then this guide will be a good little start to telling you what the various options are and how you can tune IntelliTrace to work best for your debugging practices. As with my other articles it’s best to have a basic knowledge of how IntelliTrace works (note the name change from Historical Debugging to IntelliTrace) before jumping into this.

General Options

IntelliTrace options can be accessed via the Tools->Options menu in their own IntelliTrace tab group separate from the other debugger options. First up in the list is the general options page shown below.

The big checkbox on the top gives you the ability to turn off IntelliTrace collection globally. We’ve engineered it so that at default settings IntelliTrace has a very low overhead and given that, it’s turned on by default for all managed projects. But there can be some funny cases where it could inhibit performance so if you want IntelliTrace turned off totally just uncheck this box. Below that box is the selector to collect debugging information either at just IntelliTrace events or at both IntelliTrace events and function enters and exits. By default we have this set to just collect at events. When you turn on collection at function enters and exits you will get way more information about your program’s execution, but that information comes at a high cost in terms of execution time. This slowdown depends on the nature of your programs so you’ll have to experiment to see if this mode works for your scenarios or not.

Advanced Options

 

When you are running with IntelliTrace all the debugging events and information are getting packed away into an iTrace file behind the scenes. Unless you need to pass off debugging data to someone you might not ever even know that these files exist since we clear them off the system when Visual Studio is closed down. The first option on this page lets you specify the location that these files will be saved to. It also lets you know where to go to if you want to save off a debugging session to look back at later. Just make sure to move it out of this directory while VS is still running if you want to keep it around as this location will be cleared when you close down VS to prevent your hard drive from being flooded with iTrace files. Also to help control file sizes we’ve created a mechanism to limit the size of the iTrace files that are generated (especially with enters and exits turned on they can get large pretty quickly). The combo box below the file location lets you specify a maximum amount that file size can grow to. When we hit that max amount we will start to discard the oldest events and replace them with the newest ones so you don’t have to worry about losing any recent debugging information.

The next checkbox below that lets you turn on or off the IntelliTrace navigational control. The navigational control appears next to your current context when you are running in enters and exits mode to give you some quick hotkeys for stepping forward, back, out and in between previous function calls (more about this in a later blog post). It just takes a bit of space on the left side of your margin, but if you’re not using it and it’s in the way just uncheck this to get rid of it.

The next two options pertain to how symbols are looked up for IntelliTrace. The first option “Enable Team Foundation Server symbol path lookup” means that when you are going to analyze an iTrace file if you have Team Build configured then iTrace files with correct build info can automatically try to pull down the matching PDBs for the build this iTrace file was collected on. The second option “Prompt to enable source server support” comes into play when you open an iTrace file in which PDBs support source server lookup. In this scenario if the debugger is currently configured to not use source servers you will get a prompt when launching debugging from the iTrace to selected if you want to use source servers or not. If you are getting this nag prompt all the time just uncheck this box to remove the prompt. Note that in general IntelliTrace will use the same symbol paths as the debugger when looking to resolve symbols.

IntelliTrace Events

 

The IntelliTrace events page allows you to configure what at what events IntelliTrace will collect and log debugging data. Events are broken up into broad categories that can be enabled as a block or just event by event. In just about all default cases collecting IntelliTrace on just events is very low overhead but some specific scenarios could create noticeable slowdown in your application if the wrong set of events is configured. For example, we have an event configured for the WPF: Expander.Expanded event. Given normal UI programming idioms Expander.Expanded is likely to be called by user action and not in any type of tight loop. But if you create some odd program that programmatically opens and closes an Expander as fast as possible you’re going to be taking more of a hit from the IntelliTrace event collected on every expand. So be smart and don’t turn on Console.WriteLine events if you are continually writing all sorts of stuff to the console with no breaks between calls.

Modules

 

When collecting data you don’t always want to instrument everything under the sun. Especially when collecting on method enters and exits you will build up way too much data. This page lets you specify a substring which will exclude any module whos name contains that substring. By clicking the radio button you can also convert it to an allow list if you just have specific binaries that you are interested in. By default it’s a block list with Microsoft. (to exclude framework code) and several Microsoft specific public keys excluded from instrumentation.

Ian Huff