WIP additional commands
authorDavid Mason <davmason@microsoft.com>
Sat, 17 Aug 2019 20:36:17 +0000 (13:36 -0700)
committerDavid Mason <davmason@microsoft.com>
Sat, 17 Aug 2019 20:36:17 +0000 (13:36 -0700)
src/SOS/Strike/strike.cpp
src/SOS/Strike/util.cpp
src/inc/dacprivate.h
src/inc/sospriv.idl
src/pal/prebuilt/inc/sospriv.h

index 77577adb3967d921da6aaf02c29864d5811fa0ec..fa22330b899cb54bcbf1b881fdb055bea27557e2 100644 (file)
@@ -147,6 +147,9 @@ const PROCESSINFOCLASS ProcessVmCounters = static_cast<PROCESSINFOCLASS>(3);
 
 #endif // !FEATURE_PAL
 
+// Max number of methods that !dumpmodule -prof will print
+const UINT kcMaxMethodDescsForProfiler = 100;
+
 #include <set>
 #include <vector>
 #include <map>
@@ -900,6 +903,19 @@ DECLARE_API(DumpIL)
         }
         else
         {
+            TADDR ilAddr = NULL;
+            struct DacpProfilerILData ilData;
+            ReleaseHolder<ISOSDacInterface7> 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<ISOSDacInterface7> 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;
 }
 
index 476753302b3382f4b4d38e735ef3ea46883b7b1d..9f235ecddf07b809c3750473f13ab696829ee333 100644 (file)
@@ -2814,7 +2814,7 @@ void DumpRejitData(CLRDATA_ADDRESS pMethodDesc, DacpReJitData * pReJitData)
     struct DacpReJitData2 rejitData;
     ReleaseHolder<ISOSDacInterface7> sos7;
     if (SUCCEEDED(g_sos->QueryInterface(__uuidof(ISOSDacInterface7), &sos7)) && 
-        SUCCEEDED(sos7->GetRejitInformation(pMethodDesc, 
+        SUCCEEDED(sos7->GetReJITInformation(pMethodDesc, 
                                             (int)pReJitData->rejitID,
                                             &rejitData)))
     {
index d9a5ca4ada7b88f94bbf831cfbf72ae105e3ae4c..02ec2eb698ceee1d0d3babf3dd7b172c85641dc0 100644 (file)
@@ -537,12 +537,26 @@ struct MSLAYOUT DacpReJitData2 : ZeroInit<DacpReJitData2>
         kReverted,
     };
 
-    CLRDATA_ADDRESS                 rejitID;
+    ULONG                           rejitID;
     Flags                           flags;
     CLRDATA_ADDRESS                 il;
     CLRDATA_ADDRESS                 ilCodeVersionNodePtr;
 };
 
+struct MSLAYOUT DacpProfilerILData : ZeroInit<DacpProfilerILData>
+{
+    enum ModificationType
+    {
+        Unmodified,
+        ILModified,
+        ReJITModified,
+    };
+
+    ModificationType                type;
+    CLRDATA_ADDRESS                 il;
+    ULONG                           rejitID;
+};
+
 struct MSLAYOUT DacpMethodDescData : ZeroInit<DacpMethodDescData>
 {
     BOOL            bHasNativeCode;
index 2d60bbbd6b6e9a2f2e64f9c06b7b1b8b8e8042a4..1d1321b0c812c37cba4fe045237a0b231b9fac6c 100644 (file)
@@ -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);
 };
index c410b05b959d12768f17ab38261e740c08929902..75b8a528b5e3d18533e35baf889ae05b4a3c19a0 100644 (file)
@@ -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 */