Exemplo n.º 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);
        }
Exemplo n.º 2
0
        private ClrMethodData?GetJitCompiledMethodByCodeHeaderIfValid(SOSDac sos, CodeHeaderData codeHeader)
        {
            if (codeHeader.MethodStart.Value == -1 || codeHeader.HotRegionSize == 0)
            {
                return(null);
            }

            return(new(
                       sos.GetMethodDescName(codeHeader.MethodDesc),
                       unchecked ((ulong)codeHeader.MethodStart.Value),
                       codeHeader.HotRegionSize
                       ));
        }
Exemplo n.º 3
0
        private IMethodDescData GetMethodDescData(uint request_id, ulong addr)
        {
            if (addr == 0)
            {
                return(null);
            }

            IMethodDescData result;

            if (_version == DesktopVersion.v4 || _patch > 4016)
            {
                result = Request <IMethodDescData, V35MethodDescData>(request_id, addr);
            }
            else if (_patch < 3053)
            {
                result = Request <IMethodDescData, V2MethodDescData>(request_id, addr);
            }
            else
            {
                // We aren't sure which version it is between 3053 and 4016, so we'll just do both.  Slow, but we
                // might not even encounter those versions in the wild.
                result = Request <IMethodDescData, V35MethodDescData>(request_id, addr);
                if (result == null)
                {
                    result = Request <IMethodDescData, V2MethodDescData>(request_id, addr);
                }
            }

            if (result == null && request_id == DacRequests.METHODDESC_IP_DATA)
            {
                CodeHeaderData codeHeaderData = new CodeHeaderData();

                if (RequestStruct(DacRequests.CODEHEADER_DATA, addr, ref codeHeaderData))
                {
                    result = GetMethodDescData(DacRequests.METHODDESC_DATA, codeHeaderData.MethodDesc);
                }
            }

            return(result);
        }
Exemplo n.º 4
0
        internal override IList <ulong> GetMethodDescList(ulong methodTable)
        {
            IMethodTableData mtData = Request <IMethodTableData, LegacyMethodTableData>(DacRequests.METHODTABLE_DATA, methodTable);

            ulong[] values = new ulong[mtData.NumMethods];

            if (mtData.NumMethods == 0)
            {
                return(values);
            }

            CodeHeaderData codeHeader = new CodeHeaderData();

            byte[] slotArgs = new byte[0x10];
            byte[] result   = new byte[sizeof(ulong)];

            WriteValueToBuffer(methodTable, slotArgs, 0);
            for (int i = 0; i < mtData.NumMethods; ++i)
            {
                WriteValueToBuffer(i, slotArgs, sizeof(ulong));
                if (!Request(DacRequests.METHODTABLE_SLOT, slotArgs, result))
                {
                    continue;
                }

                ulong ip = BitConverter.ToUInt64(result, 0);

                if (!RequestStruct(DacRequests.CODEHEADER_DATA, ip, ref codeHeader))
                {
                    continue;
                }

                values[i] = codeHeader.MethodDesc;
            }

            return(values);
        }