public DisassemblyContentProvider Create()
        {
            var blocks            = X86BlockFactory.Create(bitness, this.blocks);
            var cachedSymResolver = new CachedSymbolResolver();

            foreach (var block in blocks)
            {
                if (!string.IsNullOrEmpty(block.Label))
                {
                    cachedSymResolver.AddSymbol(block.Address, new SymbolResolverResult(SymbolKindUtils.ToSymbolKind(block.LabelKind), block.Label, block.Address), fakeSymbol: true);
                }
            }
            if (symbolResolver != null)
            {
                var addresses = GetPossibleSymbolAddresses(blocks);
                if (addresses.Length != 0)
                {
                    var symbolResolverResults = new SymbolResolverResult[addresses.Length];
                    symbolResolver.Resolve(addresses, symbolResolverResults);
                    cachedSymResolver.AddSymbols(addresses, symbolResolverResults, fakeSymbol: false);
                }
            }
            for (int i = 0; i < blocks.Length; i++)
            {
                var block = blocks[i];
                if (cachedSymResolver.TryResolve(block.Address, out var symbol, out _) && block.Label != symbol.Symbol)
                {
                    blocks[i] = new X86Block(block.Kind, block.Address, block.Comment, symbol.Symbol, SymbolKindUtils.ToFormatterOutputTextKind(symbol.Kind), block.Instructions);
                }
            }
            return(new X86DisassemblyContentProvider(bitness, cachedSymResolver, deps.DisasmSettings, deps.MasmSettings, deps.NasmSettings, deps.GasSettings, formatterOptions, header, optimization, blocks, codeInfo, variableInfo, methodName));
        }
 bool TryGetSymbolCore(ulong address, out SymbolResolverResult result)
 {
     Dispatcher.VerifyAccess();
     if (!engine.IsPaused)
     {
         result = default;
         return(false);
     }
     return(engine.clrDac.TryGetSymbolCore(address, out result));
 }
        public bool TryGetSymbol(ulong address, out SymbolResolverResult result)
        {
            if (Dispatcher.CheckAccess())
            {
                return(TryGetSymbolCore(address, out result));
            }
            return(TryGetSymbolCore2(address, out result));

            bool TryGetSymbolCore2(ulong address2, out SymbolResolverResult result2)
            {
                SymbolResolverResult resultTmp = default;
                bool res = Dispatcher.InvokeRethrow(() => TryGetSymbolCore(address2, out resultTmp));

                result2 = resultTmp;
                return(res);
            }
        }
Example #4
0
        public override bool TryGetSymbolCore(ulong address, out SymbolResolverResult result)
        {
            const ulong MIN_ADDR = 0x10000;

            if (address < MIN_ADDR)
            {
                result = default;
                return(false);
            }

            string name;

            name = clrRuntime.GetJitHelperFunctionName(address);
            if (!(name is null))
            {
                result = new SymbolResolverResult(SymbolKind.Function, name, address);
                return(true);
            }

            name = clrRuntime.GetMethodTableName(address);
            if (!(name is null))
            {
                result = new SymbolResolverResult(SymbolKind.Data, "methodtable(" + name + ")", address);
                return(true);
            }

            var method = clrRuntime.GetMethodByAddress(address);

            if (method is null && (address & ((uint)clrRuntime.PointerSize - 1)) == 0)
            {
                if (clrRuntime.ReadPointer(address, out ulong newAddress) && newAddress >= MIN_ADDR)
                {
                    method = clrRuntime.GetMethodByAddress(newAddress);
                }
            }
            if (!(method is null))
            {
                result = new SymbolResolverResult(SymbolKind.Function, method.ToString(), address);
                return(true);
            }

            result = default;
            return(false);
        }
Example #5
0
        public override bool TryGetSymbolCore(ulong address, out SymbolResolverResult result)
        {
            string name;

            name = clrRuntime.GetJitHelperFunctionName(address);
            if (name != null)
            {
                result = new SymbolResolverResult(SymbolKind.Function, name, address);
                return(true);
            }

            name = clrRuntime.GetMethodTableName(address);
            if (name != null)
            {
                result = new SymbolResolverResult(SymbolKind.Data, "methodtable(" + name + ")", address);
                return(true);
            }

            result = default;
            return(false);
        }
Example #6
0
        public DisassemblyContentProvider Create()
        {
            var blocks            = BlockFactory.Create(bitness, this.blocks);
            var cachedSymResolver = new CachedSymbolResolver();

            if (symbolResolver is not null)
            {
                var addresses = GetPossibleSymbolAddresses(blocks);
                if (addresses.Length != 0)
                {
                    var symbolResolverResults = new SymbolResolverResult[addresses.Length];
                    symbolResolver.Resolve(addresses, symbolResolverResults);
                    cachedSymResolver.AddSymbols(addresses, symbolResolverResults, fakeSymbol: false);
                }
            }
            foreach (var block in blocks)
            {
                if (!string2.IsNullOrEmpty(block.Label))
                {
                    cachedSymResolver.AddSymbol(block.Address, new SymbolResolverResult(SymbolKindUtils.ToSymbolKind(block.LabelKind), block.Label, block.Address), fakeSymbol: true);
                }
            }
            return(new DisassemblyContentProviderImpl(bitness, cachedSymResolver, deps.DisasmSettings, deps.MasmSettings, deps.NasmSettings, deps.GasSettings, formatterOptions, header, optimization, blocks, codeInfo, variableInfo, methodName, shortMethodName, moduleName));
        }
Example #7
0
        public override bool TryGetSymbolCore(ulong address, out SymbolResolverResult result)
        {
            string name;

            name = clrRuntime.GetJitHelperFunctionName(address);
            if (name != null)
            {
                result = new SymbolResolverResult(SymbolKind.Function, name, address);
                return(true);
            }

            name = clrRuntime.GetMethodTableName(address);
            if (name != null)
            {
                result = new SymbolResolverResult(SymbolKind.Data, "methodtable(" + name + ")", address);
                return(true);
            }

            var method = clrRuntime.GetMethodByAddress(address);

            if (method == null && address >= 0x10000)
            {
                if (clrRuntime.ReadPointer(address, out ulong newAddress))
                {
                    method = clrRuntime.GetMethodByAddress(newAddress);
                }
            }
            if (method != null)
            {
                result = new SymbolResolverResult(SymbolKind.Function, method.ToString(), method.NativeCode);
                return(true);
            }

            result = default;
            return(false);
        }
Example #8
0
 public override bool TryGetSymbolCore(ulong address, out SymbolResolverResult result)
 {
     result = default;
     return(false);
 }
Example #9
0
 public abstract bool TryGetSymbolCore(ulong address, out SymbolResolverResult result);