示例#1
0
        private ulong GetMethodDescFromIp(ulong ip)
        {
            if (ip == 0)
            {
                return(0);
            }

            IMethodDescData data = Request <IMethodDescData, V35MethodDescData>(DacRequests.METHODDESC_IP_DATA, ip);

            if (data == null)
            {
                data = Request <IMethodDescData, V2MethodDescData>(DacRequests.METHODDESC_IP_DATA, ip);
            }

            if (data == null)
            {
                CodeHeaderData codeHeaderData = new CodeHeaderData();
                if (RequestStruct(DacRequests.CODEHEADER_DATA, ip, ref codeHeaderData))
                {
                    return(codeHeaderData.MethodDesc);
                }
            }

            return(data != null ? data.MethodDesc : 0);
        }
示例#2
0
        protected override DesktopStackFrame GetStackFrame(DesktopThread thread, byte[] context, ulong ip, ulong sp, ulong frameVtbl)
        {
            DesktopStackFrame frame;

            ClearBuffer();

            if (frameVtbl != 0)
            {
                ClrMethod method    = null;
                string    frameName = "Unknown Frame";
                if (Request(DacRequests.FRAME_NAME, frameVtbl, _buffer))
                {
                    frameName = BytesToString(_buffer);
                }

                IMethodDescData mdData = GetMethodDescData(DacRequests.METHODDESC_FRAME_DATA, sp);
                if (mdData != null)
                {
                    method = DesktopMethod.Create(this, mdData);
                }

                frame = new DesktopStackFrame(this, thread, context, sp, frameName, method);
            }
            else
            {
                ulong md = GetMethodDescFromIp(ip);
                frame = new DesktopStackFrame(this, thread, context, ip, sp, md);
            }

            return(frame);
        }
示例#3
0
文件: methods.cs 项目: zha0/DbgShell
        internal static ClrMethod Create(DesktopRuntimeBase runtime, IMethodDescData mdData)
        {
            if (mdData == null)
                return null;

            DesktopModule module = runtime.GetModule(mdData.Module);
            return Create(runtime, module != null ? module.GetMetadataImport() : null, mdData);
        }
示例#4
0
        internal static ClrMethod Create(DesktopRuntimeBase runtime, IMethodDescData mdData)
        {
            if (mdData == null)
                return null;

            DesktopModule module = runtime.GetModule(mdData.Module);
            return Create(runtime, module != null ? module.GetMetadataImport() : null, mdData);
        }
示例#5
0
文件: methods.cs 项目: zha0/DbgShell
 public DesktopMethod(DesktopRuntimeBase runtime, ulong md, IMethodDescData mdData, MethodAttributes attrs)
 {
     _runtime = runtime;
     _sig = runtime.GetNameForMD(md);
     _ip = mdData.NativeCodeAddr;
     _jit = mdData.JITType;
     _attrs = attrs;
     _token = mdData.MDToken;
     var heap = runtime.GetHeap();
     _type = (DesktopHeapType)heap.GetTypeByMethodTable(mdData.MethodTable, 0);
 }
示例#6
0
 public DesktopMethod(DesktopRuntimeBase runtime, ulong md, IMethodDescData mdData, MethodAttributes attrs)
 {
     m_runtime = runtime;
     m_sig = runtime.GetNameForMD(md);
     m_ip = mdData.NativeCodeAddr;
     m_jit = mdData.JITType;
     m_attrs = attrs;
     m_token = mdData.MDToken;
     var heap = (DesktopGCHeap)runtime.GetHeap();
     m_type = heap.GetGCHeapType(mdData.MethodTable, 0);
 }
示例#7
0
        public override ClrMethod GetMethodByAddress(ulong ip)
        {
            IMethodDescData mdData = GetMDForIP(ip);

            if (mdData == null)
            {
                return(null);
            }

            return(DesktopMethod.Create(this, mdData));
        }
示例#8
0
        internal static ClrMethod Create(DesktopRuntimeBase runtime, IMethodDescData mdData)
        {
            if (mdData == null)
            {
                return(null);
            }

            DesktopModule module = runtime.GetModule(mdData.Module);

            return(Create(runtime, module?.GetMetadataImport(), mdData));
        }
示例#9
0
        public DesktopMethod(DesktopRuntimeBase runtime, ulong md, IMethodDescData mdData, MethodAttributes attrs)
        {
            m_runtime = runtime;
            m_sig     = runtime.GetNameForMD(md);
            m_ip      = mdData.NativeCodeAddr;
            m_jit     = mdData.JITType;
            m_attrs   = attrs;
            m_token   = mdData.MDToken;
            var heap = (DesktopGCHeap)runtime.GetHeap();

            m_type = heap.GetGCHeapType(mdData.MethodTable, 0);
        }
