From: David Mason Date: Sat, 17 Aug 2019 20:36:17 +0000 (-0700) Subject: WIP additional commands X-Git-Tag: submit/tizen/20191015.063341~12^2^2~4^2~5 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a6bfebdb7c466992ba186860d0ff9661611cfbaa;p=platform%2Fcore%2Fdotnet%2Fdiagnostics.git WIP additional commands --- diff --git a/src/SOS/Strike/strike.cpp b/src/SOS/Strike/strike.cpp index 77577adb3..fa22330b8 100644 --- a/src/SOS/Strike/strike.cpp +++ b/src/SOS/Strike/strike.cpp @@ -147,6 +147,9 @@ const PROCESSINFOCLASS ProcessVmCounters = static_cast(3); #endif // !FEATURE_PAL +// Max number of methods that !dumpmodule -prof will print +const UINT kcMaxMethodDescsForProfiler = 100; + #include #include #include @@ -900,6 +903,19 @@ DECLARE_API(DumpIL) } else { + TADDR ilAddr = NULL; + struct DacpProfilerILData ilData; + ReleaseHolder sos7; + if (SUCCEEDED(g_sos->QueryInterface(__uuidof(ISOSDacInterface7), &sos7)) && + SUCCEEDED(sos7->GetProfilerModifiedILInformation(MethodDescData.MethodDescPtr, &ilData))) + { + if (ilData.type == DacpProfilerILData::ILModified) + { + ExtOut("Found profiler modified IL\n"); + ilAddr = TO_TADDR(ilData.il); + } + } + // Factor this so that it returns a map from IL offset to the textual representation of the decoding // to be consumed by !u -il // The disassemble function can give a MethodDescData as well as the set of keys IL offsets @@ -920,22 +936,31 @@ DECLARE_API(DumpIL) return Status; } - ULONG pRva; - DWORD dwFlags; - if (pImport->GetRVA(MethodDescData.MDToken, &pRva, &dwFlags) != S_OK) - { - ExtOut("error in import\n"); - return Status; - } + if (ilAddr == NULL) + { + ULONG pRva; + DWORD dwFlags; + if (pImport->GetRVA(MethodDescData.MDToken, &pRva, &dwFlags) != S_OK) + { + ExtOut("error in import\n"); + return Status; + } - CLRDATA_ADDRESS ilAddrClr; - if (g_sos->GetILForModule(MethodDescData.ModulePtr, pRva, &ilAddrClr) != S_OK) - { - ExtOut("FindIL failed\n"); - return Status; + CLRDATA_ADDRESS ilAddrClr; + if (g_sos->GetILForModule(MethodDescData.ModulePtr, pRva, &ilAddrClr) != S_OK) + { + ExtOut("FindIL failed\n"); + return Status; + } + + ilAddr = TO_TADDR(ilAddrClr); } - TADDR ilAddr = TO_TADDR(ilAddrClr); + if (ilAddr == NULL) + { + ExtOut("Unkown error in reading function IL\n"); + return E_FAIL; + } IfFailRet(DecodeILFromAddress(pImport, ilAddr)); } } @@ -5979,14 +6004,16 @@ DECLARE_API(DumpModule) DWORD_PTR p_ModuleAddr = NULL; BOOL bMethodTables = FALSE; + BOOL bProfilerModified = FALSE; BOOL dml = FALSE; CMDOption option[] = { // name, vptr, type, hasValue {"-mt", &bMethodTables, COBOOL, FALSE}, #ifndef FEATURE_PAL - {"/d", &dml, COBOOL, FALSE} + {"/d", &dml, COBOOL, FALSE}, #endif + {"-prof", &bProfilerModified, COBOOL, FALSE}, }; CMDValue arg[] = { // vptr, type @@ -6056,6 +6083,64 @@ DECLARE_API(DumpModule) g_sos->TraverseModuleMap(TYPEREFTOMETHODTABLE, TO_CDADDR(p_ModuleAddr), ModuleMapTraverse, (LPVOID)mdTypeDefNil); } + if (bProfilerModified) + { + CLRDATA_ADDRESS methodDescs[kcMaxMethodDescsForProfiler]; + int cMethodDescs; + + ReleaseHolder sos7; + if (SUCCEEDED(g_sos->QueryInterface(__uuidof(ISOSDacInterface7), &sos7)) && + SUCCEEDED(sos7->GetMethodsWithProfilerModifiedIL(TO_CDADDR(p_ModuleAddr), + methodDescs, + kcMaxMethodDescsForProfiler, + &cMethodDescs))) + { + if (cMethodDescs >0) + { + ExtOut("\nMethods in this module with profiler modified IL:\n"); + for (int i = 0; i < cMethodDescs; ++i) + { + CLRDATA_ADDRESS md = methodDescs[i]; + + DMLOut("MethodDesc: %s ", DMLMethodDesc(md)); + + // Easiest to get full parameterized method name from ..::GetMethodName + if (g_sos->GetMethodDescName(md, mdNameLen, g_mdName, NULL) == S_OK) + { + ExtOut("Name: %S", g_mdName); + } + + struct DacpProfilerILData ilData; + if (SUCCEEDED(sos7->GetProfilerModifiedILInformation(md, &ilData))) + { + if (ilData.type == DacpProfilerILData::ILModified) + { + ExtOut(" (IL Modified)"); + } + else if (ilData.type == DacpProfilerILData::ReJITModified) + { + ExtOut(" (ReJIT Modified)"); + } + } + + ExtOut("\n"); + } + } + else + { + ExtOut("\nThis module has no methods with profiler modified IL.\n"); + } + } + else + { + ExtOut("\nThis runtime version does not support listing the profiler modified functions.\n"); + } + + + + HRESULT GetMethodsWithProfilerModifiedIL(CLRDATA_ADDRESS module, CLRDATA_ADDRESS *methodDescs, int cMethodDescs, int *pcMethodDescs); + } + return Status; } diff --git a/src/SOS/Strike/util.cpp b/src/SOS/Strike/util.cpp index 476753302..9f235ecdd 100644 --- a/src/SOS/Strike/util.cpp +++ b/src/SOS/Strike/util.cpp @@ -2814,7 +2814,7 @@ void DumpRejitData(CLRDATA_ADDRESS pMethodDesc, DacpReJitData * pReJitData) struct DacpReJitData2 rejitData; ReleaseHolder sos7; if (SUCCEEDED(g_sos->QueryInterface(__uuidof(ISOSDacInterface7), &sos7)) && - SUCCEEDED(sos7->GetRejitInformation(pMethodDesc, + SUCCEEDED(sos7->GetReJITInformation(pMethodDesc, (int)pReJitData->rejitID, &rejitData))) { diff --git a/src/inc/dacprivate.h b/src/inc/dacprivate.h index d9a5ca4ad..02ec2eb69 100644 --- a/src/inc/dacprivate.h +++ b/src/inc/dacprivate.h @@ -537,12 +537,26 @@ struct MSLAYOUT DacpReJitData2 : ZeroInit kReverted, }; - CLRDATA_ADDRESS rejitID; + ULONG rejitID; Flags flags; CLRDATA_ADDRESS il; CLRDATA_ADDRESS ilCodeVersionNodePtr; }; +struct MSLAYOUT DacpProfilerILData : ZeroInit +{ + enum ModificationType + { + Unmodified, + ILModified, + ReJITModified, + }; + + ModificationType type; + CLRDATA_ADDRESS il; + ULONG rejitID; +}; + struct MSLAYOUT DacpMethodDescData : ZeroInit { BOOL bHasNativeCode; diff --git a/src/inc/sospriv.idl b/src/inc/sospriv.idl index 2d60bbbd6..1d1321b0c 100644 --- a/src/inc/sospriv.idl +++ b/src/inc/sospriv.idl @@ -385,5 +385,7 @@ interface ISOSDacInterface6 : IUnknown ] interface ISOSDacInterface7 : IUnknown { - HRESULT GetRejitInformation(CLRDATA_ADDRESS methodDesc, int rejitId, struct DacpReJitData2 *pRejitData); + 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 c410b05b9..75b8a528b 100644 --- a/src/pal/prebuilt/inc/sospriv.h +++ b/src/pal/prebuilt/inc/sospriv.h @@ -6,7 +6,7 @@ /* File created by MIDL compiler version 8.01.0622 */ /* at Mon Jan 18 19:14:07 2038 */ -/* Compiler settings for C:/git/coreclr/src/inc/sospriv.idl: +/* Compiler settings for C:/git/diagnostics/src/inc/sospriv.idl: Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 protocol : dce , ms_ext, c_ext, robust error checks: allocation ref bounds_check enum stub_data @@ -2392,11 +2392,21 @@ EXTERN_C const IID IID_ISOSDacInterface7; ISOSDacInterface7 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE GetRejitInformation( + virtual HRESULT STDMETHODCALLTYPE GetReJITInformation( CLRDATA_ADDRESS methodDesc, int rejitId, struct DacpReJitData2 *pRejitData) = 0; + virtual HRESULT STDMETHODCALLTYPE GetProfilerModifiedILInformation( + CLRDATA_ADDRESS methodDesc, + struct DacpProfilerILData *pILData) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetMethodsWithProfilerModifiedIL( + CLRDATA_ADDRESS mod, + CLRDATA_ADDRESS *methodDescs, + int cMethodDescs, + int *pcMethodDescs) = 0; + }; @@ -2418,12 +2428,24 @@ EXTERN_C const IID IID_ISOSDacInterface7; ULONG ( STDMETHODCALLTYPE *Release )( ISOSDacInterface7 * This); - HRESULT ( STDMETHODCALLTYPE *GetRejitInformation )( + HRESULT ( STDMETHODCALLTYPE *GetReJITInformation )( ISOSDacInterface7 * This, CLRDATA_ADDRESS methodDesc, int rejitId, struct DacpReJitData2 *pRejitData); + HRESULT ( STDMETHODCALLTYPE *GetProfilerModifiedILInformation )( + ISOSDacInterface7 * This, + CLRDATA_ADDRESS methodDesc, + struct DacpProfilerILData *pILData); + + HRESULT ( STDMETHODCALLTYPE *GetMethodsWithProfilerModifiedIL )( + ISOSDacInterface7 * This, + CLRDATA_ADDRESS mod, + CLRDATA_ADDRESS *methodDescs, + int cMethodDescs, + int *pcMethodDescs); + END_INTERFACE } ISOSDacInterface7Vtbl; @@ -2447,8 +2469,14 @@ EXTERN_C const IID IID_ISOSDacInterface7; ( (This)->lpVtbl -> Release(This) ) -#define ISOSDacInterface7_GetRejitInformation(This,methodDesc,rejitId,pRejitData) \ - ( (This)->lpVtbl -> GetRejitInformation(This,methodDesc,rejitId,pRejitData) ) +#define ISOSDacInterface7_GetReJITInformation(This,methodDesc,rejitId,pRejitData) \ + ( (This)->lpVtbl -> GetReJITInformation(This,methodDesc,rejitId,pRejitData) ) + +#define ISOSDacInterface7_GetProfilerModifiedILInformation(This,methodDesc,pILData) \ + ( (This)->lpVtbl -> GetProfilerModifiedILInformation(This,methodDesc,pILData) ) + +#define ISOSDacInterface7_GetMethodsWithProfilerModifiedIL(This,mod,methodDescs,cMethodDescs,pcMethodDescs) \ + ( (This)->lpVtbl -> GetMethodsWithProfilerModifiedIL(This,mod,methodDescs,cMethodDescs,pcMethodDescs) ) #endif /* COBJMACROS */