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); }
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)); }