{
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(
{
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(
| 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.
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;
+}
ThreadID managedThreadId,
DWORD osThreadId) noexcept;
+ HRESULT GarbageCollectionStarted(
+ int cGenerations,
+ BOOL generationCollected[],
+ COR_PRF_GC_REASON reason) noexcept;
+
+ HRESULT GarbageCollectionFinished() noexcept;
+
private:
int m_tlsThreadInfoIndex;
}
}
+ 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
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;