Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dotnet/runtime.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Au <andrewau@microsoft.com>2021-06-30 23:20:36 +0300
committerGitHub <noreply@github.com>2021-06-30 23:20:36 +0300
commit8818c1561089dfc4a7b4296982ee2f82a30c3c1d (patch)
tree7a434148905090ec04e01b4963fdb1ae0a2cd33c /src/coreclr/vm
parente594edd949114f5fe90ff19724be9a94aaf5111b (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.h12
-rw-r--r--src/coreclr/vm/excep.cpp20
-rw-r--r--src/coreclr/vm/excep.h2
-rw-r--r--src/coreclr/vm/finalizerthread.cpp11
-rw-r--r--src/coreclr/vm/gcenv.ee.cpp28
-rw-r--r--src/coreclr/vm/genanalysis.cpp17
-rw-r--r--src/coreclr/vm/genanalysis.h5
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
{