From: David Mason Date: Wed, 21 Aug 2019 11:03:33 +0000 (-0700) Subject: bug fixes X-Git-Tag: submit/tizen/20191015.063341~12^2^2~4^2~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0587ecc7055a0f42ed9e1cf01475b006c0edfc79;p=platform%2Fcore%2Fdotnet%2Fdiagnostics.git bug fixes --- diff --git a/src/SOS/Strike/util.cpp b/src/SOS/Strike/util.cpp index 9f235ecdd..ff9584f11 100644 --- a/src/SOS/Strike/util.cpp +++ b/src/SOS/Strike/util.cpp @@ -2705,12 +2705,13 @@ const char *EHTypeName(EHClauseType et) return "UNKNOWN"; } -void DumpTieredNativeCodeAddressInfo(struct DacpTieredVersionData * pTieredVersionData, const UINT cTieredVersionData) +void DumpTieredNativeCodeAddressInfo(struct DacpTieredVersionData * pTieredVersionData, + const UINT cTieredVersionData, ULONG rejitID, CLRDATA_ADDRESS ilAddr, CLRDATA_ADDRESS ilNodeAddr) { - ExtOut(" Code Version History:\n"); - for(int i = cTieredVersionData - 1; i >= 0; --i) { + ExtOut("NativeCodeVersion: %p\n", SOS_PTR(pTieredVersionData[i].NativeCodeVersionNodePtr)); + const char *descriptor = NULL; switch(pTieredVersionData[i].OptimizationTier) { @@ -2735,92 +2736,43 @@ void DumpTieredNativeCodeAddressInfo(struct DacpTieredVersionData * pTieredVersi break; } + ExtOut(" ReJIT ID: %d\n", rejitID); DMLOut(" CodeAddr: %s (%s)\n", DMLIP(pTieredVersionData[i].NativeCodeAddr), descriptor); - ExtOut(" NativeCodeVersion: %p\n", SOS_PTR(pTieredVersionData[i].NativeCodeVersionNodePtr)); + DMLOut(" IL Addr: %s\n", DMLIL(ilAddr)); + ExtOut(" ILCodeVersion: %p\n", SOS_PTR(ilNodeAddr)); + } } -// 2.1 version -void DumpTieredNativeCodeAddressInfo_21(struct DacpTieredVersionData_21 * pTieredVersionData, const UINT cTieredVersionData) -{ - ExtOut("Code Version History:\n"); +void DumpRejitData(CLRDATA_ADDRESS pMethodDesc, DacpReJitData * pReJitData) +{ + int rejitID = (int)pReJitData->rejitID; + CLRDATA_ADDRESS ilAddr = 0; + CLRDATA_ADDRESS ilNodeAddr = 0; - for(int i = cTieredVersionData - 1; i >= 0; --i) + struct DacpReJitData2 rejitData; + ReleaseHolder sos7; + if (SUCCEEDED(g_sos->QueryInterface(__uuidof(ISOSDacInterface7), &sos7)) && + SUCCEEDED(sos7->GetReJITInformation(pMethodDesc, + rejitID, + &rejitData))) { - const char *descriptor = NULL; - switch(pTieredVersionData[i].TieredInfo) - { - case DacpTieredVersionData_21::TIERED_UNKNOWN: - default: - descriptor = "Unknown Tier"; - break; - case DacpTieredVersionData_21::NON_TIERED: - descriptor = "Non-Tiered"; - break; - case DacpTieredVersionData_21::TIERED_0: - descriptor = "Tier 0"; - break; - case DacpTieredVersionData_21::TIERED_1: - descriptor = "Tier 1"; - break; - } - - DMLOut(" CodeAddr: %s (%s)\n", DMLIP(pTieredVersionData[i].NativeCodeAddr), descriptor); - ExtOut(" NativeCodeVersion: %p\n", SOS_PTR(pTieredVersionData[i].NativeCodeVersionNodePtr)); + ilAddr = rejitData.il; + ilNodeAddr = rejitData.ilCodeVersionNodePtr; } -} - -void DumpRejitData(CLRDATA_ADDRESS pMethodDesc, DacpReJitData * pReJitData) -{ - ExtOut(" ReJITID %p: ", SOS_PTR(pReJitData->rejitID)); struct DacpTieredVersionData codeAddrs[kcMaxTieredVersions]; int cCodeAddrs; - LPCSTR szFlags; - switch (pReJitData->flags) - { - default: - case DacpReJitData::kUnknown: - szFlags = ""; - break; - - case DacpReJitData::kRequested: - szFlags = " (READY to jit on next call)"; - break; - - case DacpReJitData::kActive: - szFlags = " (CURRENT)"; - break; - - case DacpReJitData::kReverted: - szFlags = " (reverted)"; - break; - } - - ExtOut("%s\n", szFlags); - ReleaseHolder sos5; if (SUCCEEDED(g_sos->QueryInterface(__uuidof(ISOSDacInterface5), &sos5)) && SUCCEEDED(sos5->GetTieredVersions(pMethodDesc, - (int)pReJitData->rejitID, + rejitID, codeAddrs, kcMaxTieredVersions, &cCodeAddrs))) { - DumpTieredNativeCodeAddressInfo(codeAddrs, cCodeAddrs); - } - - struct DacpReJitData2 rejitData; - ReleaseHolder sos7; - if (SUCCEEDED(g_sos->QueryInterface(__uuidof(ISOSDacInterface7), &sos7)) && - SUCCEEDED(sos7->GetReJITInformation(pMethodDesc, - (int)pReJitData->rejitID, - &rejitData))) - { - ExtOut(" ReJIT Information:\n"); - DMLOut(" IL Addr: %s\n", DMLIL(rejitData.il)); - ExtOut(" ILCodeVersion: %p\n", SOS_PTR(rejitData.ilCodeVersionNodePtr)); + DumpTieredNativeCodeAddressInfo(codeAddrs, cCodeAddrs, rejitID, ilAddr, ilNodeAddr); } } @@ -2855,10 +2807,6 @@ void DumpAllRejitDataIfNecessary(DacpMethodDescData * pMethodDescData, DacpReJit { return; } - ExtOut("ReJITed versions:\n"); - - // Dump CURRENT rejit info - DumpRejitData(pMethodDescData->MethodDescPtr, &pMethodDescData->rejitDataCurrent); // Dump reverted rejit infos for (ULONG i=0; i < cRevertedRejitData; i++) @@ -2903,20 +2851,48 @@ void DumpMDInfoFromMethodDescData(DacpMethodDescData * pMethodDescData, DacpReJi DMLOut("Current CodeAddr: %s\n", DMLIP(pMethodDescData->NativeCodeAddr)); + int rejitID = (int)pMethodDescData->rejitDataCurrent.rejitID; + CLRDATA_ADDRESS ilAddr = 0; + CLRDATA_ADDRESS ilNodeAddr = 0; + + struct DacpReJitData2 rejitData; + ReleaseHolder sos7; + if (SUCCEEDED(g_sos->QueryInterface(__uuidof(ISOSDacInterface7), &sos7))) + { + if SUCCEEDED(sos7->GetReJITInformation(pMethodDescData->MethodDescPtr, + rejitID, + &rejitData)) + { + ilAddr = rejitData.il; + ilNodeAddr = rejitData.ilCodeVersionNodePtr; + } + + int pendingRejitID; + struct DacpReJitData2 pendingRejitData; + if (sos7->GetPendingReJITID(pMethodDescData->MethodDescPtr, &pendingRejitID) == S_OK && + SUCCEEDED(sos7->GetReJITInformation(pMethodDescData->MethodDescPtr, pendingRejitID, &pendingRejitData))) + { + // Special case, there is no jitted code yet but still need to output the IL information + ExtOut("ILCodeVersion: %p (pending)\n", SOS_PTR(pendingRejitData.ilCodeVersionNodePtr)); + ExtOut(" ReJIT ID: %d\n", pendingRejitID); + DMLOut(" IL Addr: %s\n", DMLIL(pendingRejitData.il)); + } + } + struct DacpTieredVersionData codeAddrs[kcMaxTieredVersions]; int cCodeAddrs; ReleaseHolder sos5; if (SUCCEEDED(g_sos->QueryInterface(__uuidof(ISOSDacInterface5), &sos5)) && SUCCEEDED(sos5->GetTieredVersions(pMethodDescData->MethodDescPtr, - (int)pMethodDescData->rejitDataCurrent.rejitID, + rejitID, codeAddrs, kcMaxTieredVersions, &cCodeAddrs))) { - DumpTieredNativeCodeAddressInfo(codeAddrs, cCodeAddrs); + DumpTieredNativeCodeAddressInfo(codeAddrs, cCodeAddrs, rejitID, ilAddr, ilNodeAddr); } - + DumpAllRejitDataIfNecessary(pMethodDescData, pRevertedRejitData, cRevertedRejitData); } else diff --git a/src/inc/sospriv.idl b/src/inc/sospriv.idl index f41053739..89a7d8469 100644 --- a/src/inc/sospriv.idl +++ b/src/inc/sospriv.idl @@ -385,6 +385,7 @@ interface ISOSDacInterface6 : IUnknown ] interface ISOSDacInterface7 : IUnknown { + HRESULT GetPendingReJITID(CLRDATA_ADDRESS methodDesc, int *pRejitId); HRESULT GetReJITInformation(CLRDATA_ADDRESS methodDesc, int rejitId, struct DacpReJitData2 *pRejitData); HRESULT GetProfilerModifiedILInformation(CLRDATA_ADDRESS methodDesc, struct DacpProfilerILData *pILData); HRESULT GetMethodsWithProfilerModifiedIL(CLRDATA_ADDRESS mod, CLRDATA_ADDRESS *methodDescs, int cMethodDescs, int *pcMethodDescs); diff --git a/src/pal/prebuilt/inc/sospriv.h b/src/pal/prebuilt/inc/sospriv.h index 4d4c504ef..2f03eb013 100644 --- a/src/pal/prebuilt/inc/sospriv.h +++ b/src/pal/prebuilt/inc/sospriv.h @@ -2392,6 +2392,10 @@ EXTERN_C const IID IID_ISOSDacInterface7; ISOSDacInterface7 : public IUnknown { public: + virtual HRESULT STDMETHODCALLTYPE GetPendingReJITID( + CLRDATA_ADDRESS methodDesc, + int *pRejitId) = 0; + virtual HRESULT STDMETHODCALLTYPE GetReJITInformation( CLRDATA_ADDRESS methodDesc, int rejitId, @@ -2428,6 +2432,11 @@ EXTERN_C const IID IID_ISOSDacInterface7; ULONG ( STDMETHODCALLTYPE *Release )( ISOSDacInterface7 * This); + HRESULT ( STDMETHODCALLTYPE *GetPendingReJITID )( + ISOSDacInterface7 * This, + CLRDATA_ADDRESS methodDesc, + int *pRejitId); + HRESULT ( STDMETHODCALLTYPE *GetReJITInformation )( ISOSDacInterface7 * This, CLRDATA_ADDRESS methodDesc, @@ -2469,6 +2478,9 @@ EXTERN_C const IID IID_ISOSDacInterface7; ( (This)->lpVtbl -> Release(This) ) +#define ISOSDacInterface7_GetPendingReJITID(This,methodDesc,pRejitId) \ + ( (This)->lpVtbl -> GetPendingReJITID(This,methodDesc,pRejitId) ) + #define ISOSDacInterface7_GetReJITInformation(This,methodDesc,rejitId,pRejitData) \ ( (This)->lpVtbl -> GetReJITInformation(This,methodDesc,rejitId,pRejitData) )