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); } }
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); }
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); }
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)); }
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); }
public override bool TryGetSymbolCore(ulong address, out SymbolResolverResult result) { result = default; return(false); }
public abstract bool TryGetSymbolCore(ulong address, out SymbolResolverResult result);