From 5a1409b1dcb8532312f9043d96db5edccea2f620 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 7 Jan 2026 20:32:06 +0000 Subject: [PATCH 01/10] Initial plan From 466f07ff927b64f4ee00714885f757641b4e3e91 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 7 Jan 2026 20:54:29 +0000 Subject: [PATCH 02/10] Add DOTNET_DbgCreateDumpToolPath environment variable support Co-authored-by: steveisok <471438+steveisok@users.noreply.github.com> --- .../nativeaot/Runtime/unix/PalCreateDump.cpp | 67 ++++++++++++------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/src/coreclr/nativeaot/Runtime/unix/PalCreateDump.cpp b/src/coreclr/nativeaot/Runtime/unix/PalCreateDump.cpp index d99c719814ee98..eeb2b9b08bdc62 100644 --- a/src/coreclr/nativeaot/Runtime/unix/PalCreateDump.cpp +++ b/src/coreclr/nativeaot/Runtime/unix/PalCreateDump.cpp @@ -597,35 +597,54 @@ PalCreateDumpInitialize() } // Build the createdump program path for the command line - Dl_info info; - if (dladdr((void*)&PalCreateDumpInitialize, &info) == 0) + char* program = nullptr; + + // Check if user provided a custom path to createdump tool + if (RhConfig::Environment::TryGetStringValue("DbgCreateDumpToolPath", &program)) { - return false; - } - const char* DumpGeneratorName = "createdump"; - int programLen = strlen(info.dli_fname) + strlen(DumpGeneratorName) + 1; - char* program = (char*)malloc(programLen); - if (program == nullptr) - { - return false; - } - strncpy(program, info.dli_fname, programLen); - char *last = strrchr(program, '/'); - if (last != nullptr) - { - *(last + 1) = '\0'; + // Validate that the specified path exists and is a regular file + struct stat fileData; + if (stat(program, &fileData) == -1 || !S_ISREG(fileData.st_mode)) + { + fprintf(stderr, "DOTNET_DbgCreateDumpToolPath is set but the specified createdump binary does not exist or is not a regular file: %s\n", program); + free(program); + return true; + } } else { - program[0] = '\0'; - } - strncat(program, DumpGeneratorName, programLen); + // Default behavior: derive path from current library location + Dl_info info; + if (dladdr((void*)&PalCreateDumpInitialize, &info) == 0) + { + return false; + } + const char* DumpGeneratorName = "createdump"; + int programLen = strlen(info.dli_fname) + strlen(DumpGeneratorName) + 1; + program = (char*)malloc(programLen); + if (program == nullptr) + { + return false; + } + strncpy(program, info.dli_fname, programLen); + char *last = strrchr(program, '/'); + if (last != nullptr) + { + *(last + 1) = '\0'; + } + else + { + program[0] = '\0'; + } + strncat(program, DumpGeneratorName, programLen); - struct stat fileData; - if (stat(program, &fileData) == -1 || !S_ISREG(fileData.st_mode)) - { - fprintf(stderr, "DOTNET_DbgEnableMiniDump is set and the createdump binary does not exist: %s\n", program); - return true; + struct stat fileData; + if (stat(program, &fileData) == -1 || !S_ISREG(fileData.st_mode)) + { + fprintf(stderr, "DOTNET_DbgEnableMiniDump is set and the createdump binary does not exist: %s\n", program); + free(program); + return true; + } } g_szCreateDumpPath = program; From be662d2ce9aa5f163965f4dc92334191c0ec4ccf Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 7 Jan 2026 21:03:37 +0000 Subject: [PATCH 03/10] Add documentation for DOTNET_DbgCreateDumpToolPath environment variable Co-authored-by: steveisok <471438+steveisok@users.noreply.github.com> --- docs/design/coreclr/botr/xplat-minidump-generation.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/design/coreclr/botr/xplat-minidump-generation.md b/docs/design/coreclr/botr/xplat-minidump-generation.md index 997b9a1e5deaea..a3698f796cd22e 100644 --- a/docs/design/coreclr/botr/xplat-minidump-generation.md +++ b/docs/design/coreclr/botr/xplat-minidump-generation.md @@ -61,6 +61,7 @@ Environment variables supported: - `DOTNET_DbgEnableMiniDump`: if set to "1", enables this core dump generation. The default is NOT to generate a dump. - `DOTNET_DbgMiniDumpType`: See below. Default is "2" MiniDumpWithPrivateReadWriteMemory. - `DOTNET_DbgMiniDumpName`: if set, use as the template to create the dump path and file name. See "Dump name formatting" for how the dump name can be formatted. The default is _/tmp/coredump.%p_. +- `DOTNET_DbgCreateDumpToolPath`: if set, specifies the full path to the createdump tool. This allows you to use a custom or external createdump binary instead of the one that ships with the runtime. The path must point to an existing regular file. This is useful in scenarios where createdump is not shipped with the runtime and you need to "bring your own" dump generation tool. - `DOTNET_CreateDumpDiagnostics`: if set to "1", enables the _createdump_ utilities diagnostic messages (TRACE macro). - `DOTNET_CreateDumpVerboseDiagnostics`: if set to "1", enables the _createdump_ utilities verbose diagnostic messages (TRACE_VERBOSE macro). - `DOTNET_CreateDumpLogToFile`: if set, it is the path of the file to write the _createdump_ diagnostic messages. From 2870ba96aca62806df9c3205807fa24033914029 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 7 Jan 2026 21:05:42 +0000 Subject: [PATCH 04/10] Add usage example for DOTNET_DbgCreateDumpToolPath Co-authored-by: steveisok <471438+steveisok@users.noreply.github.com> --- .../design/coreclr/botr/xplat-minidump-generation.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/design/coreclr/botr/xplat-minidump-generation.md b/docs/design/coreclr/botr/xplat-minidump-generation.md index a3698f796cd22e..de6c163375971b 100644 --- a/docs/design/coreclr/botr/xplat-minidump-generation.md +++ b/docs/design/coreclr/botr/xplat-minidump-generation.md @@ -116,6 +116,18 @@ As of .NET 5.0, the following subset of the core pattern (see [core](https://man %h Hostname return by gethostname(). %t Time of dump, expressed as seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC). +**Using a custom createdump tool** + +In scenarios where the runtime does not ship with the createdump tool, you can specify a custom path using the `DOTNET_DbgCreateDumpToolPath` environment variable: + +```bash +export DOTNET_DbgEnableMiniDump=1 +export DOTNET_DbgCreateDumpToolPath=/path/to/custom/createdump +./myapp +``` + +This allows you to "bring your own" dump generation tool. The specified path must point to an existing executable file. + # Testing # The test plan is to modify the SOS tests in the (still) private debuggertests repo to trigger and use the core minidumps generated. Debugging managed core dumps on Linux is not supported by _mdbg_ at this time until we have a ELF core dump reader so only the SOS tests (which use _lldb_ on Linux) will be modified. From c6c62cdacc082b3f9bdabba0d84e5b9f8749adc1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 10 Jan 2026 19:26:14 +0000 Subject: [PATCH 05/10] Update DbgCreateDumpToolPath to accept directory path and remove stat validation - Changed DbgCreateDumpToolPath to accept a directory path instead of full executable path - The runtime now concatenates the directory with "createdump" like the default behavior - Removed stat() validation as it was removed in commit c5073059a - Updated documentation to clarify this is NativeAOT only and the variable accepts a directory path - Updated usage example to reflect the directory path usage Co-authored-by: steveisok <471438+steveisok@users.noreply.github.com> --- .../coreclr/botr/xplat-minidump-generation.md | 10 +++---- .../nativeaot/Runtime/unix/PalCreateDump.cpp | 28 +++++++++++++------ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/docs/design/coreclr/botr/xplat-minidump-generation.md b/docs/design/coreclr/botr/xplat-minidump-generation.md index de6c163375971b..7cb1d0b430be1e 100644 --- a/docs/design/coreclr/botr/xplat-minidump-generation.md +++ b/docs/design/coreclr/botr/xplat-minidump-generation.md @@ -61,7 +61,7 @@ Environment variables supported: - `DOTNET_DbgEnableMiniDump`: if set to "1", enables this core dump generation. The default is NOT to generate a dump. - `DOTNET_DbgMiniDumpType`: See below. Default is "2" MiniDumpWithPrivateReadWriteMemory. - `DOTNET_DbgMiniDumpName`: if set, use as the template to create the dump path and file name. See "Dump name formatting" for how the dump name can be formatted. The default is _/tmp/coredump.%p_. -- `DOTNET_DbgCreateDumpToolPath`: if set, specifies the full path to the createdump tool. This allows you to use a custom or external createdump binary instead of the one that ships with the runtime. The path must point to an existing regular file. This is useful in scenarios where createdump is not shipped with the runtime and you need to "bring your own" dump generation tool. +- `DOTNET_DbgCreateDumpToolPath`: **(NativeAOT only)** if set, specifies the directory path where the createdump tool is located. The runtime will look for the createdump binary in this directory. This is useful in scenarios where createdump is not shipped with the runtime and you need to "bring your own" dump generation tool. This environment variable is only supported in NativeAOT applications and is ignored in CoreCLR. - `DOTNET_CreateDumpDiagnostics`: if set to "1", enables the _createdump_ utilities diagnostic messages (TRACE macro). - `DOTNET_CreateDumpVerboseDiagnostics`: if set to "1", enables the _createdump_ utilities verbose diagnostic messages (TRACE_VERBOSE macro). - `DOTNET_CreateDumpLogToFile`: if set, it is the path of the file to write the _createdump_ diagnostic messages. @@ -116,17 +116,17 @@ As of .NET 5.0, the following subset of the core pattern (see [core](https://man %h Hostname return by gethostname(). %t Time of dump, expressed as seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC). -**Using a custom createdump tool** +**Using a custom createdump tool (NativeAOT only)** -In scenarios where the runtime does not ship with the createdump tool, you can specify a custom path using the `DOTNET_DbgCreateDumpToolPath` environment variable: +In scenarios where the NativeAOT runtime does not ship with the createdump tool, you can specify a custom directory path using the `DOTNET_DbgCreateDumpToolPath` environment variable: ```bash export DOTNET_DbgEnableMiniDump=1 -export DOTNET_DbgCreateDumpToolPath=/path/to/custom/createdump +export DOTNET_DbgCreateDumpToolPath=/path/to/directory ./myapp ``` -This allows you to "bring your own" dump generation tool. The specified path must point to an existing executable file. +The runtime will look for the `createdump` binary in the specified directory. This allows you to "bring your own" dump generation tool. Note that this environment variable is only supported in NativeAOT applications and is ignored in CoreCLR. # Testing # diff --git a/src/coreclr/nativeaot/Runtime/unix/PalCreateDump.cpp b/src/coreclr/nativeaot/Runtime/unix/PalCreateDump.cpp index 7fce2fc6d0d023..ca1e345db009c1 100644 --- a/src/coreclr/nativeaot/Runtime/unix/PalCreateDump.cpp +++ b/src/coreclr/nativeaot/Runtime/unix/PalCreateDump.cpp @@ -604,19 +604,30 @@ PalCreateDumpInitialize() } // Build the createdump program path for the command line + const char* DumpGeneratorName = "createdump"; + char* dumpToolPath = nullptr; char* program = nullptr; - // Check if user provided a custom path to createdump tool - if (RhConfig::Environment::TryGetStringValue("DbgCreateDumpToolPath", &program)) + // Check if user provided a custom path to createdump tool directory + if (RhConfig::Environment::TryGetStringValue("DbgCreateDumpToolPath", &dumpToolPath)) { - // Validate that the specified path exists and is a regular file - struct stat fileData; - if (stat(program, &fileData) == -1 || !S_ISREG(fileData.st_mode)) + // Use the provided directory path and concatenate with "createdump" + int programLen = strlen(dumpToolPath) + strlen(DumpGeneratorName) + 2; // +2 for '/' and '\0' + program = (char*)malloc(programLen); + if (program == nullptr) + { + free(dumpToolPath); + return false; + } + strncpy(program, dumpToolPath, programLen); + // Ensure path ends with '/' + size_t pathLen = strlen(program); + if (pathLen > 0 && program[pathLen - 1] != '/') { - fprintf(stderr, "DOTNET_DbgCreateDumpToolPath is set but the specified createdump binary does not exist or is not a regular file: %s\n", program); - free(program); - return true; + strncat(program, "/", programLen - pathLen); } + strncat(program, DumpGeneratorName, programLen - strlen(program)); + free(dumpToolPath); } else { @@ -626,7 +637,6 @@ PalCreateDumpInitialize() { return false; } - const char* DumpGeneratorName = "createdump"; int programLen = strlen(info.dli_fname) + strlen(DumpGeneratorName) + 1; program = (char*)malloc(programLen); if (program == nullptr) From 7b57c8bb3a39e4acdfbb6d96bebde06a570e9a08 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 10 Jan 2026 19:27:53 +0000 Subject: [PATCH 06/10] Fix string handling to ensure proper null-termination - Initialize buffer with '\0' before using strncat - Use proper buffer size calculations in strncat calls to prevent buffer overruns - Ensures safe string concatenation following C string best practices Co-authored-by: steveisok <471438+steveisok@users.noreply.github.com> --- src/coreclr/nativeaot/Runtime/unix/PalCreateDump.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/coreclr/nativeaot/Runtime/unix/PalCreateDump.cpp b/src/coreclr/nativeaot/Runtime/unix/PalCreateDump.cpp index ca1e345db009c1..c50b9f9c5de004 100644 --- a/src/coreclr/nativeaot/Runtime/unix/PalCreateDump.cpp +++ b/src/coreclr/nativeaot/Runtime/unix/PalCreateDump.cpp @@ -619,14 +619,16 @@ PalCreateDumpInitialize() free(dumpToolPath); return false; } - strncpy(program, dumpToolPath, programLen); + // Initialize buffer and copy path + program[0] = '\0'; + strncat(program, dumpToolPath, programLen - 1); // Ensure path ends with '/' size_t pathLen = strlen(program); if (pathLen > 0 && program[pathLen - 1] != '/') { - strncat(program, "/", programLen - pathLen); + strncat(program, "/", programLen - pathLen - 1); } - strncat(program, DumpGeneratorName, programLen - strlen(program)); + strncat(program, DumpGeneratorName, programLen - strlen(program) - 1); free(dumpToolPath); } else From 5d6a5896c44612002607d2b44867e3548ed44880 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 10 Jan 2026 19:29:14 +0000 Subject: [PATCH 07/10] Simplify string concatenation logic for better clarity - Calculate exact buffer size based on whether slash is needed - Follow same pattern as default code path using strncpy and strncat - More readable and maintainable code structure Co-authored-by: steveisok <471438+steveisok@users.noreply.github.com> --- .../nativeaot/Runtime/unix/PalCreateDump.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/coreclr/nativeaot/Runtime/unix/PalCreateDump.cpp b/src/coreclr/nativeaot/Runtime/unix/PalCreateDump.cpp index c50b9f9c5de004..d69d428392313e 100644 --- a/src/coreclr/nativeaot/Runtime/unix/PalCreateDump.cpp +++ b/src/coreclr/nativeaot/Runtime/unix/PalCreateDump.cpp @@ -612,23 +612,21 @@ PalCreateDumpInitialize() if (RhConfig::Environment::TryGetStringValue("DbgCreateDumpToolPath", &dumpToolPath)) { // Use the provided directory path and concatenate with "createdump" - int programLen = strlen(dumpToolPath) + strlen(DumpGeneratorName) + 2; // +2 for '/' and '\0' + size_t dumpToolPathLen = strlen(dumpToolPath); + bool needsSlash = dumpToolPathLen > 0 && dumpToolPath[dumpToolPathLen - 1] != '/'; + int programLen = dumpToolPathLen + (needsSlash ? 1 : 0) + strlen(DumpGeneratorName) + 1; program = (char*)malloc(programLen); if (program == nullptr) { free(dumpToolPath); return false; } - // Initialize buffer and copy path - program[0] = '\0'; - strncat(program, dumpToolPath, programLen - 1); - // Ensure path ends with '/' - size_t pathLen = strlen(program); - if (pathLen > 0 && program[pathLen - 1] != '/') + strncpy(program, dumpToolPath, programLen); + if (needsSlash) { - strncat(program, "/", programLen - pathLen - 1); + strncat(program, "/", programLen); } - strncat(program, DumpGeneratorName, programLen - strlen(program) - 1); + strncat(program, DumpGeneratorName, programLen); free(dumpToolPath); } else From 74fc3af435ebeeae11738dddb53523c47d8ef7dd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 12 Jan 2026 21:25:16 +0000 Subject: [PATCH 08/10] Update documentation wording to avoid ambiguity about CoreCLR Changed "ignored in CoreCLR" to "ignored otherwise" since NativeAOT uses a stripped-down version of CoreCLR, making the original wording ambiguous. Co-authored-by: steveisok <471438+steveisok@users.noreply.github.com> --- docs/design/coreclr/botr/xplat-minidump-generation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/design/coreclr/botr/xplat-minidump-generation.md b/docs/design/coreclr/botr/xplat-minidump-generation.md index 7cb1d0b430be1e..79df57aa23d6bf 100644 --- a/docs/design/coreclr/botr/xplat-minidump-generation.md +++ b/docs/design/coreclr/botr/xplat-minidump-generation.md @@ -61,7 +61,7 @@ Environment variables supported: - `DOTNET_DbgEnableMiniDump`: if set to "1", enables this core dump generation. The default is NOT to generate a dump. - `DOTNET_DbgMiniDumpType`: See below. Default is "2" MiniDumpWithPrivateReadWriteMemory. - `DOTNET_DbgMiniDumpName`: if set, use as the template to create the dump path and file name. See "Dump name formatting" for how the dump name can be formatted. The default is _/tmp/coredump.%p_. -- `DOTNET_DbgCreateDumpToolPath`: **(NativeAOT only)** if set, specifies the directory path where the createdump tool is located. The runtime will look for the createdump binary in this directory. This is useful in scenarios where createdump is not shipped with the runtime and you need to "bring your own" dump generation tool. This environment variable is only supported in NativeAOT applications and is ignored in CoreCLR. +- `DOTNET_DbgCreateDumpToolPath`: **(NativeAOT only)** if set, specifies the directory path where the createdump tool is located. The runtime will look for the createdump binary in this directory. This is useful in scenarios where createdump is not shipped with the runtime and you need to "bring your own" dump generation tool. This environment variable is only supported in NativeAOT applications only and ignored otherwise. - `DOTNET_CreateDumpDiagnostics`: if set to "1", enables the _createdump_ utilities diagnostic messages (TRACE macro). - `DOTNET_CreateDumpVerboseDiagnostics`: if set to "1", enables the _createdump_ utilities verbose diagnostic messages (TRACE_VERBOSE macro). - `DOTNET_CreateDumpLogToFile`: if set, it is the path of the file to write the _createdump_ diagnostic messages. @@ -126,7 +126,7 @@ export DOTNET_DbgCreateDumpToolPath=/path/to/directory ./myapp ``` -The runtime will look for the `createdump` binary in the specified directory. This allows you to "bring your own" dump generation tool. Note that this environment variable is only supported in NativeAOT applications and is ignored in CoreCLR. +The runtime will look for the `createdump` binary in the specified directory. This allows you to "bring your own" dump generation tool. Note that this environment variable is only supported in NativeAOT applications only and ignored otherwise. # Testing # From c1c10b0240dc22dc7edf999f29bc033d560716bc Mon Sep 17 00:00:00 2001 From: Jan Kotas Date: Mon, 12 Jan 2026 21:11:58 -0800 Subject: [PATCH 09/10] Update docs/design/coreclr/botr/xplat-minidump-generation.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- docs/design/coreclr/botr/xplat-minidump-generation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/design/coreclr/botr/xplat-minidump-generation.md b/docs/design/coreclr/botr/xplat-minidump-generation.md index 79df57aa23d6bf..7c3d33b80556ba 100644 --- a/docs/design/coreclr/botr/xplat-minidump-generation.md +++ b/docs/design/coreclr/botr/xplat-minidump-generation.md @@ -61,7 +61,7 @@ Environment variables supported: - `DOTNET_DbgEnableMiniDump`: if set to "1", enables this core dump generation. The default is NOT to generate a dump. - `DOTNET_DbgMiniDumpType`: See below. Default is "2" MiniDumpWithPrivateReadWriteMemory. - `DOTNET_DbgMiniDumpName`: if set, use as the template to create the dump path and file name. See "Dump name formatting" for how the dump name can be formatted. The default is _/tmp/coredump.%p_. -- `DOTNET_DbgCreateDumpToolPath`: **(NativeAOT only)** if set, specifies the directory path where the createdump tool is located. The runtime will look for the createdump binary in this directory. This is useful in scenarios where createdump is not shipped with the runtime and you need to "bring your own" dump generation tool. This environment variable is only supported in NativeAOT applications only and ignored otherwise. +- `DOTNET_DbgCreateDumpToolPath`: **(NativeAOT only)** if set, specifies the directory path where the createdump tool is located. The runtime will look for the createdump binary in this directory. This is useful in scenarios where createdump is not shipped with the runtime and you need to "bring your own" dump generation tool. This environment variable is only supported in NativeAOT applications and ignored otherwise. - `DOTNET_CreateDumpDiagnostics`: if set to "1", enables the _createdump_ utilities diagnostic messages (TRACE macro). - `DOTNET_CreateDumpVerboseDiagnostics`: if set to "1", enables the _createdump_ utilities verbose diagnostic messages (TRACE_VERBOSE macro). - `DOTNET_CreateDumpLogToFile`: if set, it is the path of the file to write the _createdump_ diagnostic messages. From 12d8194171576174aebba9e02c538490de880c7d Mon Sep 17 00:00:00 2001 From: Jan Kotas Date: Mon, 12 Jan 2026 21:12:31 -0800 Subject: [PATCH 10/10] Update docs/design/coreclr/botr/xplat-minidump-generation.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- docs/design/coreclr/botr/xplat-minidump-generation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/design/coreclr/botr/xplat-minidump-generation.md b/docs/design/coreclr/botr/xplat-minidump-generation.md index 7c3d33b80556ba..1fed91ac5b218a 100644 --- a/docs/design/coreclr/botr/xplat-minidump-generation.md +++ b/docs/design/coreclr/botr/xplat-minidump-generation.md @@ -126,7 +126,7 @@ export DOTNET_DbgCreateDumpToolPath=/path/to/directory ./myapp ``` -The runtime will look for the `createdump` binary in the specified directory. This allows you to "bring your own" dump generation tool. Note that this environment variable is only supported in NativeAOT applications only and ignored otherwise. +The runtime will look for the `createdump` binary in the specified directory. This allows you to "bring your own" dump generation tool. Note that this environment variable is only supported in NativeAOT applications and ignored otherwise. # Testing #