Add GC start/stop info to tracelog
authorAleksei Vereshchagin <avereschagin@dev.rtsoft.ru>
Tue, 3 Apr 2018 20:30:42 +0000 (23:30 +0300)
committerAleksei Vereshchagin <avereschagin@dev.rtsoft.ru>
Fri, 6 Apr 2018 11:49:09 +0000 (14:49 +0300)
src/profiler.cpp
src/trace/commontrace.cpp
src/trace/commontrace.h
src/tracelog.cpp
src/tracelog.h

index 06be2b8ecf424cb8312ced27e9bd250ac6d697b7..a259cf112a18092c1a4c9caafd607631ecc9ff29 100644 (file)
@@ -914,11 +914,24 @@ HRESULT STDMETHODCALLTYPE Profiler::GarbageCollectionStarted(
 {
     LOG().Trace() << "GarbageCollectionStarted()";
 
+    HRESULT hrReturn = S_OK;
     HRESULT hr;
+
+    hr = m_commonTrace.GarbageCollectionStarted(
+        cGenerations, generationCollected, reason);
+    if (FAILED(hr) && SUCCEEDED(hrReturn))
+    {
+        hrReturn = hr;
+    }
+
     hr = m_memoryTrace.GarbageCollectionStarted(
         cGenerations, generationCollected, reason);
+    if (FAILED(hr) && SUCCEEDED(hrReturn))
+    {
+        hrReturn = hr;
+    }
 
-    return hr;
+    return hrReturn;
 }
 
 HRESULT STDMETHODCALLTYPE Profiler::SurvivingReferences(
@@ -934,10 +947,22 @@ HRESULT STDMETHODCALLTYPE Profiler::GarbageCollectionFinished()
 {
     LOG().Trace() << "GarbageCollectionFinished()";
 
+    HRESULT hrReturn = S_OK;
     HRESULT hr;
+
     hr = m_memoryTrace.GarbageCollectionFinished();
+    if (FAILED(hr) && SUCCEEDED(hrReturn))
+    {
+        hrReturn = hr;
+    }
 
-    return S_OK;
+    hr = m_commonTrace.GarbageCollectionFinished();
+    if (FAILED(hr) && SUCCEEDED(hrReturn))
+    {
+        hrReturn = hr;
+    }
+
+    return hrReturn;
 }
 
 HRESULT STDMETHODCALLTYPE Profiler::FinalizeableObjectQueued(
index 2c5f845ee68d7d17f3950d895186da0c9e3306ba..b330902713076f7487a1fc808655591a4b2a744e 100644 (file)
@@ -270,6 +270,7 @@ void CommonTrace::ProcessConfig(ProfilerConfig &config)
         | COR_PRF_MONITOR_ASSEMBLY_LOADS
         | COR_PRF_MONITOR_MODULE_LOADS
         | COR_PRF_MONITOR_CLASS_LOADS
+        | COR_PRF_MONITOR_GC
         | COR_PRF_MONITOR_THREADS;
 
     // This events are required for tracing of call stack dynamics.
@@ -1175,3 +1176,53 @@ HRESULT CommonTrace::ThreadAssignedToOSThread(
 
     return hr;
 }
+
+HRESULT CommonTrace::GarbageCollectionStarted(
+    int cGenerations,
+    BOOL generationCollected[],
+    COR_PRF_GC_REASON reason) noexcept
+{
+    if (m_disabled)
+        return S_OK;
+
+    HRESULT hr = S_OK;
+    try
+    {
+        ThreadInfo *pThreadInfo = m_profiler.GetCommonTrace().GetThreadInfo();
+        TRACE().DumpGarbageCollectionStarted(
+            pThreadInfo == nullptr ? InternalID() : pThreadInfo->internalId,
+            m_profiler.GetTickCountFromInit(),
+            cGenerations,
+            generationCollected,
+            reason
+        );
+    }
+    catch (const std::exception &e)
+    {
+        hr = m_profiler.HandleException(e);
+    }
+
+    return hr;
+}
+
+HRESULT CommonTrace::GarbageCollectionFinished() noexcept
+{
+    if (m_disabled)
+        return S_OK;
+
+    HRESULT hr = S_OK;
+    try
+    {
+        ThreadInfo *pThreadInfo = m_profiler.GetCommonTrace().GetThreadInfo();
+        TRACE().DumpGarbageCollectionFinished(
+            pThreadInfo == nullptr ? InternalID() : pThreadInfo->internalId,
+            m_profiler.GetTickCountFromInit()
+        );
+    }
+    catch (const std::exception &e)
+    {
+        hr = m_profiler.HandleException(e);
+    }
+
+    return hr;
+}
index 59e0683c4db4b06180577197d5093c968680b8af..2bcb0c1dabb31dd5187ccf8e1b72b7848147ac41 100644 (file)
@@ -141,6 +141,13 @@ public:
         ThreadID managedThreadId,
         DWORD osThreadId) noexcept;
 
+    HRESULT GarbageCollectionStarted(
+        int cGenerations,
+        BOOL generationCollected[],
+        COR_PRF_GC_REASON reason) noexcept;
+
+    HRESULT GarbageCollectionFinished() noexcept;
+
 private:
     int m_tlsThreadInfoIndex;
 
index 070bba177f620ec45487be418a8be952d2ef7b65..a518809c2b3b335bb67aa7e4ec088b6dcaf32148 100644 (file)
@@ -430,6 +430,56 @@ public:
         }
     }
 
