Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions src/coreclr/nativeaot/Runtime/unix/PalCreateDump.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -191,10 +191,7 @@ BuildCreateDumpCommandLine(
argv[argc++] = g_ppidarg;
argv[argc++] = nullptr;

if (argc >= MAX_ARGV_ENTRIES)
{
return false;
}
assert(argc < MAX_ARGV_ENTRIES);
return true;
}

Expand Down
98 changes: 56 additions & 42 deletions src/coreclr/pal/src/thread/process.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ SET_DEFAULT_DEBUG_CHANNEL(PROCESS); // some headers have code with asserts, so d
#include <stdint.h>
#include <dlfcn.h>
#include <limits.h>
#include <vector>

#ifdef __linux__
#include <linux/membarrier.h>
Expand Down Expand Up @@ -197,7 +196,8 @@ Volatile<PSHUTDOWN_CALLBACK> g_shutdownCallback = nullptr;
Volatile<PCREATEDUMP_CALLBACK> g_createdumpCallback = nullptr;

// Crash dump generating program arguments. Initialized in PROCAbortInitialize().
std::vector<const char*> g_argvCreateDump;
#define MAX_ARGV_ENTRIES 32
const char* g_argvCreateDump[MAX_ARGV_ENTRIES] = { nullptr };

//
// Key used for associating CPalThread's with the underlying pthread
Expand Down Expand Up @@ -2282,7 +2282,7 @@ Return
--*/
BOOL
PROCBuildCreateDumpCommandLine(
std::vector<const char*>& argv,
const char* argv[],
char** pprogram,
char** ppidarg,
const char* dumpName,
Expand Down Expand Up @@ -2323,65 +2323,69 @@ PROCBuildCreateDumpCommandLine(
{
return FALSE;
}
argv.push_back(program);

int argc = 0;
argv[argc++] = program;

if (dumpName != nullptr)
{
argv.push_back("--name");
argv.push_back(dumpName);
argv[argc++] = "--name";
argv[argc++] = dumpName;
}

switch (dumpType)
{
case DumpTypeNormal:
argv.push_back("--normal");
argv[argc++] = "--normal";
break;
case DumpTypeWithHeap:
argv.push_back("--withheap");
argv[argc++] = "--withheap";
break;
case DumpTypeTriage:
argv.push_back("--triage");
argv[argc++] = "--triage";
break;
case DumpTypeFull:
argv.push_back("--full");
argv[argc++] = "--full";
break;
default:
break;
}

if (flags & GenerateDumpFlagsLoggingEnabled)
{
argv.push_back("--diag");
argv[argc++] = "--diag";
}

if (flags & GenerateDumpFlagsVerboseLoggingEnabled)
{
argv.push_back("--verbose");
argv[argc++] = "--verbose";
}

if (flags & GenerateDumpFlagsCrashReportEnabled)
{
argv.push_back("--crashreport");
argv[argc++] = "--crashreport";
}

if (flags & GenerateDumpFlagsCrashReportOnlyEnabled)
{
argv.push_back("--crashreportonly");
argv[argc++] = "--crashreportonly";
}

if (g_running_in_exe)
{
argv.push_back("--singlefile");
argv[argc++] = "--singlefile";
}

if (logFileName != nullptr)
{
argv.push_back("--logtofile");
argv.push_back(logFileName);
argv[argc++] = "--logtofile";
argv[argc++] = logFileName;
}

argv.push_back(*ppidarg);
argv.push_back(nullptr);
argv[argc++] = *ppidarg;
argv[argc++] = nullptr;

_ASSERTE(argc < MAX_ARGV_ENTRIES);

return TRUE;
}
Expand All @@ -2399,15 +2403,15 @@ PROCBuildCreateDumpCommandLine(
--*/
BOOL
PROCCreateCrashDump(
std::vector<const char*>& argv,
const char* argv[],
LPSTR errorMessageBuffer,
INT cbErrorMessageBuffer,
bool serialize)
{
#if defined(TARGET_IOS) || defined(TARGET_TVOS)
return FALSE;
#else
_ASSERTE(argv.size() > 0);
_ASSERTE(argv[0] != nullptr);
_ASSERTE(errorMessageBuffer == nullptr || cbErrorMessageBuffer > 0);

if (serialize)
Expand Down Expand Up @@ -2494,7 +2498,12 @@ PROCCreateCrashDump(
SEHCleanupSignals(true /* isChildProcess */);

// Call the statically linked createdump code
callbackResult = g_createdumpCallback(argv.size(), argv.data());
int argc = 0;
while (argv[argc] != nullptr && argc < MAX_ARGV_ENTRIES)
{
argc++;
}
callbackResult = g_createdumpCallback(argc, argv);
// Set the shutdown callback to nullptr and exit
// If we don't exit, the child's execution will continue into the diagnostic server behavior
// which causes all sorts of problems.
Expand All @@ -2504,7 +2513,7 @@ PROCCreateCrashDump(
else
{
// Execute the createdump program
if (execve(argv[0], (char**)argv.data(), palEnvironment) == -1)
if (execve(argv[0], (char**)argv, palEnvironment) == -1)
{
fprintf(stderr, "Problem launching createdump (may not have execute permissions): execve(%s) FAILED %s (%d)\n", argv[0], strerror(errno), errno);
exit(-1);
Expand Down Expand Up @@ -2682,7 +2691,7 @@ PAL_GenerateCoreDump(
LPSTR errorMessageBuffer,
INT cbErrorMessageBuffer)
{
std::vector<const char*> argvCreateDump;
const char* argvCreateDump[MAX_ARGV_ENTRIES] = { nullptr };

if (dumpType <= DumpTypeUnknown || dumpType > DumpTypeMax)
{
Expand Down Expand Up @@ -2748,61 +2757,66 @@ PROCCreateCrashDumpIfEnabled(int signal, siginfo_t* siginfo, void* context, bool
DoNotOptimize(&context);

// If enabled, launch the create minidump utility and wait until it completes
if (!g_argvCreateDump.empty())
if (g_argvCreateDump[0] != nullptr)
{
std::vector<const char*> argv(g_argvCreateDump);
const char* argv[MAX_ARGV_ENTRIES];
char* signalArg = nullptr;
char* crashThreadArg = nullptr;
char* signalCodeArg = nullptr;
char* signalErrnoArg = nullptr;
char* signalAddressArg = nullptr;

if (signal != 0)
// Copy the createdump argv
int argc = 0;
for (; argc < MAX_ARGV_ENTRIES && g_argvCreateDump[argc] != nullptr; argc++)
{
// Remove the terminating nullptr
argv.pop_back();
argv[argc] = g_argvCreateDump[argc];
}

if (signal != 0 && argc < MAX_ARGV_ENTRIES)
{
// Add the signal number to the command line
signalArg = PROCFormatInt(signal);
if (signalArg != nullptr)
{
argv.push_back("--signal");
argv.push_back(signalArg);
argv[argc++] = "--signal";
argv[argc++] = signalArg;
}

// Add the current thread id to the command line. This function is always called on the crashing thread.
crashThreadArg = PROCFormatInt(THREADSilentGetCurrentThreadId());
if (crashThreadArg != nullptr)
{
argv.push_back("--crashthread");
argv.push_back(crashThreadArg);
argv[argc++] = "--crashthread";
argv[argc++] = crashThreadArg;
}

if (siginfo != nullptr)
if (siginfo != nullptr && argc < MAX_ARGV_ENTRIES)
{
signalCodeArg = PROCFormatInt(siginfo->si_code);
if (signalCodeArg != nullptr)
{
argv.push_back("--code");
argv.push_back(signalCodeArg);
argv[argc++] = "--code";
argv[argc++] = signalCodeArg;
}
signalErrnoArg = PROCFormatInt(siginfo->si_errno);
if (signalErrnoArg != nullptr)
{
argv.push_back("--errno");
argv.push_back(signalErrnoArg);
argv[argc++] = "--errno";
argv[argc++] = signalErrnoArg;
}
signalAddressArg = PROCFormatInt64((ULONG64)siginfo->si_addr);
if (signalAddressArg != nullptr)
{
argv.push_back("--address");
argv.push_back(signalAddressArg);
argv[argc++] = "--address";
argv[argc++] = signalAddressArg;
}
}

argv.push_back(nullptr);
}

argv[argc] = nullptr;
_ASSERTE(argc < MAX_ARGV_ENTRIES);

PROCCreateCrashDump(argv, nullptr, 0, serialize);

free(signalArg);
Expand Down