[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-dotnet-android-tombstone-symbolication":3,"mdc-qfjzk1-key":37,"related-repo-dotnet-android-tombstone-symbolication":1210,"related-org-dotnet-android-tombstone-symbolication":1311},{"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":32,"sourceUrl":35,"mdContent":36},"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},"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},"Android","android","tag",{"name":17,"slug":18,"type":15},".NET","net",{"name":20,"slug":21,"type":15},"Microsoft","microsoft",{"name":23,"slug":24,"type":15},"Debugging","debugging",4576,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills","2026-07-12T08:23:21.595572","MIT",332,[31],"agent-skills",{"repoUrl":26,"stars":25,"forks":29,"topics":33,"description":34},[31],"Repository for skills to assist AI coding agents with .NET and C#","https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills\u002Ftree\u002FHEAD\u002Fplugins\u002Fdotnet-diag\u002Fskills\u002Fandroid-tombstone-symbolication","---\nname: android-tombstone-symbolication\ndescription: 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.\nlicense: MIT\n---\n\n# Android Tombstone .NET Symbolication\n\nResolves native backtrace frames from .NET Android app crashes (MAUI, Xamarin, Mono) to function names, source files, and line numbers using ELF BuildIds and Microsoft's symbol server.\n\n**Inputs:** Tombstone file or logcat crash output, `llvm-symbolizer` (from Android NDK or any LLVM 14+ toolchain), internet access for symbol downloads.\n\n**Do not use when:** The crash is a managed .NET exception (visible in logcat with a managed stack trace), the crashing library is not a .NET component (e.g., `libart.so`), or the tombstone is from iOS.\n\n---\n\n## Workflow\n\n### Step 1: Parse the Tombstone Backtrace\n\nEach backtrace frame has this format:\n\n```\n#NN pc OFFSET  \u002Fpath\u002Fto\u002Flibrary.so (optional_symbol+0xNN) (BuildId: HEXSTRING)\n```\n\nExtract: **frame number**, **PC offset** (hex, already library-relative), **library name**, and **BuildId** (32–40 hex chars).\n\nSymbolicate all threads by default (background threads like GC\u002Ffinalizer often have useful .NET frames). The crashing thread's backtrace is listed first; additional threads appear after `--- --- ---` markers.\n\n**Format notes:**\n- The script auto-detects `#NN pc` frame lines with or without a `backtrace:` header, and strips logcat timestamp\u002Ftag prefixes automatically.\n- Logcat-captured tombstones often omit BuildIds. Recover via `adb shell readelf -n`, CI build artifacts, or the .NET runtime NuGet package.\n- GitHub issue pastes may mangle `#1 pc` into issue links — replace `org\u002Frepo#N pc` with `#N pc` before saving to a file.\n- If the script fails to parse a format, fall back to manual extraction of `#NN pc OFFSET library.so (BuildId: HEX)` tuples.\n\n### Step 2: Identify .NET Runtime Libraries\n\nFilter frames to .NET runtime libraries:\n\n| Library | Runtime |\n|---------|---------|\n| `libmonosgen-2.0.so` | Mono (MAUI, Xamarin, interpreter) |\n| `libcoreclr.so` | CoreCLR (JIT mode) |\n| `libSystem.*.so` | .NET BCL native components (`Native`, `Globalization.Native`, `IO.Compression.Native`, `Security.Cryptography.Native.OpenSsl`, `Net.Security.Native`) |\n\n**NativeAOT:** No `libcoreclr.so` or `libmonosgen-2.0.so` — the runtime is statically linked into the app binary (e.g., `libMyApp.so`). The `libSystem.*.so` BCL libraries remain separate and can be symbolicated via the symbol server. For the app binary itself, you need the app's own debug symbols.\n\nSkip `libc.so`, `libart.so`, and other Android system libraries unless the user specifically asks.\n\n### Step 3: Download Debug Symbols\n\nFor each unique .NET BuildId, download debug symbols:\n\n```\nhttps:\u002F\u002Fmsdl.microsoft.com\u002Fdownload\u002Fsymbols\u002F_.debug\u002Felf-buildid-sym-\u003CBUILDID>\u002F_.debug\n```\n\n```bash\ncurl -sL \"https:\u002F\u002Fmsdl.microsoft.com\u002Fdownload\u002Fsymbols\u002F_.debug\u002Felf-buildid-sym-1eb39fc72918c7c6c0c610b79eb3d3d47b2f81be\u002F_.debug\" \\\n  -o libmonosgen-2.0.so.debug\n```\n\nVerify with `file libmonosgen-2.0.so.debug` — should show `ELF 64-bit ... with debug_info, not stripped`. If the download returns 404 or HTML, symbols are not published for that build. Do not add or subtract library base addresses — offsets in tombstones are already library-relative.\n\n### Step 4: Symbolicate Each Frame\n\n```bash\nllvm-symbolizer --obj=libmonosgen-2.0.so.debug -f -C 0x222098\n```\n\nOutput:\n```\nves_icall_System_Environment_FailFast\n\u002F__w\u002F1\u002Fs\u002Fsrc\u002Fruntime\u002Fsrc\u002Fmono\u002Fmono\u002Fmetadata\u002Ficall.c:6244\n```\n\nThe `\u002F__w\u002F1\u002Fs\u002F` prefix is the CI workspace root — the meaningful path starts at `src\u002Fruntime\u002F`, mapping to [dotnet\u002Fdotnet](https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fdotnet) VMR.\n\n### Step 5: Present the Symbolicated Backtrace\n\nCombine original frame numbers with resolved function names and source locations:\n\n```\n#00  libc.so              abort+164\n#01  libmonosgen-2.0.so   ves_icall_System_Environment_FailFast        (mono\u002Fmetadata\u002Ficall.c:6244)\n#02  libmonosgen-2.0.so   do_icall                                     (mono\u002Fmini\u002Finterp.c:2457)\n#03  libmonosgen-2.0.so   mono_interp_exec_method                      (mono\u002Fmini\u002Finterp.c)\n```\n\nFor unresolved frames (`??`), keep the original line with BuildId and PC offset.\n\n### Automation Script\n\n[scripts\u002FSymbolicate-Tombstone.ps1](scripts\u002FSymbolicate-Tombstone.ps1) automates the full workflow:\n\n```powershell\npwsh scripts\u002FSymbolicate-Tombstone.ps1 -TombstoneFile tombstone_01.txt -LlvmSymbolizer llvm-symbolizer\n```\n\nFlags: `-CrashingThreadOnly` (limit to crashing thread), `-OutputFile path` (write to file), `-ParseOnly` (report libraries\u002FBuildIds\u002FURLs without downloading), `-SkipVersionLookup` (skip runtime version identification).\n\n---\n\n## Finding llvm-symbolizer\n\nCheck the **Android NDK** first: `$ANDROID_NDK_ROOT\u002Ftoolchains\u002Fllvm\u002Fprebuilt\u002F*\u002Fbin\u002Fllvm-symbolizer` or `$ANDROID_HOME\u002Fndk\u002F*\u002Ftoolchains\u002Fllvm\u002Fprebuilt\u002F*\u002Fbin\u002Fllvm-symbolizer`. Also available via `brew install llvm`, `apt install llvm`, or `xcrun --find llvm-symbolizer` on macOS.\n\nIf unavailable, complete steps 1–3 and present the download commands and `llvm-symbolizer` commands for the user to run. Do not spend time installing LLVM.\n\n---\n\n## Understanding the Output\n\nCI source paths use these prefixes:\n\n| Path prefix | Maps to |\n|---|---|\n| `\u002F__w\u002F1\u002Fs\u002Fsrc\u002Fruntime\u002F` | `src\u002Fruntime\u002F` in [dotnet\u002Fdotnet](https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fdotnet) VMR |\n| `\u002F__w\u002F1\u002Fs\u002Fsrc\u002Fmono\u002F` | `src\u002Fmono\u002F` in the VMR (older builds) |\n| `\u002F__w\u002F1\u002Fs\u002F` | VMR root |\n\n### Runtime Version Identification\n\nThe script identifies the exact .NET runtime version by matching BuildIds against locally-installed runtime packs. It searches: SDK packs (`$DOTNET_ROOT\u002Fpacks\u002F`), NuGet cache (`~\u002F.nuget\u002Fpackages\u002F`), and NuGet.org as an online fallback. When found, it extracts the version and source commit from the `.nuspec` `\u003Crepository commit=\"...\" \u002F>` element. Pass `-SkipVersionLookup` to disable. Requires `llvm-readelf` (auto-discovered from the NDK).\n\n---\n\n## Validation\n\n1. `file \u003Cdebug-file>` shows `ELF ... with debug_info, not stripped`\n2. At least one .NET frame resolves to a function name (not `??`)\n3. Resolved paths contain recognizable .NET runtime structure (e.g., `mono\u002Fmetadata\u002F`, `mono\u002Fmini\u002F`)\n\n## Stop Signals\n\n- **No .NET frames found**: Report parsed frames and stop.\n- **All frames resolved**: Present symbolicated backtrace. Do not trace into source or attempt to build\u002Fdebug the runtime.\n- **Symbols not available (404)**: One attempt per BuildId, then stop. Report unsymbolicated frames with BuildIds and offsets.\n- **llvm-symbolizer not available**: Use `-ParseOnly`, present manual commands. Do not install LLVM.\n\n## Common Pitfalls\n\n- **Missing BuildIds**: Logcat tombstones often omit BuildIds. Recover via: `adb shell readelf -n \u002Fpath\u002Fto\u002Flib.so`, CI build artifacts, or the runtime NuGet package (`~\u002F.dotnet\u002Fpacks\u002FMicrosoft.NETCore.App.Runtime.Mono.android-arm64\u002F\u003Cversion>\u002F`). Prefer pulling raw tombstone files (`adb shell cat \u002Fdata\u002Ftombstones\u002Ftombstone_XX`) which always include BuildIds.\n- **Symbols not found (404)**: Pre-release\u002Finternal builds may not publish symbols. Check for local unstripped `.so`\u002F`.so.dbg` in build artifacts or the NuGet runtime pack.\n- **NativeAOT**: No runtime `.so` in the tombstone — runtime is in the app binary. `libSystem.*.so` BCL libraries still work with the symbol server; the app binary needs its own debug symbols.\n- **Wrong llvm-symbolizer version**: Use LLVM 14+ for best DWARF compatibility.\n- **Multiple BuildIds**: Each .NET library has its own BuildId — download symbols for each separately.\n",{"data":38,"body":39},{"name":4,"description":6,"license":28},{"type":40,"children":41},"root",[42,51,57,77,95,99,106,113,118,130,163,176,184,265,271,276,391,430,449,455,460,469,532,553,559,594,599,608,640,646,651,660,673,679,689,705,742,745,751,801,813,816,822,827,917,923,975,978,984,1035,1041,1091,1097,1204],{"type":43,"tag":44,"props":45,"children":47},"element","h1",{"id":46},"android-tombstone-net-symbolication",[48],{"type":49,"value":50},"text","Android Tombstone .NET Symbolication",{"type":43,"tag":52,"props":53,"children":54},"p",{},[55],{"type":49,"value":56},"Resolves native backtrace frames from .NET Android app crashes (MAUI, Xamarin, Mono) to function names, source files, and line numbers using ELF BuildIds and Microsoft's symbol server.",{"type":43,"tag":52,"props":58,"children":59},{},[60,66,68,75],{"type":43,"tag":61,"props":62,"children":63},"strong",{},[64],{"type":49,"value":65},"Inputs:",{"type":49,"value":67}," Tombstone file or logcat crash output, ",{"type":43,"tag":69,"props":70,"children":72},"code",{"className":71},[],[73],{"type":49,"value":74},"llvm-symbolizer",{"type":49,"value":76}," (from Android NDK or any LLVM 14+ toolchain), internet access for symbol downloads.",{"type":43,"tag":52,"props":78,"children":79},{},[80,85,87,93],{"type":43,"tag":61,"props":81,"children":82},{},[83],{"type":49,"value":84},"Do not use when:",{"type":49,"value":86}," The crash is a managed .NET exception (visible in logcat with a managed stack trace), the crashing library is not a .NET component (e.g., ",{"type":43,"tag":69,"props":88,"children":90},{"className":89},[],[91],{"type":49,"value":92},"libart.so",{"type":49,"value":94},"), or the tombstone is from iOS.",{"type":43,"tag":96,"props":97,"children":98},"hr",{},[],{"type":43,"tag":100,"props":101,"children":103},"h2",{"id":102},"workflow",[104],{"type":49,"value":105},"Workflow",{"type":43,"tag":107,"props":108,"children":110},"h3",{"id":109},"step-1-parse-the-tombstone-backtrace",[111],{"type":49,"value":112},"Step 1: Parse the Tombstone Backtrace",{"type":43,"tag":52,"props":114,"children":115},{},[116],{"type":49,"value":117},"Each backtrace frame has this format:",{"type":43,"tag":119,"props":120,"children":124},"pre",{"className":121,"code":123,"language":49},[122],"language-text","#NN pc OFFSET  \u002Fpath\u002Fto\u002Flibrary.so (optional_symbol+0xNN) (BuildId: HEXSTRING)\n",[125],{"type":43,"tag":69,"props":126,"children":128},{"__ignoreMap":127},"",[129],{"type":49,"value":123},{"type":43,"tag":52,"props":131,"children":132},{},[133,135,140,142,147,149,154,156,161],{"type":49,"value":134},"Extract: ",{"type":43,"tag":61,"props":136,"children":137},{},[138],{"type":49,"value":139},"frame number",{"type":49,"value":141},", ",{"type":43,"tag":61,"props":143,"children":144},{},[145],{"type":49,"value":146},"PC offset",{"type":49,"value":148}," (hex, already library-relative), ",{"type":43,"tag":61,"props":150,"children":151},{},[152],{"type":49,"value":153},"library name",{"type":49,"value":155},", and ",{"type":43,"tag":61,"props":157,"children":158},{},[159],{"type":49,"value":160},"BuildId",{"type":49,"value":162}," (32–40 hex chars).",{"type":43,"tag":52,"props":164,"children":165},{},[166,168,174],{"type":49,"value":167},"Symbolicate all threads by default (background threads like GC\u002Ffinalizer often have useful .NET frames). The crashing thread's backtrace is listed first; additional threads appear after ",{"type":43,"tag":69,"props":169,"children":171},{"className":170},[],[172],{"type":49,"value":173},"--- --- ---",{"type":49,"value":175}," markers.",{"type":43,"tag":52,"props":177,"children":178},{},[179],{"type":43,"tag":61,"props":180,"children":181},{},[182],{"type":49,"value":183},"Format notes:",{"type":43,"tag":185,"props":186,"children":187},"ul",{},[188,210,223,252],{"type":43,"tag":189,"props":190,"children":191},"li",{},[192,194,200,202,208],{"type":49,"value":193},"The script auto-detects ",{"type":43,"tag":69,"props":195,"children":197},{"className":196},[],[198],{"type":49,"value":199},"#NN pc",{"type":49,"value":201}," frame lines with or without a ",{"type":43,"tag":69,"props":203,"children":205},{"className":204},[],[206],{"type":49,"value":207},"backtrace:",{"type":49,"value":209}," header, and strips logcat timestamp\u002Ftag prefixes automatically.",{"type":43,"tag":189,"props":211,"children":212},{},[213,215,221],{"type":49,"value":214},"Logcat-captured tombstones often omit BuildIds. Recover via ",{"type":43,"tag":69,"props":216,"children":218},{"className":217},[],[219],{"type":49,"value":220},"adb shell readelf -n",{"type":49,"value":222},", CI build artifacts, or the .NET runtime NuGet package.",{"type":43,"tag":189,"props":224,"children":225},{},[226,228,234,236,242,244,250],{"type":49,"value":227},"GitHub issue pastes may mangle ",{"type":43,"tag":69,"props":229,"children":231},{"className":230},[],[232],{"type":49,"value":233},"#1 pc",{"type":49,"value":235}," into issue links — replace ",{"type":43,"tag":69,"props":237,"children":239},{"className":238},[],[240],{"type":49,"value":241},"org\u002Frepo#N pc",{"type":49,"value":243}," with ",{"type":43,"tag":69,"props":245,"children":247},{"className":246},[],[248],{"type":49,"value":249},"#N pc",{"type":49,"value":251}," before saving to a file.",{"type":43,"tag":189,"props":253,"children":254},{},[255,257,263],{"type":49,"value":256},"If the script fails to parse a format, fall back to manual extraction of ",{"type":43,"tag":69,"props":258,"children":260},{"className":259},[],[261],{"type":49,"value":262},"#NN pc OFFSET library.so (BuildId: HEX)",{"type":49,"value":264}," tuples.",{"type":43,"tag":107,"props":266,"children":268},{"id":267},"step-2-identify-net-runtime-libraries",[269],{"type":49,"value":270},"Step 2: Identify .NET Runtime Libraries",{"type":43,"tag":52,"props":272,"children":273},{},[274],{"type":49,"value":275},"Filter frames to .NET runtime libraries:",{"type":43,"tag":277,"props":278,"children":279},"table",{},[280,299],{"type":43,"tag":281,"props":282,"children":283},"thead",{},[284],{"type":43,"tag":285,"props":286,"children":287},"tr",{},[288,294],{"type":43,"tag":289,"props":290,"children":291},"th",{},[292],{"type":49,"value":293},"Library",{"type":43,"tag":289,"props":295,"children":296},{},[297],{"type":49,"value":298},"Runtime",{"type":43,"tag":300,"props":301,"children":302},"tbody",{},[303,321,338],{"type":43,"tag":285,"props":304,"children":305},{},[306,316],{"type":43,"tag":307,"props":308,"children":309},"td",{},[310],{"type":43,"tag":69,"props":311,"children":313},{"className":312},[],[314],{"type":49,"value":315},"libmonosgen-2.0.so",{"type":43,"tag":307,"props":317,"children":318},{},[319],{"type":49,"value":320},"Mono (MAUI, Xamarin, interpreter)",{"type":43,"tag":285,"props":322,"children":323},{},[324,333],{"type":43,"tag":307,"props":325,"children":326},{},[327],{"type":43,"tag":69,"props":328,"children":330},{"className":329},[],[331],{"type":49,"value":332},"libcoreclr.so",{"type":43,"tag":307,"props":334,"children":335},{},[336],{"type":49,"value":337},"CoreCLR (JIT mode)",{"type":43,"tag":285,"props":339,"children":340},{},[341,350],{"type":43,"tag":307,"props":342,"children":343},{},[344],{"type":43,"tag":69,"props":345,"children":347},{"className":346},[],[348],{"type":49,"value":349},"libSystem.*.so",{"type":43,"tag":307,"props":351,"children":352},{},[353,355,361,362,368,369,375,376,382,383,389],{"type":49,"value":354},".NET BCL native components (",{"type":43,"tag":69,"props":356,"children":358},{"className":357},[],[359],{"type":49,"value":360},"Native",{"type":49,"value":141},{"type":43,"tag":69,"props":363,"children":365},{"className":364},[],[366],{"type":49,"value":367},"Globalization.Native",{"type":49,"value":141},{"type":43,"tag":69,"props":370,"children":372},{"className":371},[],[373],{"type":49,"value":374},"IO.Compression.Native",{"type":49,"value":141},{"type":43,"tag":69,"props":377,"children":379},{"className":378},[],[380],{"type":49,"value":381},"Security.Cryptography.Native.OpenSsl",{"type":49,"value":141},{"type":43,"tag":69,"props":384,"children":386},{"className":385},[],[387],{"type":49,"value":388},"Net.Security.Native",{"type":49,"value":390},")",{"type":43,"tag":52,"props":392,"children":393},{},[394,399,401,406,408,413,415,421,423,428],{"type":43,"tag":61,"props":395,"children":396},{},[397],{"type":49,"value":398},"NativeAOT:",{"type":49,"value":400}," No ",{"type":43,"tag":69,"props":402,"children":404},{"className":403},[],[405],{"type":49,"value":332},{"type":49,"value":407}," or ",{"type":43,"tag":69,"props":409,"children":411},{"className":410},[],[412],{"type":49,"value":315},{"type":49,"value":414}," — the runtime is statically linked into the app binary (e.g., ",{"type":43,"tag":69,"props":416,"children":418},{"className":417},[],[419],{"type":49,"value":420},"libMyApp.so",{"type":49,"value":422},"). The ",{"type":43,"tag":69,"props":424,"children":426},{"className":425},[],[427],{"type":49,"value":349},{"type":49,"value":429}," BCL libraries remain separate and can be symbolicated via the symbol server. For the app binary itself, you need the app's own debug symbols.",{"type":43,"tag":52,"props":431,"children":432},{},[433,435,441,442,447],{"type":49,"value":434},"Skip ",{"type":43,"tag":69,"props":436,"children":438},{"className":437},[],[439],{"type":49,"value":440},"libc.so",{"type":49,"value":141},{"type":43,"tag":69,"props":443,"children":445},{"className":444},[],[446],{"type":49,"value":92},{"type":49,"value":448},", and other Android system libraries unless the user specifically asks.",{"type":43,"tag":107,"props":450,"children":452},{"id":451},"step-3-download-debug-symbols",[453],{"type":49,"value":454},"Step 3: Download Debug Symbols",{"type":43,"tag":52,"props":456,"children":457},{},[458],{"type":49,"value":459},"For each unique .NET BuildId, download debug symbols:",{"type":43,"tag":119,"props":461,"children":464},{"className":462,"code":463,"language":49},[122],"https:\u002F\u002Fmsdl.microsoft.com\u002Fdownload\u002Fsymbols\u002F_.debug\u002Felf-buildid-sym-\u003CBUILDID>\u002F_.debug\n",[465],{"type":43,"tag":69,"props":466,"children":467},{"__ignoreMap":127},[468],{"type":49,"value":463},{"type":43,"tag":119,"props":470,"children":474},{"className":471,"code":472,"language":473,"meta":127,"style":127},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl -sL \"https:\u002F\u002Fmsdl.microsoft.com\u002Fdownload\u002Fsymbols\u002F_.debug\u002Felf-buildid-sym-1eb39fc72918c7c6c0c610b79eb3d3d47b2f81be\u002F_.debug\" \\\n  -o libmonosgen-2.0.so.debug\n","bash",[475],{"type":43,"tag":69,"props":476,"children":477},{"__ignoreMap":127},[478,518],{"type":43,"tag":479,"props":480,"children":483},"span",{"class":481,"line":482},"line",1,[484,490,496,502,507,512],{"type":43,"tag":479,"props":485,"children":487},{"style":486},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[488],{"type":49,"value":489},"curl",{"type":43,"tag":479,"props":491,"children":493},{"style":492},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[494],{"type":49,"value":495}," -sL",{"type":43,"tag":479,"props":497,"children":499},{"style":498},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[500],{"type":49,"value":501}," \"",{"type":43,"tag":479,"props":503,"children":504},{"style":492},[505],{"type":49,"value":506},"https:\u002F\u002Fmsdl.microsoft.com\u002Fdownload\u002Fsymbols\u002F_.debug\u002Felf-buildid-sym-1eb39fc72918c7c6c0c610b79eb3d3d47b2f81be\u002F_.debug",{"type":43,"tag":479,"props":508,"children":509},{"style":498},[510],{"type":49,"value":511},"\"",{"type":43,"tag":479,"props":513,"children":515},{"style":514},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[516],{"type":49,"value":517}," \\\n",{"type":43,"tag":479,"props":519,"children":521},{"class":481,"line":520},2,[522,527],{"type":43,"tag":479,"props":523,"children":524},{"style":492},[525],{"type":49,"value":526},"  -o",{"type":43,"tag":479,"props":528,"children":529},{"style":492},[530],{"type":49,"value":531}," libmonosgen-2.0.so.debug\n",{"type":43,"tag":52,"props":533,"children":534},{},[535,537,543,545,551],{"type":49,"value":536},"Verify with ",{"type":43,"tag":69,"props":538,"children":540},{"className":539},[],[541],{"type":49,"value":542},"file libmonosgen-2.0.so.debug",{"type":49,"value":544}," — should show ",{"type":43,"tag":69,"props":546,"children":548},{"className":547},[],[549],{"type":49,"value":550},"ELF 64-bit ... with debug_info, not stripped",{"type":49,"value":552},". If the download returns 404 or HTML, symbols are not published for that build. Do not add or subtract library base addresses — offsets in tombstones are already library-relative.",{"type":43,"tag":107,"props":554,"children":556},{"id":555},"step-4-symbolicate-each-frame",[557],{"type":49,"value":558},"Step 4: Symbolicate Each Frame",{"type":43,"tag":119,"props":560,"children":562},{"className":471,"code":561,"language":473,"meta":127,"style":127},"llvm-symbolizer --obj=libmonosgen-2.0.so.debug -f -C 0x222098\n",[563],{"type":43,"tag":69,"props":564,"children":565},{"__ignoreMap":127},[566],{"type":43,"tag":479,"props":567,"children":568},{"class":481,"line":482},[569,573,578,583,588],{"type":43,"tag":479,"props":570,"children":571},{"style":486},[572],{"type":49,"value":74},{"type":43,"tag":479,"props":574,"children":575},{"style":492},[576],{"type":49,"value":577}," --obj=libmonosgen-2.0.so.debug",{"type":43,"tag":479,"props":579,"children":580},{"style":492},[581],{"type":49,"value":582}," -f",{"type":43,"tag":479,"props":584,"children":585},{"style":492},[586],{"type":49,"value":587}," -C",{"type":43,"tag":479,"props":589,"children":591},{"style":590},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[592],{"type":49,"value":593}," 0x222098\n",{"type":43,"tag":52,"props":595,"children":596},{},[597],{"type":49,"value":598},"Output:",{"type":43,"tag":119,"props":600,"children":603},{"className":601,"code":602,"language":49},[122],"ves_icall_System_Environment_FailFast\n\u002F__w\u002F1\u002Fs\u002Fsrc\u002Fruntime\u002Fsrc\u002Fmono\u002Fmono\u002Fmetadata\u002Ficall.c:6244\n",[604],{"type":43,"tag":69,"props":605,"children":606},{"__ignoreMap":127},[607],{"type":49,"value":602},{"type":43,"tag":52,"props":609,"children":610},{},[611,613,619,621,627,629,638],{"type":49,"value":612},"The ",{"type":43,"tag":69,"props":614,"children":616},{"className":615},[],[617],{"type":49,"value":618},"\u002F__w\u002F1\u002Fs\u002F",{"type":49,"value":620}," prefix is the CI workspace root — the meaningful path starts at ",{"type":43,"tag":69,"props":622,"children":624},{"className":623},[],[625],{"type":49,"value":626},"src\u002Fruntime\u002F",{"type":49,"value":628},", mapping to ",{"type":43,"tag":630,"props":631,"children":635},"a",{"href":632,"rel":633},"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fdotnet",[634],"nofollow",[636],{"type":49,"value":637},"dotnet\u002Fdotnet",{"type":49,"value":639}," VMR.",{"type":43,"tag":107,"props":641,"children":643},{"id":642},"step-5-present-the-symbolicated-backtrace",[644],{"type":49,"value":645},"Step 5: Present the Symbolicated Backtrace",{"type":43,"tag":52,"props":647,"children":648},{},[649],{"type":49,"value":650},"Combine original frame numbers with resolved function names and source locations:",{"type":43,"tag":119,"props":652,"children":655},{"className":653,"code":654,"language":49},[122],"#00  libc.so              abort+164\n#01  libmonosgen-2.0.so   ves_icall_System_Environment_FailFast        (mono\u002Fmetadata\u002Ficall.c:6244)\n#02  libmonosgen-2.0.so   do_icall                                     (mono\u002Fmini\u002Finterp.c:2457)\n#03  libmonosgen-2.0.so   mono_interp_exec_method                      (mono\u002Fmini\u002Finterp.c)\n",[656],{"type":43,"tag":69,"props":657,"children":658},{"__ignoreMap":127},[659],{"type":49,"value":654},{"type":43,"tag":52,"props":661,"children":662},{},[663,665,671],{"type":49,"value":664},"For unresolved frames (",{"type":43,"tag":69,"props":666,"children":668},{"className":667},[],[669],{"type":49,"value":670},"??",{"type":49,"value":672},"), keep the original line with BuildId and PC offset.",{"type":43,"tag":107,"props":674,"children":676},{"id":675},"automation-script",[677],{"type":49,"value":678},"Automation Script",{"type":43,"tag":52,"props":680,"children":681},{},[682,687],{"type":43,"tag":630,"props":683,"children":685},{"href":684},"scripts\u002FSymbolicate-Tombstone.ps1",[686],{"type":49,"value":684},{"type":49,"value":688}," automates the full workflow:",{"type":43,"tag":119,"props":690,"children":694},{"className":691,"code":692,"language":693,"meta":127,"style":127},"language-powershell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pwsh scripts\u002FSymbolicate-Tombstone.ps1 -TombstoneFile tombstone_01.txt -LlvmSymbolizer llvm-symbolizer\n","powershell",[695],{"type":43,"tag":69,"props":696,"children":697},{"__ignoreMap":127},[698],{"type":43,"tag":479,"props":699,"children":700},{"class":481,"line":482},[701],{"type":43,"tag":479,"props":702,"children":703},{},[704],{"type":49,"value":692},{"type":43,"tag":52,"props":706,"children":707},{},[708,710,716,718,724,726,732,734,740],{"type":49,"value":709},"Flags: ",{"type":43,"tag":69,"props":711,"children":713},{"className":712},[],[714],{"type":49,"value":715},"-CrashingThreadOnly",{"type":49,"value":717}," (limit to crashing thread), ",{"type":43,"tag":69,"props":719,"children":721},{"className":720},[],[722],{"type":49,"value":723},"-OutputFile path",{"type":49,"value":725}," (write to file), ",{"type":43,"tag":69,"props":727,"children":729},{"className":728},[],[730],{"type":49,"value":731},"-ParseOnly",{"type":49,"value":733}," (report libraries\u002FBuildIds\u002FURLs without downloading), ",{"type":43,"tag":69,"props":735,"children":737},{"className":736},[],[738],{"type":49,"value":739},"-SkipVersionLookup",{"type":49,"value":741}," (skip runtime version identification).",{"type":43,"tag":96,"props":743,"children":744},{},[],{"type":43,"tag":100,"props":746,"children":748},{"id":747},"finding-llvm-symbolizer",[749],{"type":49,"value":750},"Finding llvm-symbolizer",{"type":43,"tag":52,"props":752,"children":753},{},[754,756,761,763,769,770,776,778,784,785,791,793,799],{"type":49,"value":755},"Check the ",{"type":43,"tag":61,"props":757,"children":758},{},[759],{"type":49,"value":760},"Android NDK",{"type":49,"value":762}," first: ",{"type":43,"tag":69,"props":764,"children":766},{"className":765},[],[767],{"type":49,"value":768},"$ANDROID_NDK_ROOT\u002Ftoolchains\u002Fllvm\u002Fprebuilt\u002F*\u002Fbin\u002Fllvm-symbolizer",{"type":49,"value":407},{"type":43,"tag":69,"props":771,"children":773},{"className":772},[],[774],{"type":49,"value":775},"$ANDROID_HOME\u002Fndk\u002F*\u002Ftoolchains\u002Fllvm\u002Fprebuilt\u002F*\u002Fbin\u002Fllvm-symbolizer",{"type":49,"value":777},". Also available via ",{"type":43,"tag":69,"props":779,"children":781},{"className":780},[],[782],{"type":49,"value":783},"brew install llvm",{"type":49,"value":141},{"type":43,"tag":69,"props":786,"children":788},{"className":787},[],[789],{"type":49,"value":790},"apt install llvm",{"type":49,"value":792},", or ",{"type":43,"tag":69,"props":794,"children":796},{"className":795},[],[797],{"type":49,"value":798},"xcrun --find llvm-symbolizer",{"type":49,"value":800}," on macOS.",{"type":43,"tag":52,"props":802,"children":803},{},[804,806,811],{"type":49,"value":805},"If unavailable, complete steps 1–3 and present the download commands and ",{"type":43,"tag":69,"props":807,"children":809},{"className":808},[],[810],{"type":49,"value":74},{"type":49,"value":812}," commands for the user to run. Do not spend time installing LLVM.",{"type":43,"tag":96,"props":814,"children":815},{},[],{"type":43,"tag":100,"props":817,"children":819},{"id":818},"understanding-the-output",[820],{"type":49,"value":821},"Understanding the Output",{"type":43,"tag":52,"props":823,"children":824},{},[825],{"type":49,"value":826},"CI source paths use these prefixes:",{"type":43,"tag":277,"props":828,"children":829},{},[830,846],{"type":43,"tag":281,"props":831,"children":832},{},[833],{"type":43,"tag":285,"props":834,"children":835},{},[836,841],{"type":43,"tag":289,"props":837,"children":838},{},[839],{"type":49,"value":840},"Path prefix",{"type":43,"tag":289,"props":842,"children":843},{},[844],{"type":49,"value":845},"Maps to",{"type":43,"tag":300,"props":847,"children":848},{},[849,878,901],{"type":43,"tag":285,"props":850,"children":851},{},[852,861],{"type":43,"tag":307,"props":853,"children":854},{},[855],{"type":43,"tag":69,"props":856,"children":858},{"className":857},[],[859],{"type":49,"value":860},"\u002F__w\u002F1\u002Fs\u002Fsrc\u002Fruntime\u002F",{"type":43,"tag":307,"props":862,"children":863},{},[864,869,871,876],{"type":43,"tag":69,"props":865,"children":867},{"className":866},[],[868],{"type":49,"value":626},{"type":49,"value":870}," in ",{"type":43,"tag":630,"props":872,"children":874},{"href":632,"rel":873},[634],[875],{"type":49,"value":637},{"type":49,"value":877}," VMR",{"type":43,"tag":285,"props":879,"children":880},{},[881,890],{"type":43,"tag":307,"props":882,"children":883},{},[884],{"type":43,"tag":69,"props":885,"children":887},{"className":886},[],[888],{"type":49,"value":889},"\u002F__w\u002F1\u002Fs\u002Fsrc\u002Fmono\u002F",{"type":43,"tag":307,"props":891,"children":892},{},[893,899],{"type":43,"tag":69,"props":894,"children":896},{"className":895},[],[897],{"type":49,"value":898},"src\u002Fmono\u002F",{"type":49,"value":900}," in the VMR (older builds)",{"type":43,"tag":285,"props":902,"children":903},{},[904,912],{"type":43,"tag":307,"props":905,"children":906},{},[907],{"type":43,"tag":69,"props":908,"children":910},{"className":909},[],[911],{"type":49,"value":618},{"type":43,"tag":307,"props":913,"children":914},{},[915],{"type":49,"value":916},"VMR root",{"type":43,"tag":107,"props":918,"children":920},{"id":919},"runtime-version-identification",[921],{"type":49,"value":922},"Runtime Version Identification",{"type":43,"tag":52,"props":924,"children":925},{},[926,928,934,936,942,944,950,952,958,960,965,967,973],{"type":49,"value":927},"The script identifies the exact .NET runtime version by matching BuildIds against locally-installed runtime packs. It searches: SDK packs (",{"type":43,"tag":69,"props":929,"children":931},{"className":930},[],[932],{"type":49,"value":933},"$DOTNET_ROOT\u002Fpacks\u002F",{"type":49,"value":935},"), NuGet cache (",{"type":43,"tag":69,"props":937,"children":939},{"className":938},[],[940],{"type":49,"value":941},"~\u002F.nuget\u002Fpackages\u002F",{"type":49,"value":943},"), and NuGet.org as an online fallback. When found, it extracts the version and source commit from the ",{"type":43,"tag":69,"props":945,"children":947},{"className":946},[],[948],{"type":49,"value":949},".nuspec",{"type":49,"value":951}," ",{"type":43,"tag":69,"props":953,"children":955},{"className":954},[],[956],{"type":49,"value":957},"\u003Crepository commit=\"...\" \u002F>",{"type":49,"value":959}," element. Pass ",{"type":43,"tag":69,"props":961,"children":963},{"className":962},[],[964],{"type":49,"value":739},{"type":49,"value":966}," to disable. Requires ",{"type":43,"tag":69,"props":968,"children":970},{"className":969},[],[971],{"type":49,"value":972},"llvm-readelf",{"type":49,"value":974}," (auto-discovered from the NDK).",{"type":43,"tag":96,"props":976,"children":977},{},[],{"type":43,"tag":100,"props":979,"children":981},{"id":980},"validation",[982],{"type":49,"value":983},"Validation",{"type":43,"tag":985,"props":986,"children":987},"ol",{},[988,1005,1016],{"type":43,"tag":189,"props":989,"children":990},{},[991,997,999],{"type":43,"tag":69,"props":992,"children":994},{"className":993},[],[995],{"type":49,"value":996},"file \u003Cdebug-file>",{"type":49,"value":998}," shows ",{"type":43,"tag":69,"props":1000,"children":1002},{"className":1001},[],[1003],{"type":49,"value":1004},"ELF ... with debug_info, not stripped",{"type":43,"tag":189,"props":1006,"children":1007},{},[1008,1010,1015],{"type":49,"value":1009},"At least one .NET frame resolves to a function name (not ",{"type":43,"tag":69,"props":1011,"children":1013},{"className":1012},[],[1014],{"type":49,"value":670},{"type":49,"value":390},{"type":43,"tag":189,"props":1017,"children":1018},{},[1019,1021,1027,1028,1034],{"type":49,"value":1020},"Resolved paths contain recognizable .NET runtime structure (e.g., ",{"type":43,"tag":69,"props":1022,"children":1024},{"className":1023},[],[1025],{"type":49,"value":1026},"mono\u002Fmetadata\u002F",{"type":49,"value":141},{"type":43,"tag":69,"props":1029,"children":1031},{"className":1030},[],[1032],{"type":49,"value":1033},"mono\u002Fmini\u002F",{"type":49,"value":390},{"type":43,"tag":100,"props":1036,"children":1038},{"id":1037},"stop-signals",[1039],{"type":49,"value":1040},"Stop Signals",{"type":43,"tag":185,"props":1042,"children":1043},{},[1044,1054,1064,1074],{"type":43,"tag":189,"props":1045,"children":1046},{},[1047,1052],{"type":43,"tag":61,"props":1048,"children":1049},{},[1050],{"type":49,"value":1051},"No .NET frames found",{"type":49,"value":1053},": Report parsed frames and stop.",{"type":43,"tag":189,"props":1055,"children":1056},{},[1057,1062],{"type":43,"tag":61,"props":1058,"children":1059},{},[1060],{"type":49,"value":1061},"All frames resolved",{"type":49,"value":1063},": Present symbolicated backtrace. Do not trace into source or attempt to build\u002Fdebug the runtime.",{"type":43,"tag":189,"props":1065,"children":1066},{},[1067,1072],{"type":43,"tag":61,"props":1068,"children":1069},{},[1070],{"type":49,"value":1071},"Symbols not available (404)",{"type":49,"value":1073},": One attempt per BuildId, then stop. Report unsymbolicated frames with BuildIds and offsets.",{"type":43,"tag":189,"props":1075,"children":1076},{},[1077,1082,1084,1089],{"type":43,"tag":61,"props":1078,"children":1079},{},[1080],{"type":49,"value":1081},"llvm-symbolizer not available",{"type":49,"value":1083},": Use ",{"type":43,"tag":69,"props":1085,"children":1087},{"className":1086},[],[1088],{"type":49,"value":731},{"type":49,"value":1090},", present manual commands. Do not install LLVM.",{"type":43,"tag":100,"props":1092,"children":1094},{"id":1093},"common-pitfalls",[1095],{"type":49,"value":1096},"Common Pitfalls",{"type":43,"tag":185,"props":1098,"children":1099},{},[1100,1134,1160,1184,1194],{"type":43,"tag":189,"props":1101,"children":1102},{},[1103,1108,1110,1116,1118,1124,1126,1132],{"type":43,"tag":61,"props":1104,"children":1105},{},[1106],{"type":49,"value":1107},"Missing BuildIds",{"type":49,"value":1109},": Logcat tombstones often omit BuildIds. Recover via: ",{"type":43,"tag":69,"props":1111,"children":1113},{"className":1112},[],[1114],{"type":49,"value":1115},"adb shell readelf -n \u002Fpath\u002Fto\u002Flib.so",{"type":49,"value":1117},", CI build artifacts, or the runtime NuGet package (",{"type":43,"tag":69,"props":1119,"children":1121},{"className":1120},[],[1122],{"type":49,"value":1123},"~\u002F.dotnet\u002Fpacks\u002FMicrosoft.NETCore.App.Runtime.Mono.android-arm64\u002F\u003Cversion>\u002F",{"type":49,"value":1125},"). Prefer pulling raw tombstone files (",{"type":43,"tag":69,"props":1127,"children":1129},{"className":1128},[],[1130],{"type":49,"value":1131},"adb shell cat \u002Fdata\u002Ftombstones\u002Ftombstone_XX",{"type":49,"value":1133},") which always include BuildIds.",{"type":43,"tag":189,"props":1135,"children":1136},{},[1137,1142,1144,1150,1152,1158],{"type":43,"tag":61,"props":1138,"children":1139},{},[1140],{"type":49,"value":1141},"Symbols not found (404)",{"type":49,"value":1143},": Pre-release\u002Finternal builds may not publish symbols. Check for local unstripped ",{"type":43,"tag":69,"props":1145,"children":1147},{"className":1146},[],[1148],{"type":49,"value":1149},".so",{"type":49,"value":1151},"\u002F",{"type":43,"tag":69,"props":1153,"children":1155},{"className":1154},[],[1156],{"type":49,"value":1157},".so.dbg",{"type":49,"value":1159}," in build artifacts or the NuGet runtime pack.",{"type":43,"tag":189,"props":1161,"children":1162},{},[1163,1168,1170,1175,1177,1182],{"type":43,"tag":61,"props":1164,"children":1165},{},[1166],{"type":49,"value":1167},"NativeAOT",{"type":49,"value":1169},": No runtime ",{"type":43,"tag":69,"props":1171,"children":1173},{"className":1172},[],[1174],{"type":49,"value":1149},{"type":49,"value":1176}," in the tombstone — runtime is in the app binary. ",{"type":43,"tag":69,"props":1178,"children":1180},{"className":1179},[],[1181],{"type":49,"value":349},{"type":49,"value":1183}," BCL libraries still work with the symbol server; the app binary needs its own debug symbols.",{"type":43,"tag":189,"props":1185,"children":1186},{},[1187,1192],{"type":43,"tag":61,"props":1188,"children":1189},{},[1190],{"type":49,"value":1191},"Wrong llvm-symbolizer version",{"type":49,"value":1193},": Use LLVM 14+ for best DWARF compatibility.",{"type":43,"tag":189,"props":1195,"children":1196},{},[1197,1202],{"type":43,"tag":61,"props":1198,"children":1199},{},[1200],{"type":49,"value":1201},"Multiple BuildIds",{"type":49,"value":1203},": Each .NET library has its own BuildId — download symbols for each separately.",{"type":43,"tag":1205,"props":1206,"children":1207},"style",{},[1208],{"type":49,"value":1209},"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":1211,"total":1310},[1212,1227,1234,1252,1266,1286,1296],{"slug":1213,"name":1213,"fn":1214,"description":1215,"org":1216,"tags":1217,"stars":25,"repoUrl":26,"updatedAt":1226},"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},[1218,1219,1222,1223],{"name":17,"slug":18,"type":15},{"name":1220,"slug":1221,"type":15},"Code Analysis","code-analysis",{"name":23,"slug":24,"type":15},{"name":1224,"slug":1225,"type":15},"Performance","performance","2026-07-12T08:23:25.400375",{"slug":4,"name":4,"fn":5,"description":6,"org":1228,"tags":1229,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1230,1231,1232,1233],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},{"slug":1235,"name":1235,"fn":1236,"description":1237,"org":1238,"tags":1239,"stars":25,"repoUrl":26,"updatedAt":1251},"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},[1240,1241,1242,1245,1248],{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":1243,"slug":1244,"type":15},"iOS","ios",{"name":1246,"slug":1247,"type":15},"macOS","macos",{"name":1249,"slug":1250,"type":15},"Observability","observability","2026-07-12T08:23:20.369986",{"slug":1253,"name":1253,"fn":1254,"description":1255,"org":1256,"tags":1257,"stars":25,"repoUrl":26,"updatedAt":1265},"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},[1258,1259,1262],{"name":1220,"slug":1221,"type":15},{"name":1260,"slug":1261,"type":15},"QA","qa",{"name":1263,"slug":1264,"type":15},"Testing","testing","2026-07-12T08:23:51.277743",{"slug":1267,"name":1267,"fn":1268,"description":1269,"org":1270,"tags":1271,"stars":25,"repoUrl":26,"updatedAt":1285},"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},[1272,1273,1276,1279,1282],{"name":17,"slug":18,"type":15},{"name":1274,"slug":1275,"type":15},"Blazor","blazor",{"name":1277,"slug":1278,"type":15},"C#","csharp",{"name":1280,"slug":1281,"type":15},"UI Components","ui-components",{"name":1283,"slug":1284,"type":15},"Web Development","web-development","2026-07-15T06:03:29.216359",{"slug":1287,"name":1287,"fn":1288,"description":1289,"org":1290,"tags":1291,"stars":25,"repoUrl":26,"updatedAt":1295},"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},[1292,1293,1294],{"name":1220,"slug":1221,"type":15},{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},"2026-07-12T08:21:34.637923",{"slug":1297,"name":1297,"fn":1298,"description":1299,"org":1300,"tags":1301,"stars":25,"repoUrl":26,"updatedAt":1309},"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},[1302,1305,1306],{"name":1303,"slug":1304,"type":15},"Build","build",{"name":23,"slug":24,"type":15},{"name":1307,"slug":1308,"type":15},"Engineering","engineering","2026-07-19T05:38:19.340791",96,{"items":1312,"total":1417},[1313,1325,1332,1339,1347,1353,1361,1367,1373,1383,1396,1407],{"slug":1314,"name":1314,"fn":1315,"description":1316,"org":1317,"tags":1318,"stars":1322,"repoUrl":1323,"updatedAt":1324},"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},[1319,1320,1321],{"name":17,"slug":18,"type":15},{"name":1307,"slug":1308,"type":15},{"name":1224,"slug":1225,"type":15},5535,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fmsbuild","2026-07-22T05:37:33.965588",{"slug":1213,"name":1213,"fn":1214,"description":1215,"org":1326,"tags":1327,"stars":25,"repoUrl":26,"updatedAt":1226},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1328,1329,1330,1331],{"name":17,"slug":18,"type":15},{"name":1220,"slug":1221,"type":15},{"name":23,"slug":24,"type":15},{"name":1224,"slug":1225,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":1333,"tags":1334,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1335,1336,1337,1338],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},{"slug":1235,"name":1235,"fn":1236,"description":1237,"org":1340,"tags":1341,"stars":25,"repoUrl":26,"updatedAt":1251},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1342,1343,1344,1345,1346],{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":1243,"slug":1244,"type":15},{"name":1246,"slug":1247,"type":15},{"name":1249,"slug":1250,"type":15},{"slug":1253,"name":1253,"fn":1254,"description":1255,"org":1348,"tags":1349,"stars":25,"repoUrl":26,"updatedAt":1265},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1350,1351,1352],{"name":1220,"slug":1221,"type":15},{"name":1260,"slug":1261,"type":15},{"name":1263,"slug":1264,"type":15},{"slug":1267,"name":1267,"fn":1268,"description":1269,"org":1354,"tags":1355,"stars":25,"repoUrl":26,"updatedAt":1285},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1356,1357,1358,1359,1360],{"name":17,"slug":18,"type":15},{"name":1274,"slug":1275,"type":15},{"name":1277,"slug":1278,"type":15},{"name":1280,"slug":1281,"type":15},{"name":1283,"slug":1284,"type":15},{"slug":1287,"name":1287,"fn":1288,"description":1289,"org":1362,"tags":1363,"stars":25,"repoUrl":26,"updatedAt":1295},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1364,1365,1366],{"name":1220,"slug":1221,"type":15},{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},{"slug":1297,"name":1297,"fn":1298,"description":1299,"org":1368,"tags":1369,"stars":25,"repoUrl":26,"updatedAt":1309},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1370,1371,1372],{"name":1303,"slug":1304,"type":15},{"name":23,"slug":24,"type":15},{"name":1307,"slug":1308,"type":15},{"slug":1374,"name":1374,"fn":1375,"description":1376,"org":1377,"tags":1378,"stars":25,"repoUrl":26,"updatedAt":1382},"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},[1379,1380,1381],{"name":17,"slug":18,"type":15},{"name":1307,"slug":1308,"type":15},{"name":1224,"slug":1225,"type":15},"2026-07-19T05:38:18.364937",{"slug":1384,"name":1384,"fn":1385,"description":1386,"org":1387,"tags":1388,"stars":25,"repoUrl":26,"updatedAt":1395},"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},[1389,1390,1393,1394],{"name":1307,"slug":1308,"type":15},{"name":1391,"slug":1392,"type":15},"Monitoring","monitoring",{"name":1224,"slug":1225,"type":15},{"name":1263,"slug":1264,"type":15},"2026-07-12T08:21:35.865649",{"slug":1397,"name":1397,"fn":1398,"description":1399,"org":1400,"tags":1401,"stars":25,"repoUrl":26,"updatedAt":1406},"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},[1402,1403,1404,1405],{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":1307,"slug":1308,"type":15},{"name":1224,"slug":1225,"type":15},"2026-07-12T08:21:40.961722",{"slug":1408,"name":1408,"fn":1409,"description":1410,"org":1411,"tags":1412,"stars":25,"repoUrl":26,"updatedAt":1416},"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},[1413,1414,1415],{"name":23,"slug":24,"type":15},{"name":1307,"slug":1308,"type":15},{"name":1260,"slug":1261,"type":15},"2026-07-19T05:38:14.336279",144]