summaryrefslogtreecommitdiff
path: root/src/pal
diff options
context:
space:
mode:
authorMike McLaughlin <mikem@microsoft.com>2017-04-18 16:54:53 -0700
committerGitHub <noreply@github.com>2017-04-18 16:54:53 -0700
commit29e59e81de5489a3c0515b5d1d50baeb06269bd1 (patch)
treebaea5e7100306954e898b9977a552bafb2d20515 /src/pal
parentb8ed08061bdc1c00bd191d954d3f6a526067728e (diff)
downloadcoreclr-29e59e81de5489a3c0515b5d1d50baeb06269bd1.tar.gz
coreclr-29e59e81de5489a3c0515b5d1d50baeb06269bd1.tar.bz2
coreclr-29e59e81de5489a3c0515b5d1d50baeb06269bd1.zip
Implement the createdump policy options and env variables (#11032)
Added these command line options: -f, --name - dump path and file name. The pid can be placed in the name with %d. The default is "/tmp/coredump.%d" -n, --normal - create minidump (default). -h, --withheap - create minidump with heap. -m, --micro - create triage minidump. -d, --diag - enable diagnostic messages. Added these environment variables: COMPlus_DbgMiniDumpType - if set to "1" generate MiniDumpNormal, "2" MiniDumpWithPrivateReadWriteMemory, "3" MiniDumpFilterTriage. Default is MiniDumpNormal. COMPlus_DbgMiniDumpName - if set, use as the template to create the dump path and file name. The pid can be placed in the name with %d. The default is "/tmp/coredump.%d".
Diffstat (limited to 'src/pal')
-rw-r--r--src/pal/src/thread/process.cpp54
1 files changed, 44 insertions, 10 deletions
diff --git a/src/pal/src/thread/process.cpp b/src/pal/src/thread/process.cpp
index e7380ee1e1..e7a2d2f32b 100644
--- a/src/pal/src/thread/process.cpp
+++ b/src/pal/src/thread/process.cpp
@@ -149,7 +149,7 @@ DWORD gSID = (DWORD) -1;
Volatile<PSHUTDOWN_CALLBACK> g_shutdownCallback = nullptr;
// Crash dump generating program arguments. Initialized in PROCAbortInitialize().
-char *g_argvCreateDump[3] = { nullptr, nullptr, nullptr };
+char* g_argvCreateDump[8] = { nullptr };
//
// Key used for associating CPalThread's with the underlying pthread
@@ -2895,8 +2895,11 @@ PROCAbortInitialize()
}
const char* DumpGeneratorName = "createdump";
int programLen = strlen(g_szCoreCLRPath) + strlen(DumpGeneratorName);
- char* program = new char[programLen];
-
+ char* program = (char*)InternalMalloc(programLen);
+ if (program == nullptr)
+ {
+ return FALSE;
+ }
if (strcpy_s(program, programLen, g_szCoreCLRPath) != SAFECRT_SUCCESS)
{
return FALSE;
@@ -2914,19 +2917,50 @@ PROCAbortInitialize()
{
return FALSE;
}
- char pidarg[128];
- if (sprintf_s(pidarg, sizeof(pidarg), "%d", gPID) == -1)
+ char* pidarg = (char*)InternalMalloc(128);
+ if (pidarg == nullptr)
{
return FALSE;
}
- g_argvCreateDump[0] = program;
- g_argvCreateDump[1] = _strdup(pidarg);
- g_argvCreateDump[2] = nullptr;
-
- if (g_argvCreateDump[0] == nullptr || g_argvCreateDump[1] == nullptr)
+ if (sprintf_s(pidarg, 128, "%d", gPID) == -1)
{
return FALSE;
}
+ const char** argv = (const char**)g_argvCreateDump;
+ *argv++ = program;
+
+ char* envvar = getenv("COMPlus_DbgMiniDumpName");
+ if (envvar != nullptr)
+ {
+ *argv++ = "--name";
+ *argv++ = envvar;
+ }
+
+ envvar = getenv("COMPlus_DbgMiniDumpType");
+ if (envvar != nullptr)
+ {
+ if (strcmp(envvar, "1") == 0)
+ {
+ *argv++ = "--normal";
+ }
+ else if (strcmp(envvar, "2") == 0)
+ {
+ *argv++ = "--withheap";
+ }
+ else if (strcmp(envvar, "3") == 0)
+ {
+ *argv++ = "--micro";
+ }
+ }
+
+ envvar = getenv("COMPlus_CreateDumpDiagnostics");
+ if (envvar != nullptr && strcmp(envvar, "1") == 0)
+ {
+ *argv++ = "--diag";
+ }
+
+ *argv++ = pidarg;
+ *argv = nullptr;
}
return TRUE;
}