+    virtual void DumpGarbageCollectionStarted(
+        InternalID  threadIid,
+        DWORD       ticksFromStart,
+        int         cGenerations,
+        BOOL        generationCollected[],
+        COR_PRF_GC_REASON     reason) override
+    {
+        std::lock_guard<std::mutex> streamLock(m_mStream);
+        if (threadIid.id == -1)
+        {
+            PAL_fprintf(m_pStream, "gch gcs ? %d", ticksFromStart);
+        }
+        else
+        {
+            PAL_fprintf(m_pStream, "gch gcs 0x%08x %d", threadIid.id,
+                ticksFromStart);
+        }
+        switch (reason)
+        {
+        case COR_PRF_GC_INDUCED:
+            PAL_fprintf(m_pStream, " induced");
+            break;
+        default:
+            PAL_fprintf(m_pStream, " ?");
+            break;
+        }
+        PAL_fprintf(m_pStream, cGenerations > 0 ? " " : "");
+        for (int i = 0; i < cGenerations; ++i)
+        {
+            PAL_fprintf(m_pStream, generationCollected[i] ? "t" : "f");
+        }
+        PAL_fprintf(m_pStream, "\n");
+    }
+
+    virtual void DumpGarbageCollectionFinished(
+        InternalID  threadIid,
+        DWORD       ticksFromStart) override
+    {
+        std::lock_guard<std::mutex> streamLock(m_mStream);
+        if (threadIid.id == -1)
+        {
+            PAL_fprintf(m_pStream, "gch gcf ? %d", ticksFromStart);
+        }
+        else
+        {
+            PAL_fprintf(m_pStream, "gch gcf 0x%08x %d", threadIid.id,
+                ticksFromStart);
+        }
+    }
+
     virtual void DumpGcHeapAllocTable(
         DWORD               ticksFromStart,
         const AllocTable    &allocInfoByTypes) override
index 4c9a87b2e69e5afbe360dfd59af8ff2715239464..f83c06c517dc5465f8472eec0c809c563c29d077 100644 (file)
@@ -154,6 +154,17 @@ public:
         InternalID           threadIid,
         const EventSummary   &summary) = 0;
 
+    virtual void DumpGarbageCollectionStarted(
+        InternalID  threadIid,
+        DWORD       ticksFromStart,
+        int         cGenerations,
+        BOOL        generationCollected[],
+        COR_PRF_GC_REASON     reason) = 0;
+
+    virtual void DumpGarbageCollectionFinished(
+        InternalID  threadIid,
+        DWORD       ticksFromStart) = 0;
+
     virtual void DumpGcHeapAllocTable(
         DWORD               ticksFromStart,
         const AllocTable    &allocInfoByTypes) = 0;