示例#10
0
        public DesktopMethod(DesktopRuntimeBase runtime, ulong md, IMethodDescData mdData, MethodAttributes attrs)
        {
            _runtime        = runtime;
            _sig            = runtime.GetNameForMD(md);
            _ip             = mdData.NativeCodeAddr;
            CompilationType = mdData.JITType;
            _attrs          = attrs;
            _token          = mdData.MDToken;
            GCInfo          = mdData.GCInfo;
            ClrHeap heap = runtime.Heap;

            _type       = (DesktopHeapType)heap.GetTypeByMethodTable(mdData.MethodTable, 0);
            HotColdInfo = new HotColdRegions {
                HotStart = _ip, HotSize = mdData.HotSize, ColdStart = mdData.ColdStart, ColdSize = mdData.ColdSize
            };
        }
示例#11
0
        private void InitMethod(ulong md)
        {
            if (_method != null)
            {
                return;
            }

            if (_ip != 0 && _type == ClrStackFrameType.ManagedMethod)
            {
                _method = _runtime.GetMethodByAddress(_ip);
            }
            else if (md != 0)
            {
                IMethodDescData mdData = _runtime.GetMethodDescData(md);
                _method = DesktopMethod.Create(_runtime, mdData);
            }
        }
示例#12
0
        internal static DesktopMethod Create(DesktopRuntimeBase runtime, IMetadata metadata, IMethodDescData mdData)
        {
            if (mdData == null)
                return null;

            MethodAttributes attrs = (MethodAttributes)0;
            if (metadata != null)
            {
                int pClass, methodLength;
                uint blobLen, codeRva, implFlags;
                IntPtr blob;
                if (metadata.GetMethodProps(mdData.MDToken, out pClass, null, 0, out methodLength, out attrs, out blob, out blobLen, out codeRva, out implFlags) < 0)
                    attrs = (MethodAttributes)0;
            }

            return new DesktopMethod(runtime, mdData.MethodDesc, mdData, attrs);
        }
示例#13
0
        internal void InitMethodHandles()
        {
            var runtime = DesktopHeap.DesktopRuntime;

            foreach (ulong methodTable in EnumerateMethodTables())
            {
                foreach (ulong methodDesc in runtime.GetMethodDescList(methodTable))
                {
                    IMethodDescData data   = runtime.GetMethodDescData(methodDesc);
                    DesktopMethod   method = (DesktopMethod)GetMethod(data.MDToken);
                    if (method.Type != this)
                    {
                        continue;
                    }
                    method.AddMethodHandle(methodDesc);
                }
            }
        }
示例#14
0
        internal override IMethodDescData GetMDForIP(ulong ip)
        {
            IMethodDescData result = GetMethodDescData(DacRequests.METHODDESC_IP_DATA, ip);

            if (result != null)
            {
                return(result);
            }

            ulong methodDesc = GetMethodDescFromIp(ip);

            if (methodDesc != 0)
            {
                return(GetMethodDescData(DacRequests.METHODDESC_DATA, ip));
            }

            return(null);
        }
示例#15
0
        public override ClrMethod GetMethodByHandle(ulong methodHandle)
        {
            if (methodHandle == 0)
            {
                return(null);
            }

            IMethodDescData methodDesc = GetMethodDescData(methodHandle);

            if (methodDesc == null)
            {
                return(null);
            }

            ClrType type = Heap.GetTypeByMethodTable(methodDesc.MethodTable);

            if (type == null)
            {
                return(null);
            }

            return(type.GetMethod(methodDesc.MDToken));
        }
示例#16
0
        internal static DesktopMethod Create(DesktopRuntimeBase runtime, ICorDebug.IMetadataImport metadata, IMethodDescData mdData)
        {
            if (mdData == null)
            {
                return(null);
            }

            MethodAttributes attrs = (MethodAttributes)0;

            if (metadata != null)
            {
                int    pClass, methodLength;
                uint   blobLen, codeRva, implFlags;
                IntPtr blob;
                if (metadata.GetMethodProps(mdData.MDToken, out pClass, null, 0, out methodLength, out attrs, out blob, out blobLen, out codeRva, out implFlags) < 0)
                {
                    attrs = (MethodAttributes)0;
                }
            }

            return(new DesktopMethod(runtime, mdData.MethodDesc, mdData, attrs));
        }
示例#17
0
        internal static DesktopMethod Create(DesktopRuntimeBase runtime, MetaDataImport metadata, IMethodDescData mdData)
        {
            if (mdData == null)
            {
                return(null);
            }

            MethodAttributes attrs = new MethodAttributes();

            if (metadata != null)
            {
                attrs = metadata.GetMethodAttributes((int)mdData.MDToken);
            }

            return(new DesktopMethod(runtime, mdData.MethodDesc, mdData, attrs));
        }