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 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); }
private bool GetReferencedAddressToMethodName(out ulong refAddress, out uint codeSize, out string name, Instruction instruction, ClrRuntime runtime) { name = null; refAddress = 0; codeSize = 0; bool isAddressOk = false; for (int i = 0; i < instruction.OpCount; i++) { switch (instruction.GetOpKind(i)) { case OpKind.NearBranch16: case OpKind.NearBranch32: case OpKind.NearBranch64: refAddress = instruction.NearBranchTarget; isAddressOk = refAddress > ushort.MaxValue; break; case OpKind.Immediate64: refAddress = instruction.GetImmediate(i); isAddressOk = refAddress > ushort.MaxValue; break; case OpKind.Memory64: refAddress = instruction.MemoryAddress64; isAddressOk = refAddress > ushort.MaxValue; break; case OpKind.Memory when instruction.IsIPRelativeMemoryOperand: refAddress = instruction.IPRelativeMemoryAddress; isAddressOk = refAddress > ushort.MaxValue; break; case OpKind.Memory: refAddress = instruction.MemoryDisplacement; isAddressOk = refAddress > ushort.MaxValue; break; } } if (refAddress == 0) { return(false); } var jitHelperFunctionName = runtime.GetJitHelperFunctionName(refAddress); if (string.IsNullOrWhiteSpace(jitHelperFunctionName) == false) { name = jitHelperFunctionName; return(true); } var methodTableName = runtime.GetMethodTableName(refAddress); if (string.IsNullOrWhiteSpace(methodTableName) == false) { name = methodTableName; return(true); } var methodDescriptor = runtime.GetMethodByHandle(refAddress); if (methodDescriptor != null) { name = methodDescriptor.Name; refAddress = methodDescriptor.HotColdInfo.HotStart; codeSize = methodDescriptor.HotColdInfo.HotSize; return(true); } var methodCall = runtime.GetMethodByAddress(refAddress); if (methodCall != null && string.IsNullOrWhiteSpace(methodCall.Name) == false) { name = methodCall.Name; refAddress = methodCall.HotColdInfo.HotStart; codeSize = methodCall.HotColdInfo.HotSize; return(true); } if (methodCall == null) { if (runtime.ReadPointer(refAddress, out ulong newAddress) && newAddress > ushort.MaxValue) { methodCall = runtime.GetMethodByAddress(newAddress); } if (methodCall is null) { return(false); } name = methodCall.Name; refAddress = methodCall.HotColdInfo.HotStart; codeSize = methodCall.HotColdInfo.HotSize; return(true); } return(false); }