diff options
author | Mike McLaughlin <mikem@microsoft.com> | 2017-04-18 16:54:53 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-18 16:54:53 -0700 |
commit | 29e59e81de5489a3c0515b5d1d50baeb06269bd1 (patch) | |
tree | baea5e7100306954e898b9977a552bafb2d20515 /src/pal | |
parent | b8ed08061bdc1c00bd191d954d3f6a526067728e (diff) | |
download | coreclr-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.cpp | 54 |
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; } |