public bool Load(string FileName)
        {
            if (!File.Exists(FileName))
            {
                return(false);
            }

            HLECacheFile CacheFile = new HLECacheFile();

            if (!CacheFile.Load(FileName))
            {
                return(false);
            }

            foreach (KeyValuePair <uint, string> Item in CacheFile.AddressMap)
            {
                DebuggerSymbol NewSymbol = new DebuggerSymbol();
                NewSymbol.Name      = Item.Value;
                NewSymbol.AddrBegin = Item.Key;

                AddSymbol(NewSymbol);
            }

            return(true);
        }
        public DebuggerSymbol FindSymbol(uint Address)
        {
            if (Providers.Count == 0)
            {
                return(null);
            }

            DebuggerSymbol BestResult = null;

            // Find the first provider who can give a symbol for this address

            int ProviderIndex = 0;

            do
            {
                BestResult = Providers[ProviderIndex].FindSymbolFromAddress(Address);
                if (BestResult != null)
                {
                    break;
                }

                ++ProviderIndex;
            }while (ProviderIndex < Providers.Count);

            // Failed to find any symbols
            if (BestResult == null)
            {
                return(null);
            }

            // Found an exact match
            if (BestResult.AddrBegin == Address)
            {
                return(BestResult);
            }

            // Otherwise, try and find another symbol which is closer to the given address
            // TODO Investigate adding symbol size metadata this can just check if Address is within a given range

            for (int i = ProviderIndex + 1; i < Providers.Count; ++i)
            {
                DebuggerSymbol OtherResult = Providers[i].FindSymbolFromAddress(Address);
                if (OtherResult == null)
                {
                    continue;
                }

                if (OtherResult.AddrBegin < BestResult.AddrBegin)
                {
                    BestResult = OtherResult;
                }
            }

            return(BestResult);
        }
 protected void RemoveSymbol(DebuggerSymbol Symbol)
 {
     Symbols.Remove(Symbol.AddrBegin);
 }
 protected void AddSymbol(DebuggerSymbol Symbol)
 {
     Symbols.Add(Symbol.AddrBegin, Symbol);
 }