Skip to content

Add --crash-report option to the CrashDump extension#8191

Open
Copilot wants to merge 10 commits into
mainfrom
copilot/feature-generate-crash-report
Open

Add --crash-report option to the CrashDump extension#8191
Copilot wants to merge 10 commits into
mainfrom
copilot/feature-generate-crash-report

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented May 13, 2026

New Feature

What does this feature do?

The CrashDump extension can now ask the .NET runtime to generate JSON crash reports in addition to, or instead of, a dump. This makes crash triage lighter-weight in CI, especially for environments where full dump collection is expensive or impractical.

A single composable flag --crash-report was chosen over the original two-flag (--crashreport + --crashreport-only) design: one flag = one artifact type, the option can be combined freely with --crashdump, and no awkward mutual-exclusion validation is needed.

Why is this feature needed?

DOTNET_EnableCrashReport and DOTNET_EnableCrashReportOnly are already available in the runtime, but the MTP CrashDump extension only exposed dump generation. Surfacing crash reports gives a cheaper diagnostic path and improves crash investigation on machines where developers cannot inspect native dumps directly.

Implementation details

  • CLI surface

    • Added --crash-report (kebab-case, matching the broader MTP CLI convention such as --results-directory, --diagnostic-output-directory, etc.)
    • Behavior matrix:
      • --crashdump → dump only
      • --crash-report → crash report only
      • --crashdump --crash-report → dump + crash report
    • On Windows, --crash-report is rejected at command-line validation time because the .NET runtime ignores DOTNET_EnableCrashReport / DOTNET_EnableCrashReportOnly on Windows (see dotnet/runtime#80191). The error message points users to --crashdump as the alternative.
  • Runtime configuration

    • Wires the new option to the runtime environment variables:
      • --crashdump --crash-reportDOTNET_DbgEnableMiniDump=1 + DOTNET_EnableCrashReport=1
      • --crash-reportDOTNET_DbgEnableMiniDump=1 + DOTNET_EnableCrashReportOnly=1 (createdump still needs MiniDump activation to emit the report)
  • Artifacts and user-visible behavior

    • Added crash report artifact discovery/publishing for *.crashreport.json
    • The crash banner is now driven by what was actually written to disk (per-artifact generated / could not find messaging), so it no longer claims success for an artifact the runtime did not emit.
    • Updated help text and PACKAGE.md to describe the new option and the Windows limitation.
  • Platform fix (deterministic option ordering)

    • Microsoft.Testing.Platform now sorts CLI options for --help / --info using StringComparer.Ordinal instead of the culture-aware default. Without this, the relative order of --crash-report vs --crashdump differed between .NET Framework (word sort ignores -) and .NET (Core) (ordinal-like ICU sort), which would make the help/info acceptance tests non-deterministic across TFMs.
  • Coverage

    • Unit coverage for --crash-report alone, --crash-report combined with --crashdump, and the Windows-only validation rejection.
    • Acceptance coverage for:
      • --crashdump --crash-report (dump + report, Linux/macOS only)
      • --crash-report alone with default name (report only, Linux/macOS only)
      • --crash-report with --crashdump-filename (report only with custom name, Linux/macOS only)
      • --crash-report on Windows → fails with the platform-limitation error
    • Updated --help / --info expectations for the new CLI option ordering.

Example

# Generate a dump and a JSON crash report (Linux/macOS)
dotnet test -- --crashdump --crash-report

# Generate only a JSON crash report (Linux/macOS)
dotnet test -- --crash-report

# On Windows, --crash-report is rejected (use --crashdump):
dotnet test -- --crashdump

Copilot AI self-assigned this May 13, 2026
Copilot AI review requested due to automatic review settings May 13, 2026 17:02
Copilot AI review requested due to automatic review settings May 13, 2026 17:02
Copilot AI linked an issue May 13, 2026 that may be closed by this pull request
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
Copilot AI requested review from Copilot and removed request for Copilot May 13, 2026 17:23
Copilot AI changed the title [WIP] Add feature to generate crash report for .NET 6.0 and 7.0 Add crash report support to the CrashDump extension May 13, 2026
Copilot AI requested a review from Evangelink May 13, 2026 17:24
@Evangelink Evangelink marked this pull request as ready for review May 14, 2026 14:59
Copilot AI review requested due to automatic review settings May 14, 2026 14:59
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Extends the CrashDump MTP extension with new --crashreport and --crashreport-only options that wire the test host runtime variables DOTNET_EnableCrashReport / DOTNET_EnableCrashReportOnly and publish the resulting *.crashreport.json as artifacts.

Changes:

  • New CLI options with mutual-exclusion validation (--crashreport requires --crashdump; --crashreport-only excludes the others).
  • Environment variable provider sets the new runtime variables (and keeps DbgEnableMiniDump for --crashreport-only); lifetime handler emits new "dump only / report only / dump + report" messages and publishes crash report artifacts.
  • New resx/xlf entries, PACKAGE.md doc update, unit/acceptance/help-info test coverage for the new options.
Show a summary per file
File Description
src/Platform/Microsoft.Testing.Extensions.CrashDump/CrashDumpCommandLineOptions.cs Adds option name constants for the two new flags.
src/Platform/Microsoft.Testing.Extensions.CrashDump/CrashDumpCommandLineProvider.cs Registers new options and adds combined-options validation via chained ternary.
src/Platform/Microsoft.Testing.Extensions.CrashDump/CrashDumpEnvironmentVariableProvider.cs Sets/validates DOTNET_EnableCrashReport(Only) and conditionalizes DbgEnableMiniDump.
src/Platform/Microsoft.Testing.Extensions.CrashDump/CrashDumpProcessLifetimeHandler.cs Picks crash message variant; publishes .crashreport.json artifacts in addition to dumps.
src/Platform/Microsoft.Testing.Extensions.CrashDump/Resources/CrashDumpResources.resx New resource strings for descriptions, errors, and crash messages.
src/Platform/Microsoft.Testing.Extensions.CrashDump/Resources/xlf/*.xlf Auto-added state="new" entries mirroring the resx additions across all locales.
src/Platform/Microsoft.Testing.Extensions.CrashDump/PACKAGE.md Documents new crash report capabilities.
test/UnitTests/Microsoft.Testing.Extensions.UnitTests/CrashDumpTests.cs Adds unit tests for valid/invalid combinations of the new flags.
test/IntegrationTests/Microsoft.Testing.Platform.Acceptance.IntegrationTests/CrashDumpTests.cs Acceptance tests for dump+report, report-only, and --crashreport without --crashdump.
test/IntegrationTests/Microsoft.Testing.Platform.Acceptance.IntegrationTests/HelpInfoAllExtensionsTests.cs Updates expected help/info output to include the new options.

Copilot's findings

  • Files reviewed: 22/22 changed files
  • Comments generated: 3

Amaury Levé and others added 2 commits May 14, 2026 20:19
…shDump tests/code

- Reorder --crashreport / --crashreport-only after --crashdump-type in the
  Help and Info expectations to match the platform's alphabetical ordering
  (CommandLineHandler.PrintOptionsAsync OrderBy(option.Name)).
- Refactor CrashDump option validation into explicit if-statements for clarity.
- Rename EnableMiniDumpValue -> EnabledValue (now reused for crash report vars).
- Make CrashReportOnly_CustomDumpName_CreateOnlyCrashReport robust on Windows by
  doing an exact filename comparison instead of relying on Directory.GetFiles
  pattern matching, which can match 'customdumpname.dmp.crashreport.json'.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Revert the validation refactor, EnabledValue rename, and the Windows-safe
filename check in CrashReportOnly_CustomDumpName_CreateOnlyCrashReport.
The HelpInfoAllExtensionsTests ordering fix is preserved.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings May 14, 2026 18:29
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

Comments suppressed due to low confidence (1)

src/Platform/Microsoft.Testing.Extensions.CrashDump/CrashDumpProcessLifetimeHandler.cs:1

  • Mirror of the existing dump-fallback path: if Path.GetDirectoryName(expectedCrashReportFile) returns an empty string (when the dump file pattern is just a filename with no directory component), Directory.GetFiles("", ...) will throw ArgumentException. The pre-existing dump branch has the same issue, but consider falling back to the current directory or skipping the scan when the directory is empty so the new code path doesn't introduce another instance of the same brittleness.
// Copyright (c) Microsoft Corporation. All rights reserved.
  • Files reviewed: 22/22 changed files
  • Comments generated: 8

- CrashDumpCommandLineProvider: replace chained ternary with explicit
  if-statements for clarity and easier extension.
- CrashDumpEnvironmentVariableProvider: rename EnableMiniDumpValue to
  EnabledValue since it's now reused for the crash report environment
  variables (DOTNET_EnableCrashReport / DOTNET_EnableCrashReportOnly).
- CrashReportOnly_CustomDumpName_CreateOnlyCrashReport: do an explicit
  filename comparison instead of relying on Directory.GetFiles' pattern
  matching, which on Windows can also match
  'customdumpname.dmp.crashreport.json' for the literal pattern
  'customdumpname.dmp'.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Copy link
Copy Markdown
Member

@copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
Copilot AI requested review from Copilot and removed request for Copilot May 14, 2026 19:01
Copy link
Copy Markdown
Contributor Author

Copilot AI commented May 14, 2026

@copilot address review comments

Addressed in d68feac. I covered the remaining CrashDump review feedback: validation precedence/coverage, resource quoting and XLF sync, crash report minidump wiring, crash report suffix constants, environment validation deduplication, and the acceptance test rename.

Replaces the two-flag design (--crashreport + --crashreport-only) with a single composable flag --crash-report. Behavior:

- '--crashdump' alone: dump only (unchanged)

- '--crash-report' alone: report only (DOTNET_EnableCrashReportOnly=1)

- '--crashdump --crash-report': both (DOTNET_EnableCrashReport=1)

Removes obsolete validation rules and resource strings (CrashReportRequiresCrashDumpErrorMessage, CrashReportOnlyCannotBeCombinedErrorMessage, CrashReportOnlyOptionDescription) and the corresponding XLF entries. Updates PACKAGE.md, unit tests, acceptance tests and HelpInfoAllExtensionsTests.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings May 15, 2026 14:16
@Evangelink
Copy link
Copy Markdown
Member

CLI option rename and simplification (commit 64d9b6f)

After discussing the CLI surface, I simplified the design from two flags (--crashreport + --crashreport-only) to a single composable flag --crash-report:

Command Result Internal
--crashdump dump only DbgEnableMiniDump=1
--crash-report report only DbgEnableMiniDump=1 + DOTNET_EnableCrashReportOnly=1
--crashdump --crash-report dump + report DbgEnableMiniDump=1 + DOTNET_EnableCrashReport=1

Why:

  • One flag = one artifact type (cleaner mental model).
  • No need for an awkward -only suffix flag.
  • Removes the "--crashreport requires --crashdump" validation rule — that coupling was a wart.
  • Removes the "--crashreport-only cannot be combined with..." validation rule.
  • --crash-report (kebab-case) follows the broader MTP CLI convention (--results-directory, --diagnostic-output-fileprefix, etc.) — --crashdump itself is the legacy outlier.

This also lets us drop two error-message resources (and their XLF entries) and the option-mutual-exclusion test cases.

All 8 review comments from the second review are addressed individually above.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 22/22 changed files
  • Comments generated: 3

Comment on lines +69 to +74
if (crashDumpEnabled || crashReportEnabled)
{
foreach (string prefix in Prefixes)
{
environmentVariables.SetVariable(new($"{prefix}{EnableMiniDumpVariable}", EnabledValue, false, true));
}
internal static class CrashDumpCommandLineOptions
{
public const string CrashDumpOptionName = "crashdump";
public const string CrashReportOptionName = "crash-report";
Comment on lines +150 to +167
<data name="CrashReportArtifactDescription" xml:space="preserve">
<value>The testhost process crash report file</value>
</data>
<data name="CrashReportArtifactDisplayName" xml:space="preserve">
<value>Crash report file</value>
</data>
<data name="CrashReportOptionDescription" xml:space="preserve">
<value>Generate a JSON crash report when the test process crashes. Combine with '--crashdump' to also generate a dump file. Requires .NET 7+ when used alone; .NET 6+ when combined with '--crashdump'.</value>
</data>
<data name="CrashDumpProcessCrashedDumpAndReportFileCreated" xml:space="preserve">
<value>Test host process with PID '{0}' crashed, a dump file and crash report were generated</value>
</data>
<data name="CrashDumpProcessCrashedDumpFileCreated" xml:space="preserve">
<value>Test host process with PID '{0}' crashed, a dump file was generated</value>
</data>
<data name="CrashDumpProcessCrashedReportFileCreated" xml:space="preserve">
<value>Test host process with PID '{0}' crashed, a crash report was generated</value>
</data>
Evangelink and others added 2 commits May 16, 2026 11:03
- Reject --crash-report on Windows due to dotnet/runtime#80191 (runtime
  ignores DOTNET_EnableCrashReport/EnableCrashReportOnly on Windows).
- Skip Windows-incompatible acceptance/unit tests and add Windows
  validation coverage.
- Emit the crash banner based on what was actually produced on disk
  (per-artifact `generated`/`could not find` messaging), to avoid
  claiming success for files the runtime did not emit.
- Remove redundant gate checks in CrashDump environment variable
  provider (IsEnabledAsync already gates the call).
- Re-sort CrashDumpResources.resx alphabetically and regenerate XLF.
- Update CrashReportOptionDescription and PACKAGE.md to mention the
  Windows limitation.
- Use StringComparer.Ordinal for --help / --info option sorting in
  MTP so option order is deterministic across .NET FX and .NET Core
  (otherwise '--crash-report' vs '--crashdump' sort differently per
  runtime).
- Add a CrashDumpProcessCrashed resource for the neutral banner used
  when no artifacts were produced.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings May 16, 2026 13:18
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 23/23 changed files
  • Comments generated: 0 new

@Evangelink Evangelink changed the title Add crash report support to the CrashDump extension Add --crash-report option to the CrashDump extension May 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Feature request: Generate crash report

4 participants