static void Main(string[] args)
    {
        List <Callstack>    stacks;
        List <CallTreeNode> callTreeRoots;

        CallstackFilter filter = delegate(CallstackKey key)
        {
            // This function can be used to remove functions that you think are unrelated to the leak.
            // Example:
            //  if (key.Contains("FunctionWithBalancedAddRefsAndReleases"))
            //      return false;

            return(true);
        };

        TracepointAnalysis.MaxCallstackDepth = 50;

        TracepointAnalysis.ReadFile(@"C:\Users\greggm\Desktop\leakdiag.txt", filter, out stacks, out callTreeRoots);

        TracepointAnalysis.ComputeAddRefReleaseDeltas(callTreeRoots);

        int       totalDelta    = callTreeRoots[0].Function.DeltaValue + callTreeRoots[1].Function.DeltaValue;
        const int expectedDelta = 2;

        if (totalDelta != expectedDelta)
        {
            if (totalDelta <= 0)
            {
                Console.WriteLine("AddRef/Release problem went away");
            }
            else
            {
                Console.WriteLine("AddRef/Release problem is bigger than expected");
            }

            return;
        }

        CallstackFunction.DumpFunctionsWithDelta(2);
        DumpStacks(stacks);
        //DumpCallTree(callTreeRoots);
    }