Exemplo n.º 1
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);
        }
Exemplo n.º 2
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);
        }
Exemplo n.º 3
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);
        }
Exemplo n.º 4
0
        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);
        }