[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-dotnet-ci-crash-dump":3,"mdc-jdu7s6-key":36,"related-repo-dotnet-ci-crash-dump":1970,"related-org-dotnet-ci-crash-dump":2058},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":31,"sourceUrl":34,"mdContent":35},"ci-crash-dump","debug CI crash dumps","Download and debug crash dumps from CI test failures in dotnet repositories. Use when a CI test crashed (not just failed), when the user wants to debug a crash dump from a PR or build, or when asked \"debug dump\", \"download dump\", \"crash dump from CI\", \"test crashed\", \"analyze crash in PR\", or \"why did the test crash\". DO NOT USE FOR: test failures that are not crashes (use ci-analysis), build failures, performance analysis, or analyzing dumps you already have locally.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"dotnet",".NET (Microsoft)","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fdotnet.png",[12,16,19,22],{"name":13,"slug":14,"type":15},".NET","net","tag",{"name":17,"slug":18,"type":15},"CI\u002FCD","ci-cd",{"name":20,"slug":21,"type":15},"Testing","testing",{"name":23,"slug":24,"type":15},"Debugging","debugging",12,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Farcade-skills","2026-07-12T08:21:56.945844",null,18,[],{"repoUrl":26,"stars":25,"forks":29,"topics":32,"description":33},[],"Reuseable AI skills, plugins, agents for use in the dotnet product repos, such as dotnet\u002Fruntime","https:\u002F\u002Fgithub.com\u002Fdotnet\u002Farcade-skills\u002Ftree\u002FHEAD\u002Fplugins\u002Fdotnet-dnceng\u002Fskills\u002Fci-crash-dump","---\nname: ci-crash-dump\ndescription: >\n  Download and debug crash dumps from CI test failures in dotnet repositories.\n  Use when a CI test crashed (not just failed), when the user wants to debug a crash dump\n  from a PR or build, or when asked \"debug dump\", \"download dump\", \"crash dump from CI\",\n  \"test crashed\", \"analyze crash in PR\", or \"why did the test crash\".\n  DO NOT USE FOR: test failures that are not crashes (use ci-analysis),\n  build failures, performance analysis, or analyzing dumps you already have locally.\n---\n\n# CI Crash Dump Analysis\n\nDotnet repositories run tests on a distributed test infrastructure called Helix. When a test\nprocess crashes, Helix captures a dump file and publishes it as an artifact. This skill\ncovers finding those artifacts, downloading them, and analyzing the dump.\n\n## When to Use\n\n- A CI test crashed (not just failed with assertion errors)\n- User wants to debug a dump from a PR or build\n\n## When Not to Use\n\n- Test failed but didn't crash (normal assertion failure) — use `ci-analysis`\n- User already has a dump file locally\n- Build failures (no test execution occurred)\n\n## Step 1: Identify the Crashed Work Item\n\n**If pointed at a PR**, use this plugin's `ci-analysis` skill to find failing Helix jobs.\nThe `ci-analysis` skill provides `Get-CIStatus.ps1`:\n```\n..\u002Fci-analysis\u002Fscripts\u002FGet-CIStatus.ps1 -PRNumber \u003CPR> -Repository \"dotnet\u002Fruntime\" -ShowLogs\n..\u002Fci-analysis\u002Fscripts\u002FGet-CIStatus.ps1 -BuildId \u003CBuildId> -ShowLogs\n```\n\n**If pointed at an issue** (not a PR), look at the issue body and comments for linked AzDO\nbuild URLs. Multiple builds may be listed — start with the most recent, as older builds may\nhave expired from AzDO retention policies. Pass its build ID to\n`..\u002Fci-analysis\u002Fscripts\u002FGet-CIStatus.ps1`.\nThere is no associated PR in this scenario — skip PR correlation in your analysis.\n\n> **Stacks already in the issue\u002FPR:** The issue or PR may already contain a pasted stack trace.\n> Do not simply repeat it — always perform your own independent analysis from the console log\n> and\u002For dump. You may get better symbol resolution, find additional threads, or identify\n> details the original poster missed. Use any existing stacks as a cross-reference, not a\n> substitute.\n\nCrashes are reported at the work item level. Look for work items that have dump files in\ntheir artifacts. Note that even individual test-name failures can be crashes (not just\nassertion failures) — for example, in dotnet\u002Fruntime test crashes are often attributed to\nindividual tests. A single work item may also contain multiple crashes (e.g., tests using\n`RemoteExecutor` or process isolation). A PR may have many failures — look specifically\nfor work items with dump files. If multiple work items crashed, list them and ask the user\nwhich one to investigate.\n\n## Step 2: Check the Console Log First\n\nBefore downloading any dump files, check the work item's console log.\n`..\u002Fci-analysis\u002Fscripts\u002FGet-CIStatus.ps1 -ShowLogs`\nreports the `ConsoleOutputUri`, or find it in the Helix work item Details response.\nIn **dotnet\u002Fruntime**, the crash handler runs `cdb` (or equivalent) on the machine before\nuploading, so the console log may contain symbolicated native stacks (`~*k`) and\nmanaged stacks (`!clrstack -all`). Other repos may not have this — the console log may only\nshow test output. If crash stacks are present and symbols are resolved (function names, not\njust hex addresses), use them as a starting point for analysis. However, stacks alone may\nnot be sufficient — for corruption, heap issues, or cases where managed exceptions are\ncaught by the test framework (common in libs tests using xunit), downloading and analyzing\nthe dump provides deeper insight. If the stacks are missing, truncated, or show only\nunresolved addresses, proceed directly to download the dump.\n\n## Step 3: Query the Work Item for Crash Evidence\n\nQuery the Helix API for work item details:\n```\nGET https:\u002F\u002Fhelix.dot.net\u002Fapi\u002F2019-06-17\u002Fjobs\u002F{jobId}\u002Fworkitems\u002F{workItemName}\n```\n\n> The work item name often contains spaces, parentheses, or other special characters.\n> URL-encode it (e.g., `[uri]::EscapeDataString($workItemName)` in PowerShell) or the\n> request will 404.\n\nThe response includes `ExitCode` and a `Files` array (each with `FileName` and `Uri`).\nHowever, the `Files` URIs from the Details endpoint can be broken for subdirectory or Unicode\nfilenames. To get reliable download URIs, use the separate ListFiles endpoint:\n```\nGET https:\u002F\u002Fhelix.dot.net\u002Fapi\u002F2019-06-17\u002Fjobs\u002F{jobId}\u002Fworkitems\u002F{workItemName}\u002Ffiles\n```\n\n**Crash vs. normal failure:** Crashes have a negative or large `ExitCode` and crash artifacts\nin the `Files` array: `.dmp` files (Windows) or `.crashreport.json` files (macOS\u002FLinux).\nNormal failures have `ExitCode: 1` and no crash artifacts.\n**If there are no dump or crashreport files, stop here** — this is a normal test failure,\nnot a crash. Report the failure details to the user and suggest using the `ci-analysis`\nskill instead.\n\n> **`.crashreport.json` files** are generated on macOS and Linux (there is no Windows\n> equivalent). They contain full native call stacks and are often the most useful starting\n> point for crash analysis — check these first before attempting to load the dump.\n\nCommon crash exit codes:\n\n| Exit code | Meaning | Platform |\n|-----------|---------|----------|\n| `-1073740771` (`0xC000041D`) | Process abort | Windows |\n| `-1073741819` (`0xC0000005`) | Access violation | Windows |\n| `-532462766` (`0xE0434352`) | CLR unhandled exception | Windows |\n| `134` (128+6) | SIGABRT | Linux\u002FmacOS |\n| `139` (128+11) | SIGSEGV | Linux\u002FmacOS |\n\n## Step 4: Download Artifacts\n\n> **Check the console log first** (Step 2). If it already contains the crash stacks, you may\n> not need to download the dump at all. Only proceed with download if the console log doesn't\n> have sufficient detail.\n\nDownload files using the ListFiles endpoint URIs. Start with `.crashreport.json` files\n(contain stack traces, especially useful for macOS) and `.dmp` files — these are directly\ndownloadable and often sufficient for initial analysis without needing the full payload.\n\n> **Duplicate dumps:** Crashes often produce multiple dump files for the same crash.\n> On Windows you may see e.g. `dotnet.exe.6524.dmp` and `dotnet.exe(1).6524.dmp` — one from\n> Windows Error Reporting and one from `createdump`. Prefer the `createdump` variant (usually\n> the `(1)` file) as it is more reliable for SOS\u002F`dotnet-dump`. On Linux you may see e.g.\n> `core.1000.33` and `coredump.33.dmp` for the same crash. Prefer the `coredump.*.dmp` file\n> (produced by `createdump`) over the `core.*` file (kernel core dump). In either case, only\n> analyze one and ignore the duplicate.\n\nDownload the remaining payload files (runtime binaries, test binaries) only if you need to\nload the dump in a debugger. Do not use `runfo get-helix-payload` unless you actually need\nthe full payload — it downloads everything including large runtime binaries. If the `Files`\nURIs are inaccessible (expired, 403, etc.) and you do need the payload, fall back to\n[runfo](https:\u002F\u002Fgithub.com\u002Fjaredpar\u002Frunfo): `runfo get-helix-payload -j \u003CjobId> -w \u003CworkItem> -o \u003Cdir>`.\n\n> **Internal Helix jobs** (identified by the org `dnceng` rather than `dnceng-public` in URLs,\n> or when the Helix API returns 401\u002F403) require authentication that the agent does not have.\n> Report the job ID and work item name to the user and ask them to download manually.\n\nExtract any archive files (`.zip`, `.tar.gz`) in the downloaded payload.\n\n## Step 5: Debug the Dump\n\nThe dump needs matching runtime binaries (DAC, SOS) from the payload at\n`shared\u002FMicrosoft.NETCore.App\u002F\u003Cversion>\u002F`.\n\n> **`dotnet-dump` version must match the runtime version of the dump.** A .NET 9.0\n> `dotnet-dump` cannot load a .NET 11.0 DAC (fails with `0x80004002` or\n> `No CLR runtime found`). `dotnet-dump` is backwards compatible, so the simplest\n> approach is to install the latest version:\n> `dotnet tool install -g dotnet-dump --prerelease` (or `dotnet tool update -g dotnet-dump --prerelease`).\n> This usually comes from the `dotnet-tools` feed and works for all supported runtime versions.\n>\n> **If a matching dotnet-dump version is not available** (common for unreleased .NET versions\n> where no package exists on NuGet or dev feeds), **skip dotnet-dump and use `cdb` instead**\n> (see \"Native crashes on Windows\" below). `cdb` does not have the DAC version coupling\n> problem — its `!analyze -v` and `kn` commands produce native + managed stacks without\n> needing a matching SOS\u002FDAC version.\n>\n> **When DAC loading fails**, run `modules -v` inside `dotnet-dump analyze` as a first\n> diagnostic step. This command works without the DAC and shows the full paths of all loaded\n> modules, including the exact `coreclr.dll` and `System.Private.CoreLib.dll` that were in\n> use. This tells you which runtime build produced the dump and where to find the matching\n> DAC. Use `setclrpath` to point to that directory.\n\nDetermine the dump's platform from the CI job name (e.g., \"windows-x64\", \"linux-arm64\").\n\n### OS compatibility\n\n`dotnet-dump` can analyze managed state cross-platform. Native debuggers require a matching OS.\n\n| Dump OS | Agent on Windows | Agent on Linux | Agent on macOS |\n|---------|-----------------|----------------|----------------|\n| Windows | ✅ `dotnet-dump`, `cdb` | ⚠️ `dotnet-dump` managed-only | ⚠️ `dotnet-dump` managed-only |\n| Linux | ⚠️ `dotnet-dump` managed-only (needs Cross DAC — see below) | ✅ `dotnet-dump`, `lldb` | ⚠️ `dotnet-dump` managed-only |\n| macOS | ⚠️ Use `.crashreport.json` stacks only | ⚠️ Use `.crashreport.json` stacks only | ✅ `lldb` |\n\n> **Cross DAC for Linux dumps on Windows**: `dotnet-dump` needs the cross-DAC binaries to read\n> Linux ELF core dumps. Search the AzDO build artifacts for names containing `CrossDac` (the\n> exact artifact name varies by build — e.g., `CoreCLRCrossDacArtifacts`). Copy the matching\n> architecture's binaries into the runtime dir alongside the payload. If no cross-DAC artifact\n> is found, report this to the user.\n>\n> **macOS Mach-O core dumps** generally cannot be loaded by `dotnet-dump` even with cross-DAC.\n> The `.crashreport.json` files from the Helix `Files` array contain full native stacks and\n> are the primary analysis path for macOS crashes on non-macOS agents.\n\nIf the agent cannot fully analyze the dump (OS mismatch), report the crash type, exit code,\ndump file path, and runtime binaries path, and suggest the user debug manually.\n\n### Managed crashes\n\nUse `dotnet-dump analyze`. The critical Helix-specific setup:\n- `setclrpath` — point to the runtime binaries from the payload\n- `setsymbolserver -directory` — same path, for symbols\n- `setsymbolserver` (no args) — also enables the Microsoft public symbol server for OS and framework symbols\n\nStart with `pe` (print exception) and `clrstack -all`. See [SOS command reference](https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fcore\u002Fdiagnostics\u002Fsos-debugging-extension) for further commands.\n\n### Native crashes on Windows\n\nUse `cdb.exe` (command-line debugger) for native crashes, or as a **fallback when\n`dotnet-dump` cannot load the DAC** (e.g., unreleased .NET versions). `cdb` does not depend\non SOS\u002FDAC version matching for native stacks and `!analyze -v`.\n\n`cdb.exe` may be at `C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x64\\cdb.exe`\n(Windows SDK) or inside the WinDbg MSIX package (`winget install --id Microsoft.WinDbg`).\nTo find it in the MSIX package:\n```powershell\n$pkg = Get-AppxPackage -Name \"*WinDbg*\"\n$cdb = Join-Path $pkg.InstallLocation \"amd64\\cdb.exe\"\n```\n\n> **MSIX sandbox limitation:** `cdb.exe` from the WinDbg MSIX package may not be able to\n> access files at arbitrary paths (e.g., `C:\\dumps`). If it reports \"file not found\" for a\n> dump that exists, copy the dump to `$env:TEMP` and open it from there.\n\nSet up the Microsoft public symbol server: `.symfix+ c:\\symbols`. Key commands: `!analyze -v` (automatic crash analysis), `kP` \u002F `~*kP` (native stacks).\nFor mixed native+managed: `.loadby sos coreclr`, then `!setclrpath`, `!pe`, `!clrstack`.\n\n### Native crashes on Linux\u002FmacOS\n\nUse `lldb` with the SOS plugin for combined native + managed debugging. Point it at the dump\nand the dotnet host binary from the payload. Native commands: `bt` (backtrace), `bt all`\n(all threads), `frame variable` (locals). After loading the SOS plugin, use `setclrpath` \u002F`setsymbolserver`, then `pe`, `clrstack -all`\nfor managed state — these SOS commands work inside `lldb` the same as in `dotnet-dump`.\n\nFor native symbol resolution: runtime binaries in CI are stripped (only `.dynsym` exports).\nUse `dotnet-symbol --host-only --debugging \u003Cpath-to-libcoreclr.so>` to download the matching\n`.dbg` files, which resolve internal function names. Without these, native frames show only\nas offsets between exported symbols.\n\nSetup: [LLDB for .NET](https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fdiagnostics\u002Fblob\u002Fmain\u002Fdocumentation\u002Flldb\u002Flinux-instructions.md).\n\n### NativeAOT crashes\n\nThe CI job name will contain \"NativeAOT\" (e.g., \"osx-arm64 Release NativeAOT_Libraries\").\nSOS does not work with NativeAOT. Use `cdb` or `lldb` directly.\n\n## After Loading the Dump\n\n**Always include the following in your report to the user:**\n- A **link to the PR or build** that was analyzed\n- The **exit code** and its meaning (e.g., `0xC0000005` = access violation)\n- The **crashing thread's call stack** (and any other relevant threads), with symbols resolved\n  as far as possible — this is the most important output\n- Any **managed exception** type, message, and inner exception stack (use `pe`) if different\n  from the native crash stack\n- **Links to existing issues** that match this crash — search the repo for open issues (and\n  also closed issues) with matching crash signatures, stack frames, or error messages. If\n  found, link them so the user can see prior context and whether this is a known problem.\n\nWithout these the user cannot verify your interpretation or dig deeper.\n\nUse the backtrace, exception info, heap state, etc. together with the PR's code changes to\nunderstand *why* the crash happened. Correlate the crash location with what was changed — a\ncrash in code touched by the PR is likely caused by it; a crash elsewhere may be pre-existing\nor a side effect.\n\nIf the crash is in a native binary not part of the PR, report its version metadata\n(`lm v m \u003Cmodule>` in cdb, `image list \u003Cmodule>` in lldb) — the version helps identify\nwhich build or package introduced it.\n\nUse your judgement and knowledge of the codebase to form a diagnosis and suggest a fix.\n\n## Common Pitfalls\n\n- **Helix artifacts expire after 20 days.** If downloads fail with 404, the artifacts have likely expired — tell the user.\n- **AzDO builds also expire** due to retention policies. If a build returns \"not found\", try a more recent build. When multiple builds are listed (e.g., in an issue), start with the newest.\n- **`dotnet-dump` only handles managed state.** For native crashes, use `cdb`\u002F`lldb` on matching OS.\n- **32-bit dumps on 64-bit OS:** Use 32-bit dotnet SDK to install dotnet-dump.\n- **Mobile\u002FWASM dumps** are not covered — report the dump location and hand off.\n- **Internal jobs** (`dnceng` org) require auth the agent doesn't have — report and hand off.\n\n## Further Reading\n\n- [dotnet-dump](https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fcore\u002Fdiagnostics\u002Fdotnet-dump)\n- [SOS debugging extension](https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fcore\u002Fdiagnostics\u002Fsos-debugging-extension)\n- [Debugging .NET core dumps](https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fdiagnostics\u002Fblob\u002Fmain\u002Fdocumentation\u002Fdebugging-coredump.md)\n",{"data":37,"body":38},{"name":4,"description":6},{"type":39,"children":40},"root",[41,50,56,63,78,84,109,115,148,160,178,192,205,211,263,269,274,283,299,343,352,414,432,437,607,613,626,645,742,781,810,831,837,849,1016,1021,1028,1038,1199,1265,1270,1276,1288,1323,1353,1359,1398,1424,1453,1489,1554,1560,1634,1663,1676,1682,1701,1707,1715,1789,1794,1807,1828,1833,1839,1927,1933,1964],{"type":42,"tag":43,"props":44,"children":46},"element","h1",{"id":45},"ci-crash-dump-analysis",[47],{"type":48,"value":49},"text","CI Crash Dump Analysis",{"type":42,"tag":51,"props":52,"children":53},"p",{},[54],{"type":48,"value":55},"Dotnet repositories run tests on a distributed test infrastructure called Helix. When a test\nprocess crashes, Helix captures a dump file and publishes it as an artifact. This skill\ncovers finding those artifacts, downloading them, and analyzing the dump.",{"type":42,"tag":57,"props":58,"children":60},"h2",{"id":59},"when-to-use",[61],{"type":48,"value":62},"When to Use",{"type":42,"tag":64,"props":65,"children":66},"ul",{},[67,73],{"type":42,"tag":68,"props":69,"children":70},"li",{},[71],{"type":48,"value":72},"A CI test crashed (not just failed with assertion errors)",{"type":42,"tag":68,"props":74,"children":75},{},[76],{"type":48,"value":77},"User wants to debug a dump from a PR or build",{"type":42,"tag":57,"props":79,"children":81},{"id":80},"when-not-to-use",[82],{"type":48,"value":83},"When Not to Use",{"type":42,"tag":64,"props":85,"children":86},{},[87,99,104],{"type":42,"tag":68,"props":88,"children":89},{},[90,92],{"type":48,"value":91},"Test failed but didn't crash (normal assertion failure) — use ",{"type":42,"tag":93,"props":94,"children":96},"code",{"className":95},[],[97],{"type":48,"value":98},"ci-analysis",{"type":42,"tag":68,"props":100,"children":101},{},[102],{"type":48,"value":103},"User already has a dump file locally",{"type":42,"tag":68,"props":105,"children":106},{},[107],{"type":48,"value":108},"Build failures (no test execution occurred)",{"type":42,"tag":57,"props":110,"children":112},{"id":111},"step-1-identify-the-crashed-work-item",[113],{"type":48,"value":114},"Step 1: Identify the Crashed Work Item",{"type":42,"tag":51,"props":116,"children":117},{},[118,124,126,131,133,138,140,146],{"type":42,"tag":119,"props":120,"children":121},"strong",{},[122],{"type":48,"value":123},"If pointed at a PR",{"type":48,"value":125},", use this plugin's ",{"type":42,"tag":93,"props":127,"children":129},{"className":128},[],[130],{"type":48,"value":98},{"type":48,"value":132}," skill to find failing Helix jobs.\nThe ",{"type":42,"tag":93,"props":134,"children":136},{"className":135},[],[137],{"type":48,"value":98},{"type":48,"value":139}," skill provides ",{"type":42,"tag":93,"props":141,"children":143},{"className":142},[],[144],{"type":48,"value":145},"Get-CIStatus.ps1",{"type":48,"value":147},":",{"type":42,"tag":149,"props":150,"children":154},"pre",{"className":151,"code":153,"language":48},[152],"language-text","..\u002Fci-analysis\u002Fscripts\u002FGet-CIStatus.ps1 -PRNumber \u003CPR> -Repository \"dotnet\u002Fruntime\" -ShowLogs\n..\u002Fci-analysis\u002Fscripts\u002FGet-CIStatus.ps1 -BuildId \u003CBuildId> -ShowLogs\n",[155],{"type":42,"tag":93,"props":156,"children":158},{"__ignoreMap":157},"",[159],{"type":48,"value":153},{"type":42,"tag":51,"props":161,"children":162},{},[163,168,170,176],{"type":42,"tag":119,"props":164,"children":165},{},[166],{"type":48,"value":167},"If pointed at an issue",{"type":48,"value":169}," (not a PR), look at the issue body and comments for linked AzDO\nbuild URLs. Multiple builds may be listed — start with the most recent, as older builds may\nhave expired from AzDO retention policies. Pass its build ID to\n",{"type":42,"tag":93,"props":171,"children":173},{"className":172},[],[174],{"type":48,"value":175},"..\u002Fci-analysis\u002Fscripts\u002FGet-CIStatus.ps1",{"type":48,"value":177},".\nThere is no associated PR in this scenario — skip PR correlation in your analysis.",{"type":42,"tag":179,"props":180,"children":181},"blockquote",{},[182],{"type":42,"tag":51,"props":183,"children":184},{},[185,190],{"type":42,"tag":119,"props":186,"children":187},{},[188],{"type":48,"value":189},"Stacks already in the issue\u002FPR:",{"type":48,"value":191}," The issue or PR may already contain a pasted stack trace.\nDo not simply repeat it — always perform your own independent analysis from the console log\nand\u002For dump. You may get better symbol resolution, find additional threads, or identify\ndetails the original poster missed. Use any existing stacks as a cross-reference, not a\nsubstitute.",{"type":42,"tag":51,"props":193,"children":194},{},[195,197,203],{"type":48,"value":196},"Crashes are reported at the work item level. Look for work items that have dump files in\ntheir artifacts. Note that even individual test-name failures can be crashes (not just\nassertion failures) — for example, in dotnet\u002Fruntime test crashes are often attributed to\nindividual tests. A single work item may also contain multiple crashes (e.g., tests using\n",{"type":42,"tag":93,"props":198,"children":200},{"className":199},[],[201],{"type":48,"value":202},"RemoteExecutor",{"type":48,"value":204}," or process isolation). A PR may have many failures — look specifically\nfor work items with dump files. If multiple work items crashed, list them and ask the user\nwhich one to investigate.",{"type":42,"tag":57,"props":206,"children":208},{"id":207},"step-2-check-the-console-log-first",[209],{"type":48,"value":210},"Step 2: Check the Console Log First",{"type":42,"tag":51,"props":212,"children":213},{},[214,216,222,224,230,232,237,239,245,247,253,255,261],{"type":48,"value":215},"Before downloading any dump files, check the work item's console log.\n",{"type":42,"tag":93,"props":217,"children":219},{"className":218},[],[220],{"type":48,"value":221},"..\u002Fci-analysis\u002Fscripts\u002FGet-CIStatus.ps1 -ShowLogs",{"type":48,"value":223},"\nreports the ",{"type":42,"tag":93,"props":225,"children":227},{"className":226},[],[228],{"type":48,"value":229},"ConsoleOutputUri",{"type":48,"value":231},", or find it in the Helix work item Details response.\nIn ",{"type":42,"tag":119,"props":233,"children":234},{},[235],{"type":48,"value":236},"dotnet\u002Fruntime",{"type":48,"value":238},", the crash handler runs ",{"type":42,"tag":93,"props":240,"children":242},{"className":241},[],[243],{"type":48,"value":244},"cdb",{"type":48,"value":246}," (or equivalent) on the machine before\nuploading, so the console log may contain symbolicated native stacks (",{"type":42,"tag":93,"props":248,"children":250},{"className":249},[],[251],{"type":48,"value":252},"~*k",{"type":48,"value":254},") and\nmanaged stacks (",{"type":42,"tag":93,"props":256,"children":258},{"className":257},[],[259],{"type":48,"value":260},"!clrstack -all",{"type":48,"value":262},"). Other repos may not have this — the console log may only\nshow test output. If crash stacks are present and symbols are resolved (function names, not\njust hex addresses), use them as a starting point for analysis. However, stacks alone may\nnot be sufficient — for corruption, heap issues, or cases where managed exceptions are\ncaught by the test framework (common in libs tests using xunit), downloading and analyzing\nthe dump provides deeper insight. If the stacks are missing, truncated, or show only\nunresolved addresses, proceed directly to download the dump.",{"type":42,"tag":57,"props":264,"children":266},{"id":265},"step-3-query-the-work-item-for-crash-evidence",[267],{"type":48,"value":268},"Step 3: Query the Work Item for Crash Evidence",{"type":42,"tag":51,"props":270,"children":271},{},[272],{"type":48,"value":273},"Query the Helix API for work item details:",{"type":42,"tag":149,"props":275,"children":278},{"className":276,"code":277,"language":48},[152],"GET https:\u002F\u002Fhelix.dot.net\u002Fapi\u002F2019-06-17\u002Fjobs\u002F{jobId}\u002Fworkitems\u002F{workItemName}\n",[279],{"type":42,"tag":93,"props":280,"children":281},{"__ignoreMap":157},[282],{"type":48,"value":277},{"type":42,"tag":179,"props":284,"children":285},{},[286],{"type":42,"tag":51,"props":287,"children":288},{},[289,291,297],{"type":48,"value":290},"The work item name often contains spaces, parentheses, or other special characters.\nURL-encode it (e.g., ",{"type":42,"tag":93,"props":292,"children":294},{"className":293},[],[295],{"type":48,"value":296},"[uri]::EscapeDataString($workItemName)",{"type":48,"value":298}," in PowerShell) or the\nrequest will 404.",{"type":42,"tag":51,"props":300,"children":301},{},[302,304,310,312,318,320,326,328,334,336,341],{"type":48,"value":303},"The response includes ",{"type":42,"tag":93,"props":305,"children":307},{"className":306},[],[308],{"type":48,"value":309},"ExitCode",{"type":48,"value":311}," and a ",{"type":42,"tag":93,"props":313,"children":315},{"className":314},[],[316],{"type":48,"value":317},"Files",{"type":48,"value":319}," array (each with ",{"type":42,"tag":93,"props":321,"children":323},{"className":322},[],[324],{"type":48,"value":325},"FileName",{"type":48,"value":327}," and ",{"type":42,"tag":93,"props":329,"children":331},{"className":330},[],[332],{"type":48,"value":333},"Uri",{"type":48,"value":335},").\nHowever, the ",{"type":42,"tag":93,"props":337,"children":339},{"className":338},[],[340],{"type":48,"value":317},{"type":48,"value":342}," URIs from the Details endpoint can be broken for subdirectory or Unicode\nfilenames. To get reliable download URIs, use the separate ListFiles endpoint:",{"type":42,"tag":149,"props":344,"children":347},{"className":345,"code":346,"language":48},[152],"GET https:\u002F\u002Fhelix.dot.net\u002Fapi\u002F2019-06-17\u002Fjobs\u002F{jobId}\u002Fworkitems\u002F{workItemName}\u002Ffiles\n",[348],{"type":42,"tag":93,"props":349,"children":350},{"__ignoreMap":157},[351],{"type":48,"value":346},{"type":42,"tag":51,"props":353,"children":354},{},[355,360,362,367,369,374,376,382,384,390,392,398,400,405,407,412],{"type":42,"tag":119,"props":356,"children":357},{},[358],{"type":48,"value":359},"Crash vs. normal failure:",{"type":48,"value":361}," Crashes have a negative or large ",{"type":42,"tag":93,"props":363,"children":365},{"className":364},[],[366],{"type":48,"value":309},{"type":48,"value":368}," and crash artifacts\nin the ",{"type":42,"tag":93,"props":370,"children":372},{"className":371},[],[373],{"type":48,"value":317},{"type":48,"value":375}," array: ",{"type":42,"tag":93,"props":377,"children":379},{"className":378},[],[380],{"type":48,"value":381},".dmp",{"type":48,"value":383}," files (Windows) or ",{"type":42,"tag":93,"props":385,"children":387},{"className":386},[],[388],{"type":48,"value":389},".crashreport.json",{"type":48,"value":391}," files (macOS\u002FLinux).\nNormal failures have ",{"type":42,"tag":93,"props":393,"children":395},{"className":394},[],[396],{"type":48,"value":397},"ExitCode: 1",{"type":48,"value":399}," and no crash artifacts.\n",{"type":42,"tag":119,"props":401,"children":402},{},[403],{"type":48,"value":404},"If there are no dump or crashreport files, stop here",{"type":48,"value":406}," — this is a normal test failure,\nnot a crash. Report the failure details to the user and suggest using the ",{"type":42,"tag":93,"props":408,"children":410},{"className":409},[],[411],{"type":48,"value":98},{"type":48,"value":413},"\nskill instead.",{"type":42,"tag":179,"props":415,"children":416},{},[417],{"type":42,"tag":51,"props":418,"children":419},{},[420,430],{"type":42,"tag":119,"props":421,"children":422},{},[423,428],{"type":42,"tag":93,"props":424,"children":426},{"className":425},[],[427],{"type":48,"value":389},{"type":48,"value":429}," files",{"type":48,"value":431}," are generated on macOS and Linux (there is no Windows\nequivalent). They contain full native call stacks and are often the most useful starting\npoint for crash analysis — check these first before attempting to load the dump.",{"type":42,"tag":51,"props":433,"children":434},{},[435],{"type":48,"value":436},"Common crash exit codes:",{"type":42,"tag":438,"props":439,"children":440},"table",{},[441,465],{"type":42,"tag":442,"props":443,"children":444},"thead",{},[445],{"type":42,"tag":446,"props":447,"children":448},"tr",{},[449,455,460],{"type":42,"tag":450,"props":451,"children":452},"th",{},[453],{"type":48,"value":454},"Exit code",{"type":42,"tag":450,"props":456,"children":457},{},[458],{"type":48,"value":459},"Meaning",{"type":42,"tag":450,"props":461,"children":462},{},[463],{"type":48,"value":464},"Platform",{"type":42,"tag":466,"props":467,"children":468},"tbody",{},[469,502,531,560,584],{"type":42,"tag":446,"props":470,"children":471},{},[472,492,497],{"type":42,"tag":473,"props":474,"children":475},"td",{},[476,482,484,490],{"type":42,"tag":93,"props":477,"children":479},{"className":478},[],[480],{"type":48,"value":481},"-1073740771",{"type":48,"value":483}," (",{"type":42,"tag":93,"props":485,"children":487},{"className":486},[],[488],{"type":48,"value":489},"0xC000041D",{"type":48,"value":491},")",{"type":42,"tag":473,"props":493,"children":494},{},[495],{"type":48,"value":496},"Process abort",{"type":42,"tag":473,"props":498,"children":499},{},[500],{"type":48,"value":501},"Windows",{"type":42,"tag":446,"props":503,"children":504},{},[505,522,527],{"type":42,"tag":473,"props":506,"children":507},{},[508,514,515,521],{"type":42,"tag":93,"props":509,"children":511},{"className":510},[],[512],{"type":48,"value":513},"-1073741819",{"type":48,"value":483},{"type":42,"tag":93,"props":516,"children":518},{"className":517},[],[519],{"type":48,"value":520},"0xC0000005",{"type":48,"value":491},{"type":42,"tag":473,"props":523,"children":524},{},[525],{"type":48,"value":526},"Access violation",{"type":42,"tag":473,"props":528,"children":529},{},[530],{"type":48,"value":501},{"type":42,"tag":446,"props":532,"children":533},{},[534,551,556],{"type":42,"tag":473,"props":535,"children":536},{},[537,543,544,550],{"type":42,"tag":93,"props":538,"children":540},{"className":539},[],[541],{"type":48,"value":542},"-532462766",{"type":48,"value":483},{"type":42,"tag":93,"props":545,"children":547},{"className":546},[],[548],{"type":48,"value":549},"0xE0434352",{"type":48,"value":491},{"type":42,"tag":473,"props":552,"children":553},{},[554],{"type":48,"value":555},"CLR unhandled exception",{"type":42,"tag":473,"props":557,"children":558},{},[559],{"type":48,"value":501},{"type":42,"tag":446,"props":561,"children":562},{},[563,574,579],{"type":42,"tag":473,"props":564,"children":565},{},[566,572],{"type":42,"tag":93,"props":567,"children":569},{"className":568},[],[570],{"type":48,"value":571},"134",{"type":48,"value":573}," (128+6)",{"type":42,"tag":473,"props":575,"children":576},{},[577],{"type":48,"value":578},"SIGABRT",{"type":42,"tag":473,"props":580,"children":581},{},[582],{"type":48,"value":583},"Linux\u002FmacOS",{"type":42,"tag":446,"props":585,"children":586},{},[587,598,603],{"type":42,"tag":473,"props":588,"children":589},{},[590,596],{"type":42,"tag":93,"props":591,"children":593},{"className":592},[],[594],{"type":48,"value":595},"139",{"type":48,"value":597}," (128+11)",{"type":42,"tag":473,"props":599,"children":600},{},[601],{"type":48,"value":602},"SIGSEGV",{"type":42,"tag":473,"props":604,"children":605},{},[606],{"type":48,"value":583},{"type":42,"tag":57,"props":608,"children":610},{"id":609},"step-4-download-artifacts",[611],{"type":48,"value":612},"Step 4: Download Artifacts",{"type":42,"tag":179,"props":614,"children":615},{},[616],{"type":42,"tag":51,"props":617,"children":618},{},[619,624],{"type":42,"tag":119,"props":620,"children":621},{},[622],{"type":48,"value":623},"Check the console log first",{"type":48,"value":625}," (Step 2). If it already contains the crash stacks, you may\nnot need to download the dump at all. Only proceed with download if the console log doesn't\nhave sufficient detail.",{"type":42,"tag":51,"props":627,"children":628},{},[629,631,636,638,643],{"type":48,"value":630},"Download files using the ListFiles endpoint URIs. Start with ",{"type":42,"tag":93,"props":632,"children":634},{"className":633},[],[635],{"type":48,"value":389},{"type":48,"value":637}," files\n(contain stack traces, especially useful for macOS) and ",{"type":42,"tag":93,"props":639,"children":641},{"className":640},[],[642],{"type":48,"value":381},{"type":48,"value":644}," files — these are directly\ndownloadable and often sufficient for initial analysis without needing the full payload.",{"type":42,"tag":179,"props":646,"children":647},{},[648],{"type":42,"tag":51,"props":649,"children":650},{},[651,656,658,664,665,671,673,679,681,686,688,694,696,702,704,710,711,717,719,725,727,732,734,740],{"type":42,"tag":119,"props":652,"children":653},{},[654],{"type":48,"value":655},"Duplicate dumps:",{"type":48,"value":657}," Crashes often produce multiple dump files for the same crash.\nOn Windows you may see e.g. ",{"type":42,"tag":93,"props":659,"children":661},{"className":660},[],[662],{"type":48,"value":663},"dotnet.exe.6524.dmp",{"type":48,"value":327},{"type":42,"tag":93,"props":666,"children":668},{"className":667},[],[669],{"type":48,"value":670},"dotnet.exe(1).6524.dmp",{"type":48,"value":672}," — one from\nWindows Error Reporting and one from ",{"type":42,"tag":93,"props":674,"children":676},{"className":675},[],[677],{"type":48,"value":678},"createdump",{"type":48,"value":680},". Prefer the ",{"type":42,"tag":93,"props":682,"children":684},{"className":683},[],[685],{"type":48,"value":678},{"type":48,"value":687}," variant (usually\nthe ",{"type":42,"tag":93,"props":689,"children":691},{"className":690},[],[692],{"type":48,"value":693},"(1)",{"type":48,"value":695}," file) as it is more reliable for SOS\u002F",{"type":42,"tag":93,"props":697,"children":699},{"className":698},[],[700],{"type":48,"value":701},"dotnet-dump",{"type":48,"value":703},". On Linux you may see e.g.\n",{"type":42,"tag":93,"props":705,"children":707},{"className":706},[],[708],{"type":48,"value":709},"core.1000.33",{"type":48,"value":327},{"type":42,"tag":93,"props":712,"children":714},{"className":713},[],[715],{"type":48,"value":716},"coredump.33.dmp",{"type":48,"value":718}," for the same crash. Prefer the ",{"type":42,"tag":93,"props":720,"children":722},{"className":721},[],[723],{"type":48,"value":724},"coredump.*.dmp",{"type":48,"value":726}," file\n(produced by ",{"type":42,"tag":93,"props":728,"children":730},{"className":729},[],[731],{"type":48,"value":678},{"type":48,"value":733},") over the ",{"type":42,"tag":93,"props":735,"children":737},{"className":736},[],[738],{"type":48,"value":739},"core.*",{"type":48,"value":741}," file (kernel core dump). In either case, only\nanalyze one and ignore the duplicate.",{"type":42,"tag":51,"props":743,"children":744},{},[745,747,753,755,760,762,771,773,779],{"type":48,"value":746},"Download the remaining payload files (runtime binaries, test binaries) only if you need to\nload the dump in a debugger. Do not use ",{"type":42,"tag":93,"props":748,"children":750},{"className":749},[],[751],{"type":48,"value":752},"runfo get-helix-payload",{"type":48,"value":754}," unless you actually need\nthe full payload — it downloads everything including large runtime binaries. If the ",{"type":42,"tag":93,"props":756,"children":758},{"className":757},[],[759],{"type":48,"value":317},{"type":48,"value":761},"\nURIs are inaccessible (expired, 403, etc.) and you do need the payload, fall back to\n",{"type":42,"tag":763,"props":764,"children":768},"a",{"href":765,"rel":766},"https:\u002F\u002Fgithub.com\u002Fjaredpar\u002Frunfo",[767],"nofollow",[769],{"type":48,"value":770},"runfo",{"type":48,"value":772},": ",{"type":42,"tag":93,"props":774,"children":776},{"className":775},[],[777],{"type":48,"value":778},"runfo get-helix-payload -j \u003CjobId> -w \u003CworkItem> -o \u003Cdir>",{"type":48,"value":780},".",{"type":42,"tag":179,"props":782,"children":783},{},[784],{"type":42,"tag":51,"props":785,"children":786},{},[787,792,794,800,802,808],{"type":42,"tag":119,"props":788,"children":789},{},[790],{"type":48,"value":791},"Internal Helix jobs",{"type":48,"value":793}," (identified by the org ",{"type":42,"tag":93,"props":795,"children":797},{"className":796},[],[798],{"type":48,"value":799},"dnceng",{"type":48,"value":801}," rather than ",{"type":42,"tag":93,"props":803,"children":805},{"className":804},[],[806],{"type":48,"value":807},"dnceng-public",{"type":48,"value":809}," in URLs,\nor when the Helix API returns 401\u002F403) require authentication that the agent does not have.\nReport the job ID and work item name to the user and ask them to download manually.",{"type":42,"tag":51,"props":811,"children":812},{},[813,815,821,823,829],{"type":48,"value":814},"Extract any archive files (",{"type":42,"tag":93,"props":816,"children":818},{"className":817},[],[819],{"type":48,"value":820},".zip",{"type":48,"value":822},", ",{"type":42,"tag":93,"props":824,"children":826},{"className":825},[],[827],{"type":48,"value":828},".tar.gz",{"type":48,"value":830},") in the downloaded payload.",{"type":42,"tag":57,"props":832,"children":834},{"id":833},"step-5-debug-the-dump",[835],{"type":48,"value":836},"Step 5: Debug the Dump",{"type":42,"tag":51,"props":838,"children":839},{},[840,842,848],{"type":48,"value":841},"The dump needs matching runtime binaries (DAC, SOS) from the payload at\n",{"type":42,"tag":93,"props":843,"children":845},{"className":844},[],[846],{"type":48,"value":847},"shared\u002FMicrosoft.NETCore.App\u002F\u003Cversion>\u002F",{"type":48,"value":780},{"type":42,"tag":179,"props":850,"children":851},{},[852,921,967],{"type":42,"tag":51,"props":853,"children":854},{},[855,865,867,872,874,880,882,888,890,895,897,903,905,911,913,919],{"type":42,"tag":119,"props":856,"children":857},{},[858,863],{"type":42,"tag":93,"props":859,"children":861},{"className":860},[],[862],{"type":48,"value":701},{"type":48,"value":864}," version must match the runtime version of the dump.",{"type":48,"value":866}," A .NET 9.0\n",{"type":42,"tag":93,"props":868,"children":870},{"className":869},[],[871],{"type":48,"value":701},{"type":48,"value":873}," cannot load a .NET 11.0 DAC (fails with ",{"type":42,"tag":93,"props":875,"children":877},{"className":876},[],[878],{"type":48,"value":879},"0x80004002",{"type":48,"value":881}," or\n",{"type":42,"tag":93,"props":883,"children":885},{"className":884},[],[886],{"type":48,"value":887},"No CLR runtime found",{"type":48,"value":889},"). ",{"type":42,"tag":93,"props":891,"children":893},{"className":892},[],[894],{"type":48,"value":701},{"type":48,"value":896}," is backwards compatible, so the simplest\napproach is to install the latest version:\n",{"type":42,"tag":93,"props":898,"children":900},{"className":899},[],[901],{"type":48,"value":902},"dotnet tool install -g dotnet-dump --prerelease",{"type":48,"value":904}," (or ",{"type":42,"tag":93,"props":906,"children":908},{"className":907},[],[909],{"type":48,"value":910},"dotnet tool update -g dotnet-dump --prerelease",{"type":48,"value":912},").\nThis usually comes from the ",{"type":42,"tag":93,"props":914,"children":916},{"className":915},[],[917],{"type":48,"value":918},"dotnet-tools",{"type":48,"value":920}," feed and works for all supported runtime versions.",{"type":42,"tag":51,"props":922,"children":923},{},[924,929,931,943,945,950,952,958,959,965],{"type":42,"tag":119,"props":925,"children":926},{},[927],{"type":48,"value":928},"If a matching dotnet-dump version is not available",{"type":48,"value":930}," (common for unreleased .NET versions\nwhere no package exists on NuGet or dev feeds), ",{"type":42,"tag":119,"props":932,"children":933},{},[934,936,941],{"type":48,"value":935},"skip dotnet-dump and use ",{"type":42,"tag":93,"props":937,"children":939},{"className":938},[],[940],{"type":48,"value":244},{"type":48,"value":942}," instead",{"type":48,"value":944},"\n(see \"Native crashes on Windows\" below). ",{"type":42,"tag":93,"props":946,"children":948},{"className":947},[],[949],{"type":48,"value":244},{"type":48,"value":951}," does not have the DAC version coupling\nproblem — its ",{"type":42,"tag":93,"props":953,"children":955},{"className":954},[],[956],{"type":48,"value":957},"!analyze -v",{"type":48,"value":327},{"type":42,"tag":93,"props":960,"children":962},{"className":961},[],[963],{"type":48,"value":964},"kn",{"type":48,"value":966}," commands produce native + managed stacks without\nneeding a matching SOS\u002FDAC version.",{"type":42,"tag":51,"props":968,"children":969},{},[970,975,977,983,985,991,993,999,1000,1006,1008,1014],{"type":42,"tag":119,"props":971,"children":972},{},[973],{"type":48,"value":974},"When DAC loading fails",{"type":48,"value":976},", run ",{"type":42,"tag":93,"props":978,"children":980},{"className":979},[],[981],{"type":48,"value":982},"modules -v",{"type":48,"value":984}," inside ",{"type":42,"tag":93,"props":986,"children":988},{"className":987},[],[989],{"type":48,"value":990},"dotnet-dump analyze",{"type":48,"value":992}," as a first\ndiagnostic step. This command works without the DAC and shows the full paths of all loaded\nmodules, including the exact ",{"type":42,"tag":93,"props":994,"children":996},{"className":995},[],[997],{"type":48,"value":998},"coreclr.dll",{"type":48,"value":327},{"type":42,"tag":93,"props":1001,"children":1003},{"className":1002},[],[1004],{"type":48,"value":1005},"System.Private.CoreLib.dll",{"type":48,"value":1007}," that were in\nuse. This tells you which runtime build produced the dump and where to find the matching\nDAC. Use ",{"type":42,"tag":93,"props":1009,"children":1011},{"className":1010},[],[1012],{"type":48,"value":1013},"setclrpath",{"type":48,"value":1015}," to point to that directory.",{"type":42,"tag":51,"props":1017,"children":1018},{},[1019],{"type":48,"value":1020},"Determine the dump's platform from the CI job name (e.g., \"windows-x64\", \"linux-arm64\").",{"type":42,"tag":1022,"props":1023,"children":1025},"h3",{"id":1024},"os-compatibility",[1026],{"type":48,"value":1027},"OS compatibility",{"type":42,"tag":51,"props":1029,"children":1030},{},[1031,1036],{"type":42,"tag":93,"props":1032,"children":1034},{"className":1033},[],[1035],{"type":48,"value":701},{"type":48,"value":1037}," can analyze managed state cross-platform. Native debuggers require a matching OS.",{"type":42,"tag":438,"props":1039,"children":1040},{},[1041,1067],{"type":42,"tag":442,"props":1042,"children":1043},{},[1044],{"type":42,"tag":446,"props":1045,"children":1046},{},[1047,1052,1057,1062],{"type":42,"tag":450,"props":1048,"children":1049},{},[1050],{"type":48,"value":1051},"Dump OS",{"type":42,"tag":450,"props":1053,"children":1054},{},[1055],{"type":48,"value":1056},"Agent on Windows",{"type":42,"tag":450,"props":1058,"children":1059},{},[1060],{"type":48,"value":1061},"Agent on Linux",{"type":42,"tag":450,"props":1063,"children":1064},{},[1065],{"type":48,"value":1066},"Agent on macOS",{"type":42,"tag":466,"props":1068,"children":1069},{},[1070,1115,1160],{"type":42,"tag":446,"props":1071,"children":1072},{},[1073,1077,1093,1105],{"type":42,"tag":473,"props":1074,"children":1075},{},[1076],{"type":48,"value":501},{"type":42,"tag":473,"props":1078,"children":1079},{},[1080,1082,1087,1088],{"type":48,"value":1081},"✅ ",{"type":42,"tag":93,"props":1083,"children":1085},{"className":1084},[],[1086],{"type":48,"value":701},{"type":48,"value":822},{"type":42,"tag":93,"props":1089,"children":1091},{"className":1090},[],[1092],{"type":48,"value":244},{"type":42,"tag":473,"props":1094,"children":1095},{},[1096,1098,1103],{"type":48,"value":1097},"⚠️ ",{"type":42,"tag":93,"props":1099,"children":1101},{"className":1100},[],[1102],{"type":48,"value":701},{"type":48,"value":1104}," managed-only",{"type":42,"tag":473,"props":1106,"children":1107},{},[1108,1109,1114],{"type":48,"value":1097},{"type":42,"tag":93,"props":1110,"children":1112},{"className":1111},[],[1113],{"type":48,"value":701},{"type":48,"value":1104},{"type":42,"tag":446,"props":1116,"children":1117},{},[1118,1123,1134,1150],{"type":42,"tag":473,"props":1119,"children":1120},{},[1121],{"type":48,"value":1122},"Linux",{"type":42,"tag":473,"props":1124,"children":1125},{},[1126,1127,1132],{"type":48,"value":1097},{"type":42,"tag":93,"props":1128,"children":1130},{"className":1129},[],[1131],{"type":48,"value":701},{"type":48,"value":1133}," managed-only (needs Cross DAC — see below)",{"type":42,"tag":473,"props":1135,"children":1136},{},[1137,1138,1143,1144],{"type":48,"value":1081},{"type":42,"tag":93,"props":1139,"children":1141},{"className":1140},[],[1142],{"type":48,"value":701},{"type":48,"value":822},{"type":42,"tag":93,"props":1145,"children":1147},{"className":1146},[],[1148],{"type":48,"value":1149},"lldb",{"type":42,"tag":473,"props":1151,"children":1152},{},[1153,1154,1159],{"type":48,"value":1097},{"type":42,"tag":93,"props":1155,"children":1157},{"className":1156},[],[1158],{"type":48,"value":701},{"type":48,"value":1104},{"type":42,"tag":446,"props":1161,"children":1162},{},[1163,1168,1180,1190],{"type":42,"tag":473,"props":1164,"children":1165},{},[1166],{"type":48,"value":1167},"macOS",{"type":42,"tag":473,"props":1169,"children":1170},{},[1171,1173,1178],{"type":48,"value":1172},"⚠️ Use ",{"type":42,"tag":93,"props":1174,"children":1176},{"className":1175},[],[1177],{"type":48,"value":389},{"type":48,"value":1179}," stacks only",{"type":42,"tag":473,"props":1181,"children":1182},{},[1183,1184,1189],{"type":48,"value":1172},{"type":42,"tag":93,"props":1185,"children":1187},{"className":1186},[],[1188],{"type":48,"value":389},{"type":48,"value":1179},{"type":42,"tag":473,"props":1191,"children":1192},{},[1193,1194],{"type":48,"value":1081},{"type":42,"tag":93,"props":1195,"children":1197},{"className":1196},[],[1198],{"type":48,"value":1149},{"type":42,"tag":179,"props":1200,"children":1201},{},[1202,1234],{"type":42,"tag":51,"props":1203,"children":1204},{},[1205,1210,1211,1216,1218,1224,1226,1232],{"type":42,"tag":119,"props":1206,"children":1207},{},[1208],{"type":48,"value":1209},"Cross DAC for Linux dumps on Windows",{"type":48,"value":772},{"type":42,"tag":93,"props":1212,"children":1214},{"className":1213},[],[1215],{"type":48,"value":701},{"type":48,"value":1217}," needs the cross-DAC binaries to read\nLinux ELF core dumps. Search the AzDO build artifacts for names containing ",{"type":42,"tag":93,"props":1219,"children":1221},{"className":1220},[],[1222],{"type":48,"value":1223},"CrossDac",{"type":48,"value":1225}," (the\nexact artifact name varies by build — e.g., ",{"type":42,"tag":93,"props":1227,"children":1229},{"className":1228},[],[1230],{"type":48,"value":1231},"CoreCLRCrossDacArtifacts",{"type":48,"value":1233},"). Copy the matching\narchitecture's binaries into the runtime dir alongside the payload. If no cross-DAC artifact\nis found, report this to the user.",{"type":42,"tag":51,"props":1235,"children":1236},{},[1237,1242,1244,1249,1251,1256,1258,1263],{"type":42,"tag":119,"props":1238,"children":1239},{},[1240],{"type":48,"value":1241},"macOS Mach-O core dumps",{"type":48,"value":1243}," generally cannot be loaded by ",{"type":42,"tag":93,"props":1245,"children":1247},{"className":1246},[],[1248],{"type":48,"value":701},{"type":48,"value":1250}," even with cross-DAC.\nThe ",{"type":42,"tag":93,"props":1252,"children":1254},{"className":1253},[],[1255],{"type":48,"value":389},{"type":48,"value":1257}," files from the Helix ",{"type":42,"tag":93,"props":1259,"children":1261},{"className":1260},[],[1262],{"type":48,"value":317},{"type":48,"value":1264}," array contain full native stacks and\nare the primary analysis path for macOS crashes on non-macOS agents.",{"type":42,"tag":51,"props":1266,"children":1267},{},[1268],{"type":48,"value":1269},"If the agent cannot fully analyze the dump (OS mismatch), report the crash type, exit code,\ndump file path, and runtime binaries path, and suggest the user debug manually.",{"type":42,"tag":1022,"props":1271,"children":1273},{"id":1272},"managed-crashes",[1274],{"type":48,"value":1275},"Managed crashes",{"type":42,"tag":51,"props":1277,"children":1278},{},[1279,1281,1286],{"type":48,"value":1280},"Use ",{"type":42,"tag":93,"props":1282,"children":1284},{"className":1283},[],[1285],{"type":48,"value":990},{"type":48,"value":1287},". The critical Helix-specific setup:",{"type":42,"tag":64,"props":1289,"children":1290},{},[1291,1301,1312],{"type":42,"tag":68,"props":1292,"children":1293},{},[1294,1299],{"type":42,"tag":93,"props":1295,"children":1297},{"className":1296},[],[1298],{"type":48,"value":1013},{"type":48,"value":1300}," — point to the runtime binaries from the payload",{"type":42,"tag":68,"props":1302,"children":1303},{},[1304,1310],{"type":42,"tag":93,"props":1305,"children":1307},{"className":1306},[],[1308],{"type":48,"value":1309},"setsymbolserver -directory",{"type":48,"value":1311}," — same path, for symbols",{"type":42,"tag":68,"props":1313,"children":1314},{},[1315,1321],{"type":42,"tag":93,"props":1316,"children":1318},{"className":1317},[],[1319],{"type":48,"value":1320},"setsymbolserver",{"type":48,"value":1322}," (no args) — also enables the Microsoft public symbol server for OS and framework symbols",{"type":42,"tag":51,"props":1324,"children":1325},{},[1326,1328,1334,1336,1342,1344,1351],{"type":48,"value":1327},"Start with ",{"type":42,"tag":93,"props":1329,"children":1331},{"className":1330},[],[1332],{"type":48,"value":1333},"pe",{"type":48,"value":1335}," (print exception) and ",{"type":42,"tag":93,"props":1337,"children":1339},{"className":1338},[],[1340],{"type":48,"value":1341},"clrstack -all",{"type":48,"value":1343},". See ",{"type":42,"tag":763,"props":1345,"children":1348},{"href":1346,"rel":1347},"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fcore\u002Fdiagnostics\u002Fsos-debugging-extension",[767],[1349],{"type":48,"value":1350},"SOS command reference",{"type":48,"value":1352}," for further commands.",{"type":42,"tag":1022,"props":1354,"children":1356},{"id":1355},"native-crashes-on-windows",[1357],{"type":48,"value":1358},"Native crashes on Windows",{"type":42,"tag":51,"props":1360,"children":1361},{},[1362,1363,1369,1371,1383,1385,1390,1392,1397],{"type":48,"value":1280},{"type":42,"tag":93,"props":1364,"children":1366},{"className":1365},[],[1367],{"type":48,"value":1368},"cdb.exe",{"type":48,"value":1370}," (command-line debugger) for native crashes, or as a ",{"type":42,"tag":119,"props":1372,"children":1373},{},[1374,1376,1381],{"type":48,"value":1375},"fallback when\n",{"type":42,"tag":93,"props":1377,"children":1379},{"className":1378},[],[1380],{"type":48,"value":701},{"type":48,"value":1382}," cannot load the DAC",{"type":48,"value":1384}," (e.g., unreleased .NET versions). ",{"type":42,"tag":93,"props":1386,"children":1388},{"className":1387},[],[1389],{"type":48,"value":244},{"type":48,"value":1391}," does not depend\non SOS\u002FDAC version matching for native stacks and ",{"type":42,"tag":93,"props":1393,"children":1395},{"className":1394},[],[1396],{"type":48,"value":957},{"type":48,"value":780},{"type":42,"tag":51,"props":1399,"children":1400},{},[1401,1406,1408,1414,1416,1422],{"type":42,"tag":93,"props":1402,"children":1404},{"className":1403},[],[1405],{"type":48,"value":1368},{"type":48,"value":1407}," may be at ",{"type":42,"tag":93,"props":1409,"children":1411},{"className":1410},[],[1412],{"type":48,"value":1413},"C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x64\\cdb.exe",{"type":48,"value":1415},"\n(Windows SDK) or inside the WinDbg MSIX package (",{"type":42,"tag":93,"props":1417,"children":1419},{"className":1418},[],[1420],{"type":48,"value":1421},"winget install --id Microsoft.WinDbg",{"type":48,"value":1423},").\nTo find it in the MSIX package:",{"type":42,"tag":149,"props":1425,"children":1429},{"className":1426,"code":1427,"language":1428,"meta":157,"style":157},"language-powershell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","$pkg = Get-AppxPackage -Name \"*WinDbg*\"\n$cdb = Join-Path $pkg.InstallLocation \"amd64\\cdb.exe\"\n","powershell",[1430],{"type":42,"tag":93,"props":1431,"children":1432},{"__ignoreMap":157},[1433,1444],{"type":42,"tag":1434,"props":1435,"children":1438},"span",{"class":1436,"line":1437},"line",1,[1439],{"type":42,"tag":1434,"props":1440,"children":1441},{},[1442],{"type":48,"value":1443},"$pkg = Get-AppxPackage -Name \"*WinDbg*\"\n",{"type":42,"tag":1434,"props":1445,"children":1447},{"class":1436,"line":1446},2,[1448],{"type":42,"tag":1434,"props":1449,"children":1450},{},[1451],{"type":48,"value":1452},"$cdb = Join-Path $pkg.InstallLocation \"amd64\\cdb.exe\"\n",{"type":42,"tag":179,"props":1454,"children":1455},{},[1456],{"type":42,"tag":51,"props":1457,"children":1458},{},[1459,1464,1466,1471,1473,1479,1481,1487],{"type":42,"tag":119,"props":1460,"children":1461},{},[1462],{"type":48,"value":1463},"MSIX sandbox limitation:",{"type":48,"value":1465}," ",{"type":42,"tag":93,"props":1467,"children":1469},{"className":1468},[],[1470],{"type":48,"value":1368},{"type":48,"value":1472}," from the WinDbg MSIX package may not be able to\naccess files at arbitrary paths (e.g., ",{"type":42,"tag":93,"props":1474,"children":1476},{"className":1475},[],[1477],{"type":48,"value":1478},"C:\\dumps",{"type":48,"value":1480},"). If it reports \"file not found\" for a\ndump that exists, copy the dump to ",{"type":42,"tag":93,"props":1482,"children":1484},{"className":1483},[],[1485],{"type":48,"value":1486},"$env:TEMP",{"type":48,"value":1488}," and open it from there.",{"type":42,"tag":51,"props":1490,"children":1491},{},[1492,1494,1500,1502,1507,1509,1515,1517,1523,1525,1531,1533,1539,1540,1546,1547,1553],{"type":48,"value":1493},"Set up the Microsoft public symbol server: ",{"type":42,"tag":93,"props":1495,"children":1497},{"className":1496},[],[1498],{"type":48,"value":1499},".symfix+ c:\\symbols",{"type":48,"value":1501},". Key commands: ",{"type":42,"tag":93,"props":1503,"children":1505},{"className":1504},[],[1506],{"type":48,"value":957},{"type":48,"value":1508}," (automatic crash analysis), ",{"type":42,"tag":93,"props":1510,"children":1512},{"className":1511},[],[1513],{"type":48,"value":1514},"kP",{"type":48,"value":1516}," \u002F ",{"type":42,"tag":93,"props":1518,"children":1520},{"className":1519},[],[1521],{"type":48,"value":1522},"~*kP",{"type":48,"value":1524}," (native stacks).\nFor mixed native+managed: ",{"type":42,"tag":93,"props":1526,"children":1528},{"className":1527},[],[1529],{"type":48,"value":1530},".loadby sos coreclr",{"type":48,"value":1532},", then ",{"type":42,"tag":93,"props":1534,"children":1536},{"className":1535},[],[1537],{"type":48,"value":1538},"!setclrpath",{"type":48,"value":822},{"type":42,"tag":93,"props":1541,"children":1543},{"className":1542},[],[1544],{"type":48,"value":1545},"!pe",{"type":48,"value":822},{"type":42,"tag":93,"props":1548,"children":1550},{"className":1549},[],[1551],{"type":48,"value":1552},"!clrstack",{"type":48,"value":780},{"type":42,"tag":1022,"props":1555,"children":1557},{"id":1556},"native-crashes-on-linuxmacos",[1558],{"type":48,"value":1559},"Native crashes on Linux\u002FmacOS",{"type":42,"tag":51,"props":1561,"children":1562},{},[1563,1564,1569,1571,1577,1579,1585,1587,1593,1595,1600,1602,1607,1608,1613,1614,1619,1621,1626,1628,1633],{"type":48,"value":1280},{"type":42,"tag":93,"props":1565,"children":1567},{"className":1566},[],[1568],{"type":48,"value":1149},{"type":48,"value":1570}," with the SOS plugin for combined native + managed debugging. Point it at the dump\nand the dotnet host binary from the payload. Native commands: ",{"type":42,"tag":93,"props":1572,"children":1574},{"className":1573},[],[1575],{"type":48,"value":1576},"bt",{"type":48,"value":1578}," (backtrace), ",{"type":42,"tag":93,"props":1580,"children":1582},{"className":1581},[],[1583],{"type":48,"value":1584},"bt all",{"type":48,"value":1586},"\n(all threads), ",{"type":42,"tag":93,"props":1588,"children":1590},{"className":1589},[],[1591],{"type":48,"value":1592},"frame variable",{"type":48,"value":1594}," (locals). After loading the SOS plugin, use ",{"type":42,"tag":93,"props":1596,"children":1598},{"className":1597},[],[1599],{"type":48,"value":1013},{"type":48,"value":1601}," \u002F",{"type":42,"tag":93,"props":1603,"children":1605},{"className":1604},[],[1606],{"type":48,"value":1320},{"type":48,"value":1532},{"type":42,"tag":93,"props":1609,"children":1611},{"className":1610},[],[1612],{"type":48,"value":1333},{"type":48,"value":822},{"type":42,"tag":93,"props":1615,"children":1617},{"className":1616},[],[1618],{"type":48,"value":1341},{"type":48,"value":1620},"\nfor managed state — these SOS commands work inside ",{"type":42,"tag":93,"props":1622,"children":1624},{"className":1623},[],[1625],{"type":48,"value":1149},{"type":48,"value":1627}," the same as in ",{"type":42,"tag":93,"props":1629,"children":1631},{"className":1630},[],[1632],{"type":48,"value":701},{"type":48,"value":780},{"type":42,"tag":51,"props":1635,"children":1636},{},[1637,1639,1645,1647,1653,1655,1661],{"type":48,"value":1638},"For native symbol resolution: runtime binaries in CI are stripped (only ",{"type":42,"tag":93,"props":1640,"children":1642},{"className":1641},[],[1643],{"type":48,"value":1644},".dynsym",{"type":48,"value":1646}," exports).\nUse ",{"type":42,"tag":93,"props":1648,"children":1650},{"className":1649},[],[1651],{"type":48,"value":1652},"dotnet-symbol --host-only --debugging \u003Cpath-to-libcoreclr.so>",{"type":48,"value":1654}," to download the matching\n",{"type":42,"tag":93,"props":1656,"children":1658},{"className":1657},[],[1659],{"type":48,"value":1660},".dbg",{"type":48,"value":1662}," files, which resolve internal function names. Without these, native frames show only\nas offsets between exported symbols.",{"type":42,"tag":51,"props":1664,"children":1665},{},[1666,1668,1675],{"type":48,"value":1667},"Setup: ",{"type":42,"tag":763,"props":1669,"children":1672},{"href":1670,"rel":1671},"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fdiagnostics\u002Fblob\u002Fmain\u002Fdocumentation\u002Flldb\u002Flinux-instructions.md",[767],[1673],{"type":48,"value":1674},"LLDB for .NET",{"type":48,"value":780},{"type":42,"tag":1022,"props":1677,"children":1679},{"id":1678},"nativeaot-crashes",[1680],{"type":48,"value":1681},"NativeAOT crashes",{"type":42,"tag":51,"props":1683,"children":1684},{},[1685,1687,1692,1694,1699],{"type":48,"value":1686},"The CI job name will contain \"NativeAOT\" (e.g., \"osx-arm64 Release NativeAOT_Libraries\").\nSOS does not work with NativeAOT. Use ",{"type":42,"tag":93,"props":1688,"children":1690},{"className":1689},[],[1691],{"type":48,"value":244},{"type":48,"value":1693}," or ",{"type":42,"tag":93,"props":1695,"children":1697},{"className":1696},[],[1698],{"type":48,"value":1149},{"type":48,"value":1700}," directly.",{"type":42,"tag":57,"props":1702,"children":1704},{"id":1703},"after-loading-the-dump",[1705],{"type":48,"value":1706},"After Loading the Dump",{"type":42,"tag":51,"props":1708,"children":1709},{},[1710],{"type":42,"tag":119,"props":1711,"children":1712},{},[1713],{"type":48,"value":1714},"Always include the following in your report to the user:",{"type":42,"tag":64,"props":1716,"children":1717},{},[1718,1730,1749,1760,1779],{"type":42,"tag":68,"props":1719,"children":1720},{},[1721,1723,1728],{"type":48,"value":1722},"A ",{"type":42,"tag":119,"props":1724,"children":1725},{},[1726],{"type":48,"value":1727},"link to the PR or build",{"type":48,"value":1729}," that was analyzed",{"type":42,"tag":68,"props":1731,"children":1732},{},[1733,1735,1740,1742,1747],{"type":48,"value":1734},"The ",{"type":42,"tag":119,"props":1736,"children":1737},{},[1738],{"type":48,"value":1739},"exit code",{"type":48,"value":1741}," and its meaning (e.g., ",{"type":42,"tag":93,"props":1743,"children":1745},{"className":1744},[],[1746],{"type":48,"value":520},{"type":48,"value":1748}," = access violation)",{"type":42,"tag":68,"props":1750,"children":1751},{},[1752,1753,1758],{"type":48,"value":1734},{"type":42,"tag":119,"props":1754,"children":1755},{},[1756],{"type":48,"value":1757},"crashing thread's call stack",{"type":48,"value":1759}," (and any other relevant threads), with symbols resolved\nas far as possible — this is the most important output",{"type":42,"tag":68,"props":1761,"children":1762},{},[1763,1765,1770,1772,1777],{"type":48,"value":1764},"Any ",{"type":42,"tag":119,"props":1766,"children":1767},{},[1768],{"type":48,"value":1769},"managed exception",{"type":48,"value":1771}," type, message, and inner exception stack (use ",{"type":42,"tag":93,"props":1773,"children":1775},{"className":1774},[],[1776],{"type":48,"value":1333},{"type":48,"value":1778},") if different\nfrom the native crash stack",{"type":42,"tag":68,"props":1780,"children":1781},{},[1782,1787],{"type":42,"tag":119,"props":1783,"children":1784},{},[1785],{"type":48,"value":1786},"Links to existing issues",{"type":48,"value":1788}," that match this crash — search the repo for open issues (and\nalso closed issues) with matching crash signatures, stack frames, or error messages. If\nfound, link them so the user can see prior context and whether this is a known problem.",{"type":42,"tag":51,"props":1790,"children":1791},{},[1792],{"type":48,"value":1793},"Without these the user cannot verify your interpretation or dig deeper.",{"type":42,"tag":51,"props":1795,"children":1796},{},[1797,1799,1805],{"type":48,"value":1798},"Use the backtrace, exception info, heap state, etc. together with the PR's code changes to\nunderstand ",{"type":42,"tag":1800,"props":1801,"children":1802},"em",{},[1803],{"type":48,"value":1804},"why",{"type":48,"value":1806}," the crash happened. Correlate the crash location with what was changed — a\ncrash in code touched by the PR is likely caused by it; a crash elsewhere may be pre-existing\nor a side effect.",{"type":42,"tag":51,"props":1808,"children":1809},{},[1810,1812,1818,1820,1826],{"type":48,"value":1811},"If the crash is in a native binary not part of the PR, report its version metadata\n(",{"type":42,"tag":93,"props":1813,"children":1815},{"className":1814},[],[1816],{"type":48,"value":1817},"lm v m \u003Cmodule>",{"type":48,"value":1819}," in cdb, ",{"type":42,"tag":93,"props":1821,"children":1823},{"className":1822},[],[1824],{"type":48,"value":1825},"image list \u003Cmodule>",{"type":48,"value":1827}," in lldb) — the version helps identify\nwhich build or package introduced it.",{"type":42,"tag":51,"props":1829,"children":1830},{},[1831],{"type":48,"value":1832},"Use your judgement and knowledge of the codebase to form a diagnosis and suggest a fix.",{"type":42,"tag":57,"props":1834,"children":1836},{"id":1835},"common-pitfalls",[1837],{"type":48,"value":1838},"Common Pitfalls",{"type":42,"tag":64,"props":1840,"children":1841},{},[1842,1852,1862,1891,1901,1911],{"type":42,"tag":68,"props":1843,"children":1844},{},[1845,1850],{"type":42,"tag":119,"props":1846,"children":1847},{},[1848],{"type":48,"value":1849},"Helix artifacts expire after 20 days.",{"type":48,"value":1851}," If downloads fail with 404, the artifacts have likely expired — tell the user.",{"type":42,"tag":68,"props":1853,"children":1854},{},[1855,1860],{"type":42,"tag":119,"props":1856,"children":1857},{},[1858],{"type":48,"value":1859},"AzDO builds also expire",{"type":48,"value":1861}," due to retention policies. If a build returns \"not found\", try a more recent build. When multiple builds are listed (e.g., in an issue), start with the newest.",{"type":42,"tag":68,"props":1863,"children":1864},{},[1865,1875,1877,1882,1884,1889],{"type":42,"tag":119,"props":1866,"children":1867},{},[1868,1873],{"type":42,"tag":93,"props":1869,"children":1871},{"className":1870},[],[1872],{"type":48,"value":701},{"type":48,"value":1874}," only handles managed state.",{"type":48,"value":1876}," For native crashes, use ",{"type":42,"tag":93,"props":1878,"children":1880},{"className":1879},[],[1881],{"type":48,"value":244},{"type":48,"value":1883},"\u002F",{"type":42,"tag":93,"props":1885,"children":1887},{"className":1886},[],[1888],{"type":48,"value":1149},{"type":48,"value":1890}," on matching OS.",{"type":42,"tag":68,"props":1892,"children":1893},{},[1894,1899],{"type":42,"tag":119,"props":1895,"children":1896},{},[1897],{"type":48,"value":1898},"32-bit dumps on 64-bit OS:",{"type":48,"value":1900}," Use 32-bit dotnet SDK to install dotnet-dump.",{"type":42,"tag":68,"props":1902,"children":1903},{},[1904,1909],{"type":42,"tag":119,"props":1905,"children":1906},{},[1907],{"type":48,"value":1908},"Mobile\u002FWASM dumps",{"type":48,"value":1910}," are not covered — report the dump location and hand off.",{"type":42,"tag":68,"props":1912,"children":1913},{},[1914,1919,1920,1925],{"type":42,"tag":119,"props":1915,"children":1916},{},[1917],{"type":48,"value":1918},"Internal jobs",{"type":48,"value":483},{"type":42,"tag":93,"props":1921,"children":1923},{"className":1922},[],[1924],{"type":48,"value":799},{"type":48,"value":1926}," org) require auth the agent doesn't have — report and hand off.",{"type":42,"tag":57,"props":1928,"children":1930},{"id":1929},"further-reading",[1931],{"type":48,"value":1932},"Further Reading",{"type":42,"tag":64,"props":1934,"children":1935},{},[1936,1945,1954],{"type":42,"tag":68,"props":1937,"children":1938},{},[1939],{"type":42,"tag":763,"props":1940,"children":1943},{"href":1941,"rel":1942},"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fcore\u002Fdiagnostics\u002Fdotnet-dump",[767],[1944],{"type":48,"value":701},{"type":42,"tag":68,"props":1946,"children":1947},{},[1948],{"type":42,"tag":763,"props":1949,"children":1951},{"href":1346,"rel":1950},[767],[1952],{"type":48,"value":1953},"SOS debugging extension",{"type":42,"tag":68,"props":1955,"children":1956},{},[1957],{"type":42,"tag":763,"props":1958,"children":1961},{"href":1959,"rel":1960},"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fdiagnostics\u002Fblob\u002Fmain\u002Fdocumentation\u002Fdebugging-coredump.md",[767],[1962],{"type":48,"value":1963},"Debugging .NET core dumps",{"type":42,"tag":1965,"props":1966,"children":1967},"style",{},[1968],{"type":48,"value":1969},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1971,"total":25},[1972,1989,2002,2014,2021,2038,2048],{"slug":1973,"name":1973,"fn":1974,"description":1975,"org":1976,"tags":1977,"stars":25,"repoUrl":26,"updatedAt":1988},"binskim-analysis","investigate BinSkim SDL security findings","Investigate BinSkim SDL findings from official pipelines — understand Guardian filtering, compare raw vs merged SARIF, decode portal results, and determine fix ownership. Use when asked about SDL scan results, portal findings, Guardian filtering, rule meanings, or discrepancies between local and official results. Also use when asked \"why does the portal show X\", \"what's filtered\", \"explain Guardian\", \"investigate SDL findings\", \"portal BA2008\", \"binskim failures in pipeline\", or \"what rules are required\". DO NOT USE FOR: running BinSkim locally (use binskim-scan), source code analysis (use CodeQL), or credential scanning (use CredScan).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1978,1979,1982,1985],{"name":13,"slug":14,"type":15},{"name":1980,"slug":1981,"type":15},"Audit","audit",{"name":1983,"slug":1984,"type":15},"Code Analysis","code-analysis",{"name":1986,"slug":1987,"type":15},"Security","security","2026-07-12T08:23:11.212231",{"slug":1990,"name":1990,"fn":1991,"description":1992,"org":1993,"tags":1994,"stars":25,"repoUrl":26,"updatedAt":2001},"binskim-scan","run BinSkim binary security analysis","Run BinSkim binary security analysis locally against a dotnet repository. Use when asked to scan binaries, check BinSkim compliance, verify a fix for a rule violation, or run a local SDL scan. Also use when asked \"run binskim\", \"binary security scan\", \"scan binaries\", \"check binskim\", \"verify my fix\", \"repro BA2008 locally\", or \"verify BA2008 fix\". DO NOT USE FOR: investigating official pipeline results or portal findings (use binskim-analysis), source code analysis (use CodeQL), credential scanning (use CredScan), or general build\u002Ftest failures (use ci-analysis).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1995,1996,1999,2000],{"name":13,"slug":14,"type":15},{"name":1997,"slug":1998,"type":15},"CLI","cli",{"name":1983,"slug":1984,"type":15},{"name":1986,"slug":1987,"type":15},"2026-07-12T08:23:09.911458",{"slug":98,"name":98,"fn":2003,"description":2004,"org":2005,"tags":2006,"stars":25,"repoUrl":26,"updatedAt":2013},"analyze .NET CI build and test status","Analyze CI build and test status from Azure DevOps and Helix for dotnet repository PRs. Use when checking CI status, investigating failures, determining if a PR is ready to merge, or given URLs containing dev.azure.com or helix.dot.net. Also use when asked \"why is CI red\", \"test failures\", \"retry CI\", \"rerun tests\", \"is CI green\", \"build failed\", \"checks failing\", or \"flaky tests\". DO NOT USE FOR: investigating stale codeflow PRs or dependency update health, tracing whether a commit has flowed from one repo to another, reviewing code changes for correctness or style.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2007,2008,2011,2012],{"name":13,"slug":14,"type":15},{"name":2009,"slug":2010,"type":15},"Azure","azure",{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},"2026-07-12T08:21:49.360882",{"slug":4,"name":4,"fn":5,"description":6,"org":2015,"tags":2016,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2017,2018,2019,2020],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},{"slug":2022,"name":2022,"fn":2023,"description":2024,"org":2025,"tags":2026,"stars":25,"repoUrl":26,"updatedAt":2037},"flow-analysis","analyze VMR codeflow health","Analyze VMR codeflow health using maestro MCP tools and GitHub MCP tools. USE FOR: investigating stale codeflow PRs, checking if fixes have flowed through the VMR pipeline, debugging dependency update issues, checking overall flow status for a repo, diagnosing why backflow PRs are missing or blocked, subscription health, build freshness, URLs containing dotnet-maestro or \"Source code updates from dotnet\u002Fdotnet\". DO NOT USE FOR: CI build failures (use ci-analysis skill), code review (use code-review skill), general PR investigation without codeflow context, tracing whether a specific commit\u002FPR has reached another repo (use flow-tracing skill). INVOKES: maestro and GitHub MCP tools, flow-health.cs script.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2027,2028,2031,2034],{"name":17,"slug":18,"type":15},{"name":2029,"slug":2030,"type":15},"Engineering","engineering",{"name":2032,"slug":2033,"type":15},"GitHub","github",{"name":2035,"slug":2036,"type":15},"MCP","mcp","2026-07-12T08:21:53.151866",{"slug":2039,"name":2039,"fn":2040,"description":2041,"org":2042,"tags":2043,"stars":25,"repoUrl":26,"updatedAt":2047},"flow-tracing","trace .NET dependency flow in VMR","Trace dependency flow across .NET repos through the VMR pipeline. USE FOR: checking if a PR\u002Fcommit from repo A has reached repo B, finding what runtime SHA is in an SDK build, tracing dependency versions through the VMR, checking if a commit is included in an SDK build, decoding SDK version strings, \"has my fix reached runtime\", \"did roslyn#80873 flow to runtime\", \"what SHA is in SDK version X\", cross-repo dependency tracing, mapping SDK versions to VMR commits. DO NOT USE FOR: codeflow PR health or staleness (use flow-analysis skill), CI build failures (use ci-analysis skill). INVOKES: maestro and GitHub MCP tools, Get-SdkVersionTrace.ps1 script.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2044],{"name":2045,"slug":2046,"type":15},"Data Pipeline","data-pipeline","2026-07-12T08:21:55.689056",{"slug":2049,"name":2049,"fn":2050,"description":2051,"org":2052,"tags":2053,"stars":25,"repoUrl":26,"updatedAt":2057},"helix-investigation","investigate Helix test failures","Deep-dive investigation of Helix test failures starting from AzDO build legs. USE FOR: investigating recurring Helix test failures, downloading and analyzing Helix console logs, comparing passing vs failing runs, identifying machine-specific issues, XHarness timeout analysis, Android emulator DEVICE_NOT_FOUND errors, bulk failure aggregation across legs, \"why does this test fail on some machines\", \"top 5 failing tests in the last 2 days\", \"download helix logs for build X\", \"compare passing and failing helix runs\", \"what are the most common failures\". DO NOT USE FOR: high-level CI status checks (use ci-analysis), codeflow PRs (use flow-analysis). INVOKES: Helix and AzDO MCP tools, curl, gh CLI.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2054,2055,2056],{"name":23,"slug":24,"type":15},{"name":2029,"slug":2030,"type":15},{"name":20,"slug":21,"type":15},"2026-07-12T08:21:46.445586",{"items":2059,"total":2217},[2060,2074,2087,2102,2119,2131,2151,2161,2173,2183,2196,2207],{"slug":2061,"name":2061,"fn":2062,"description":2063,"org":2064,"tags":2065,"stars":2071,"repoUrl":2072,"updatedAt":2073},"multithreaded-task-migration","migrate MSBuild tasks to multithreaded mode","Guide for migrating MSBuild tasks to multithreaded mode support, including compatibility red-team review. Use this when converting tasks to thread-safe versions, implementing IMultiThreadableTask, adding TaskEnvironment support, or auditing migrations for behavioral compatibility.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2066,2067,2068],{"name":13,"slug":14,"type":15},{"name":2029,"slug":2030,"type":15},{"name":2069,"slug":2070,"type":15},"Performance","performance",5535,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fmsbuild","2026-07-22T05:37:33.965588",{"slug":2075,"name":2075,"fn":2076,"description":2077,"org":2078,"tags":2079,"stars":2084,"repoUrl":2085,"updatedAt":2086},"analyzing-dotnet-performance","analyze .NET code for performance anti-patterns","Scans .NET code for ~50 performance anti-patterns across async, memory, strings, collections, LINQ, regex, serialization, and I\u002FO with tiered severity classification. Use when analyzing .NET code for optimization opportunities, reviewing hot paths, or auditing allocation-heavy patterns.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2080,2081,2082,2083],{"name":13,"slug":14,"type":15},{"name":1983,"slug":1984,"type":15},{"name":23,"slug":24,"type":15},{"name":2069,"slug":2070,"type":15},4576,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills","2026-07-12T08:23:25.400375",{"slug":2088,"name":2088,"fn":2089,"description":2090,"org":2091,"tags":2092,"stars":2084,"repoUrl":2085,"updatedAt":2101},"android-tombstone-symbolication","symbolicate .NET runtime frames in Android tombstones","Symbolicate the .NET runtime frames in an Android tombstone file. Extracts BuildIds and PC offsets from the native backtrace, downloads debug symbols from the Microsoft symbol server, and runs llvm-symbolizer to produce function names with source file and line numbers. USE FOR triaging a .NET MAUI or Mono Android app crash from a tombstone, resolving native backtrace frames in libmonosgen-2.0.so or libcoreclr.so to .NET runtime source code, or investigating SIGABRT, SIGSEGV, or other native signals originating from the .NET runtime on Android. DO NOT USE FOR pure Java\u002FKotlin crashes, managed .NET exceptions that are already captured in logcat, or iOS crash logs. INVOKES Symbolicate-Tombstone.ps1 script, llvm-symbolizer, Microsoft symbol server.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2093,2094,2097,2098],{"name":13,"slug":14,"type":15},{"name":2095,"slug":2096,"type":15},"Android","android",{"name":23,"slug":24,"type":15},{"name":2099,"slug":2100,"type":15},"Microsoft","microsoft","2026-07-12T08:23:21.595572",{"slug":2103,"name":2103,"fn":2104,"description":2105,"org":2106,"tags":2107,"stars":2084,"repoUrl":2085,"updatedAt":2118},"apple-crash-symbolication","symbolicate .NET runtime frames in crash logs","Symbolicate .NET runtime frames in Apple platform .ips crash logs (iOS, tvOS, Mac Catalyst, macOS). Extracts UUIDs and addresses from the native backtrace, locates dSYM debug symbols, and runs atos to produce function names with source file and line numbers. Automatically downloads .dwarf symbols from the Microsoft symbol server using Mach-O UUIDs. USE FOR triaging a .NET MAUI or Mono app crash from an .ips file on any Apple platform, resolving native backtrace frames in libcoreclr or libmonosgen-2.0 to .NET runtime source code, retrieving .ips crash logs from a connected iOS device or iPhone, or investigating EXC_CRASH, EXC_BAD_ACCESS, SIGABRT, or SIGSEGV originating from the .NET runtime. DO NOT USE FOR pure Swift\u002FObjective-C crashes with no .NET components, or Android tombstone files. INVOKES Symbolicate-Crash.ps1 script, atos, dwarfdump, idevicecrashreport.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2108,2109,2110,2113,2115],{"name":13,"slug":14,"type":15},{"name":23,"slug":24,"type":15},{"name":2111,"slug":2112,"type":15},"iOS","ios",{"name":1167,"slug":2114,"type":15},"macos",{"name":2116,"slug":2117,"type":15},"Observability","observability","2026-07-12T08:23:20.369986",{"slug":2120,"name":2120,"fn":2121,"description":2122,"org":2123,"tags":2124,"stars":2084,"repoUrl":2085,"updatedAt":2130},"assertion-quality","evaluate assertion quality in test suites","Analyzes the variety and depth of assertions across test suites in any language. Use when the user asks to evaluate assertion quality, find shallow tests, identify assertion-free tests (no assertions or only trivial ones like Assert.IsNotNull \u002F toBeTruthy()), flag self-referential or tautological assertions, measure assertion diversity, or audit whether tests verify different facets of behavior. Polyglot: .NET, Python, TS\u002FJS, Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell, C++. DO NOT USE FOR: writing new tests (use code-testing-agent \u002F writing-mstest-tests), mutation reasoning about whether tests would catch a bug (use test-gap-analysis), or a general severity-ranked anti-pattern audit (use test-anti-patterns), fixing or rewriting assertions, or writing, fixing, or modernizing MSTest tests, assertions, or attributes (use writing-mstest-tests).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2125,2126,2129],{"name":1983,"slug":1984,"type":15},{"name":2127,"slug":2128,"type":15},"QA","qa",{"name":20,"slug":21,"type":15},"2026-07-12T08:23:51.277743",{"slug":2132,"name":2132,"fn":2133,"description":2134,"org":2135,"tags":2136,"stars":2084,"repoUrl":2085,"updatedAt":2150},"author-component","create and review Blazor components","Create or review Blazor components (.razor files) with correct architecture. USE FOR: writing new Blazor components that do NOT involve JavaScript interop, implementing parameters and EventCallback, RenderFragment slots, component lifecycle (OnInitializedAsync, OnParametersSet), async patterns, IAsyncDisposable, CancellationToken, CSS isolation, code-behind. DO NOT USE FOR: creating new projects (use create-blazor-project), JavaScript interop or calling browser APIs from Blazor (use use-js-interop), forms and validation (use collect-user-input), prerendering issues (use support-prerendering), HTTP data fetching patterns (use fetch-and-send-data), coordinating state between unrelated components (use coordinate-components).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2137,2138,2141,2144,2147],{"name":13,"slug":14,"type":15},{"name":2139,"slug":2140,"type":15},"Blazor","blazor",{"name":2142,"slug":2143,"type":15},"C#","csharp",{"name":2145,"slug":2146,"type":15},"UI Components","ui-components",{"name":2148,"slug":2149,"type":15},"Web Development","web-development","2026-07-15T06:03:29.216359",{"slug":2152,"name":2152,"fn":2153,"description":2154,"org":2155,"tags":2156,"stars":2084,"repoUrl":2085,"updatedAt":2160},"binlog-failure-analysis","analyze MSBuild binary logs","Analyze MSBuild binary logs to diagnose build failures. USE FOR: build errors that are unclear from console output, diagnosing cascading failures across multi-project builds, tracing MSBuild target execution order, and generally any MSBuild build issues. Requires an existing .binlog file. DO NOT USE FOR: generating binlogs (use binlog-generation), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2157,2158,2159],{"name":1983,"slug":1984,"type":15},{"name":23,"slug":24,"type":15},{"name":2099,"slug":2100,"type":15},"2026-07-12T08:21:34.637923",{"slug":2162,"name":2162,"fn":2163,"description":2164,"org":2165,"tags":2166,"stars":2084,"repoUrl":2085,"updatedAt":2172},"binlog-generation","generate MSBuild binary logs for diagnostics","Generate MSBuild binary logs (binlogs) for build diagnostics and analysis. USE FOR: adding \u002Fbl:{} to any dotnet build, test, pack, publish, or restore command to capture a full build execution trace, prerequisite for binlog-failure-analysis and build-perf-diagnostics skills, enabling post-build investigation of errors or performance. Requires MSBuild 17.8+ \u002F .NET 8 SDK+ for {} placeholder; PowerShell needs -bl:{{}}. DO NOT USE FOR: non-MSBuild build systems (npm, Maven, CMake), analyzing an existing binlog (use binlog-failure-analysis instead).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2167,2170,2171],{"name":2168,"slug":2169,"type":15},"Build","build",{"name":23,"slug":24,"type":15},{"name":2029,"slug":2030,"type":15},"2026-07-19T05:38:19.340791",{"slug":2174,"name":2174,"fn":2175,"description":2176,"org":2177,"tags":2178,"stars":2084,"repoUrl":2085,"updatedAt":2182},"build-parallelism","optimize MSBuild build parallelism","Diagnose and fix under-parallelized MSBuild builds. USE WHEN a multi-project solution build is slower than expected, doesn't speed up when you add cores, pegs a single core while others idle, or you want to know why `-m` isn't helping. Note: `\u002Fmaxcpucount` default is 1 (sequential) — always pass `-m` for parallel builds. Covers finding the critical path (longest serial ProjectReference chain), graph build (`\u002Fgraph`), BuildInParallel, and solution filters (`.slnf`). DO NOT USE FOR: single-project builds, incremental issues (use incremental-build), compilation slowness inside one project (use build-perf-diagnostics), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2179,2180,2181],{"name":13,"slug":14,"type":15},{"name":2029,"slug":2030,"type":15},{"name":2069,"slug":2070,"type":15},"2026-07-19T05:38:18.364937",{"slug":2184,"name":2184,"fn":2185,"description":2186,"org":2187,"tags":2188,"stars":2084,"repoUrl":2085,"updatedAt":2195},"build-perf-baseline","establish and optimize build performance baselines","Establish build performance baselines and apply systematic optimization techniques. USE FOR: diagnosing slow builds, establishing before\u002Fafter measurements (cold, warm, no-op scenarios), applying optimization strategies like MSBuild Server, static graph builds, artifacts output, and dependency graph trimming. Start here before diving into build-perf-diagnostics, incremental-build, or build-parallelism. DO NOT USE FOR: non-MSBuild build systems, detailed bottleneck analysis (use build-perf-diagnostics after baselining).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2189,2190,2193,2194],{"name":2029,"slug":2030,"type":15},{"name":2191,"slug":2192,"type":15},"Monitoring","monitoring",{"name":2069,"slug":2070,"type":15},{"name":20,"slug":21,"type":15},"2026-07-12T08:21:35.865649",{"slug":2197,"name":2197,"fn":2198,"description":2199,"org":2200,"tags":2201,"stars":2084,"repoUrl":2085,"updatedAt":2206},"build-perf-diagnostics","diagnose MSBuild build performance bottlenecks","Diagnose MSBuild build performance bottlenecks using binary log analysis. USE FOR: identifying why builds are slow by analyzing binlog performance summaries, detecting ResolveAssemblyReference (RAR) taking >5s, Roslyn analyzers consuming >30% of Csc time, single targets dominating >50% of build time, node utilization below 80%, excessive Copy tasks, NuGet restore running every build. Covers timeline analysis, Target\u002FTask Performance Summary interpretation, and 7 common bottleneck categories. Use after build-perf-baseline has established measurements. DO NOT USE FOR: establishing initial baselines (use build-perf-baseline first), fixing incremental build issues (use incremental-build), parallelism tuning (use build-parallelism), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2202,2203,2204,2205],{"name":13,"slug":14,"type":15},{"name":23,"slug":24,"type":15},{"name":2029,"slug":2030,"type":15},{"name":2069,"slug":2070,"type":15},"2026-07-12T08:21:40.961722",{"slug":2208,"name":2208,"fn":2209,"description":2210,"org":2211,"tags":2212,"stars":2084,"repoUrl":2085,"updatedAt":2216},"check-bin-obj-clash","detect MSBuild output path conflicts","Detects MSBuild projects with conflicting OutputPath or IntermediateOutputPath. USE FOR: builds failing with 'Cannot create a file when that file already exists', 'The process cannot access the file because it is being used by another process', intermittent build failures that succeed on retry, or missing\u002Foverwritten outputs in multi-project or multi-targeting builds where bin\u002Fobj (or project.assets.json) collide. Common causes: shared OutputPath, missing AppendTargetFrameworkToOutputPath, extra global properties (e.g. PublishReadyToRun), or SetTargetFramework on a ProjectReference to a single-targeting project. DO NOT USE FOR: file access errors unrelated to MSBuild (OS-level locking), single-project single-TFM builds, non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2213,2214,2215],{"name":23,"slug":24,"type":15},{"name":2029,"slug":2030,"type":15},{"name":2127,"slug":2128,"type":15},"2026-07-19T05:38:14.336279",144]