コード例 #1
0
        private ClrMethodData?FindJitCompiledMethodInMethodTable(SOSDac sos, MethodDescData originalMethodDesc)
        {
            // I can't really explain this, but it seems that some methods
            // are present multiple times in the same type -- one compiled
            // and one not compiled.

            if (!sos.GetMethodTableData(originalMethodDesc.MethodTable, out var methodTable))
            {
                return(null);
            }

            ClrMethodData?methodData = null;

            for (var i = 0u; i < methodTable.NumMethods; i++)
            {
                if (i == originalMethodDesc.SlotNumber)
                {
                    continue;
                }

                var slot = sos.GetMethodTableSlot(originalMethodDesc.MethodTable, i);
                if (!sos.GetCodeHeaderData(slot, out var candidateCodeHeader))
                {
                    continue;
                }

                if (!sos.GetMethodDescData(candidateCodeHeader.MethodDesc, 0, out var candidateMethodDesc))
                {
                    continue;
                }

                if (candidateMethodDesc.MDToken != originalMethodDesc.MDToken)
                {
                    continue;
                }

                methodData = GetJitCompiledMethodByCodeHeaderIfValid(sos, candidateCodeHeader);
                if (methodData != null)
                {
                    break;
                }
            }
            return(methodData);
        }
コード例 #2
0
        private ClrMethodData?GetJitCompiledMethodByMethodDescIfValid(SOSDac sos, MethodDescData methodDesc)
        {
            // https://github.com/microsoft/clrmd/issues/935
            var codeHeaderAddress = methodDesc.HasNativeCode != 0
                ? (ulong)methodDesc.NativeCodeAddr
                : sos.GetMethodTableSlot(methodDesc.MethodTable, methodDesc.SlotNumber);

            if (codeHeaderAddress == unchecked ((ulong)-1))
            {
                return(null);
            }

            if (!sos.GetCodeHeaderData(codeHeaderAddress, out var codeHeader))
            {
                return(null);
            }

            return(GetJitCompiledMethodByCodeHeaderIfValid(sos, codeHeader));
        }