diff options
author | Andrew Au <andrewau@microsoft.com> | 2021-06-30 23:20:36 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-30 23:20:36 +0300 |
commit | 8818c1561089dfc4a7b4296982ee2f82a30c3c1d (patch) | |
tree | 7a434148905090ec04e01b4963fdb1ae0a2cd33c /src/coreclr/vm | |
parent | e594edd949114f5fe90ff19724be9a94aaf5111b (diff) |
Optionally capture a dump during generational aware analysis (#54517)
Diffstat (limited to 'src/coreclr/vm')
-rw-r--r-- | src/coreclr/vm/eventing/eventpipe/ds-rt-coreclr.h | 12 | ||||
-rw-r--r-- | src/coreclr/vm/excep.cpp | 20 | ||||
-rw-r--r-- | src/coreclr/vm/excep.h | 2 | ||||
-rw-r--r-- | src/coreclr/vm/finalizerthread.cpp | 11 | ||||
-rw-r--r-- | src/coreclr/vm/gcenv.ee.cpp | 28 | ||||
-rw-r--r-- | src/coreclr/vm/genanalysis.cpp | 17 | ||||
-rw-r--r-- | src/coreclr/vm/genanalysis.h | 5 |
7 files changed, 66 insertions, 29 deletions
diff --git a/src/coreclr/vm/eventing/eventpipe/ds-rt-coreclr.h b/src/coreclr/vm/eventing/eventpipe/ds-rt-coreclr.h index 8094d7b22d9..646b8f9bd8f 100644 --- a/src/coreclr/vm/eventing/eventpipe/ds-rt-coreclr.h +++ b/src/coreclr/vm/eventing/eventpipe/ds-rt-coreclr.h @@ -195,20 +195,10 @@ ds_rt_generate_core_dump (DiagnosticsGenerateCoreDumpCommandPayload *payload) ds_ipc_result_t result = DS_IPC_E_FAIL; EX_TRY { -#ifdef HOST_WIN32 - if (GenerateCrashDump (reinterpret_cast<LPCWSTR>(ds_generate_core_dump_command_payload_get_dump_name (payload)), + if (GenerateDump (reinterpret_cast<LPCWSTR>(ds_generate_core_dump_command_payload_get_dump_name (payload)), static_cast<int32_t>(ds_generate_core_dump_command_payload_get_dump_type (payload)), (ds_generate_core_dump_command_payload_get_diagnostics (payload) != 0) ? true : false)) result = DS_IPC_S_OK; -#else - MAKE_UTF8PTR_FROMWIDE_NOTHROW (dump_name, reinterpret_cast<LPCWSTR>(ds_generate_core_dump_command_payload_get_dump_name (payload))); - if (dump_name != nullptr) { - if (PAL_GenerateCoreDump (dump_name, - static_cast<int32_t>(ds_generate_core_dump_command_payload_get_dump_type (payload)), - (ds_generate_core_dump_command_payload_get_diagnostics (payload) != 0) ? true : false)) - result = DS_IPC_S_OK; - } -#endif } EX_CATCH {} EX_END_CATCH(SwallowAllExceptions); diff --git a/src/coreclr/vm/excep.cpp b/src/coreclr/vm/excep.cpp index 1b192e68369..a1fdf255a5c 100644 --- a/src/coreclr/vm/excep.cpp +++ b/src/coreclr/vm/excep.cpp @@ -4176,6 +4176,26 @@ InitializeCrashDump() #endif // HOST_WINDOWS +bool GenerateDump( + LPCWSTR dumpName, + int dumpType, + bool diag) +{ +#ifdef TARGET_UNIX + MAKE_UTF8PTR_FROMWIDE_NOTHROW (dumpNameUtf8, dumpName); + if (dumpNameUtf8 == nullptr) + { + return false; + } + else + { + return PAL_GenerateCoreDump(dumpNameUtf8, dumpType, diag); + } +#else // TARGET_UNIX + return GenerateCrashDump(dumpName, dumpType, diag); +#endif // TARGET_UNIX +} + //************************************************************************************ // Create crash dump if enabled and terminate process. Generates crash dumps for both // Windows and Linux if enabled. For Linux, it happens in TerminateProcess in the PAL. diff --git a/src/coreclr/vm/excep.h b/src/coreclr/vm/excep.h index 365c2d148ba..f338dd76f4c 100644 --- a/src/coreclr/vm/excep.h +++ b/src/coreclr/vm/excep.h @@ -196,9 +196,9 @@ enum UnhandledExceptionLocation #ifdef HOST_WINDOWS void InitializeCrashDump(); -bool GenerateCrashDump(LPCWSTR dumpName, int dumpType, bool diag); void CreateCrashDumpIfEnabled(bool stackoverflow = false); #endif +bool GenerateDump(LPCWSTR dumpName, int dumpType, bool diag); // Generates crash dumps if enabled for both Windows and Linux void CrashDumpAndTerminateProcess(UINT exitCode); diff --git a/src/coreclr/vm/finalizerthread.cpp b/src/coreclr/vm/finalizerthread.cpp index a303400cbd7..1e4dbf913c8 100644 --- a/src/coreclr/vm/finalizerthread.cpp +++ b/src/coreclr/vm/finalizerthread.cpp @@ -274,14 +274,15 @@ VOID FinalizerThread::FinalizerThreadWorker(void *args) if (gcGenAnalysisState == GcGenAnalysisState::Done) { gcGenAnalysisState = GcGenAnalysisState::Disabled; - EventPipeAdapter::Disable(gcGenAnalysisEventPipeSessionId); - // Writing an empty file to indicate completion - fclose(fopen(GENAWARE_COMPLETION_FILE_NAME,"w+")); -#ifdef GEN_ANALYSIS_STRESS + if (gcGenAnalysisTrace) { + EventPipeAdapter::Disable(gcGenAnalysisEventPipeSessionId); +#ifdef GEN_ANALYSIS_STRESS GenAnalysis::EnableGenerationalAwareSession(); - } #endif + } + // Writing an empty file to indicate completion + fclose(fopen(GENAWARE_COMPLETION_FILE_NAME,"w+")); } if (!bPriorityBoosted) diff --git a/src/coreclr/vm/gcenv.ee.cpp b/src/coreclr/vm/gcenv.ee.cpp index 5be5bc2d9ec..82d4ccbd308 100644 --- a/src/coreclr/vm/gcenv.ee.cpp +++ b/src/coreclr/vm/gcenv.ee.cpp @@ -1644,14 +1644,26 @@ void GCToEEInterface::AnalyzeSurvivorsFinished(size_t gcIndex, int condemnedGene if ((condemnedGeneration == gcGenAnalysisGen) && (promoted_bytes > (uint64_t)gcGenAnalysisBytes) && (gcIndex > (uint64_t)gcGenAnalysisIndex)) #endif { - EventPipeAdapter::ResumeSession(gcGenAnalysisEventPipeSession); - FireEtwGenAwareBegin((int)gcIndex, GetClrInstanceId()); - s_forcedGCInProgress = true; - GCProfileWalkHeap(true); - s_forcedGCInProgress = false; - reportGenerationBounds(); - FireEtwGenAwareEnd((int)gcIndex, GetClrInstanceId()); - EventPipeAdapter::PauseSession(gcGenAnalysisEventPipeSession); + if (gcGenAnalysisTrace) + { + EventPipeAdapter::ResumeSession(gcGenAnalysisEventPipeSession); + FireEtwGenAwareBegin((int)gcIndex, GetClrInstanceId()); + s_forcedGCInProgress = true; + GCProfileWalkHeap(true); + s_forcedGCInProgress = false; + reportGenerationBounds(); + FireEtwGenAwareEnd((int)gcIndex, GetClrInstanceId()); + EventPipeAdapter::PauseSession(gcGenAnalysisEventPipeSession); + } + if (gcGenAnalysisDump) + { + EX_TRY + { + GenerateDump (GENAWARE_DUMP_FILE_NAME, 2, false); + } + EX_CATCH {} + EX_END_CATCH(SwallowAllExceptions); + } gcGenAnalysisState = GcGenAnalysisState::Done; EnableFinalization(true); } diff --git a/src/coreclr/vm/genanalysis.cpp b/src/coreclr/vm/genanalysis.cpp index fa2fcdf0a22..65f37375c33 100644 --- a/src/coreclr/vm/genanalysis.cpp +++ b/src/coreclr/vm/genanalysis.cpp @@ -13,6 +13,8 @@ int64_t gcGenAnalysisGen = -1; int64_t gcGenAnalysisBytes = 0; int64_t gcGenAnalysisIndex = 0; uint32_t gcGenAnalysisBufferMB = 0; +bool gcGenAnalysisTrace = true; +bool gcGenAnalysisDump = false; /* static */ void GenAnalysis::Initialize() { @@ -41,6 +43,8 @@ uint32_t gcGenAnalysisBufferMB = 0; gcGenAnalysisGen = CLRConfig::GetConfigValue(CLRConfig::INTERNAL_GCGenAnalysisGen); gcGenAnalysisIndex = CLRConfig::GetConfigValue(CLRConfig::INTERNAL_GCGenAnalysisIndex); gcGenAnalysisBufferMB = CLRConfig::GetConfigValue(CLRConfig::INTERNAL_EventPipeCircularMB); + gcGenAnalysisTrace = CLRConfig::GetConfigValue(CLRConfig::INTERNAL_GCGenAnalysisTrace); + gcGenAnalysisDump = CLRConfig::GetConfigValue(CLRConfig::INTERNAL_GCGenAnalysisDump); gcGenAnalysisConfigured = GcGenAnalysisState::Enabled; } else @@ -51,14 +55,21 @@ uint32_t gcGenAnalysisBufferMB = 0; if ((gcGenAnalysisConfigured == GcGenAnalysisState::Enabled) && (gcGenAnalysisState == GcGenAnalysisState::Uninitialized)) #endif { - EnableGenerationalAwareSession(); - } + if (gcGenAnalysisTrace) + { + EnableGenerationalAwareSession(); + } + if (gcGenAnalysisDump) + { + gcGenAnalysisState = GcGenAnalysisState::Enabled; + } + } } /* static */ void GenAnalysis::EnableGenerationalAwareSession() { LPCWSTR outputPath = nullptr; - outputPath = GENAWARE_FILE_NAME; + outputPath = GENAWARE_TRACE_FILE_NAME; NewArrayHolder<COR_PRF_EVENTPIPE_PROVIDER_CONFIG> pProviders; int providerCnt = 1; pProviders = new COR_PRF_EVENTPIPE_PROVIDER_CONFIG[providerCnt]; diff --git a/src/coreclr/vm/genanalysis.h b/src/coreclr/vm/genanalysis.h index 84d9c67d13e..8253aa3eab0 100644 --- a/src/coreclr/vm/genanalysis.h +++ b/src/coreclr/vm/genanalysis.h @@ -18,7 +18,8 @@ enum GcGenAnalysisState Done = 3, }; -#define GENAWARE_FILE_NAME W("gcgenaware.nettrace") +#define GENAWARE_TRACE_FILE_NAME W("gcgenaware.nettrace") +#define GENAWARE_DUMP_FILE_NAME W("gcgenaware.dmp") #define GENAWARE_COMPLETION_FILE_NAME "gcgenaware.nettrace.completed" extern bool s_forcedGCInProgress; @@ -29,6 +30,8 @@ extern GcGenAnalysisState gcGenAnalysisConfigured; extern int64_t gcGenAnalysisGen; extern int64_t gcGenAnalysisBytes; extern int64_t gcGenAnalysisIndex; +extern bool gcGenAnalysisTrace; +extern bool gcGenAnalysisDump; class GenAnalysis { |