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); }
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); }
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); }
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); }
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); }
public override ClrMethod GetMethodByAddress(ulong ip) { IMethodDescData mdData = GetMDForIP(ip); if (mdData == null) { return(null); } return(DesktopMethod.Create(this, mdData)); }
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)); }
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 }; }
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); } }
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); }
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); } } }
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); }
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)); }
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)); }
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)); }