Source profileQuality 88/100

dotnet/skills/plugins/dotnet-diag/skills/android-tombstone-symbolication/SKILL.md

android-tombstone-symbolication

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 sign

Source repository stars
4,922
Declared platforms
0
Static risk flags
2
Last source update
2026-08-04
Source checked
2026-08-04

Decision brief

What it does—and where it fits

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.

Best for

    Not for

    • Missing BuildIds: Logcat tombstones often omit BuildIds. Recover via: adb shell readelf -n /path/to/lib.so, CI build artifacts, or the runtime NuGet package (/.dotnet/packs/Microsoft.NETCore.App.Runtime.Mono.android-arm…
    • Symbols not found (404): Pre-release/internal builds may not publish symbols. Check for local unstripped .so/.so.dbg in build artifacts or the NuGet runtime pack.

    Compatibility matrix

    Platform support, with evidence labels

    PlatformStatusEvidenceWhat to check
    CodexNot declaredNo explicit evidencePortability before use
    Claude CodeNot declaredNo explicit evidencePortability before use
    CursorNot declaredNo explicit evidencePortability before use
    Gemini CLINot declaredNo explicit evidencePortability before use
    Open the compatibility checker

    Installation

    Inspect first. Install second.

    The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

    Source-detected install commandSource
    npx skills add https://github.com/dotnet/skills --skill "plugins/dotnet-diag/skills/android-tombstone-symbolication"
    Safe inspection promptEditorial

    Inspect the Agent Skill "android-tombstone-symbolication" from https://github.com/dotnet/skills/blob/805a42a675a47f14fdd77a54aa474fcb8e499b9e/plugins/dotnet-diag/skills/android-tombstone-symbolication/SKILL.md at commit 805a42a675a47f14fdd77a54aa474fcb8e499b9e. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

    Workflow

    What the source asks the agent to do

    1. 01

      Workflow

      Each backtrace frame has this format:

      The script auto-detects NN pc frame lines with or without a backtrace: header, and strips logcat timestamp/tag prefixes automatically.Logcat-captured tombstones often omit BuildIds. Recover via adb shell readelf -n, CI build artifacts, or the .NET runtime NuGet package.GitHub issue pastes may mangle 1 pc into issue links — replace org/repoN pc with N pc before saving to a file.
    2. 02

      Step 1: Parse the Tombstone Backtrace

      Each backtrace frame has this format:

      The script auto-detects NN pc frame lines with or without a backtrace: header, and strips logcat timestamp/tag prefixes automatically.Logcat-captured tombstones often omit BuildIds. Recover via adb shell readelf -n, CI build artifacts, or the .NET runtime NuGet package.GitHub issue pastes may mangle 1 pc into issue links — replace org/repoN pc with N pc before saving to a file.
    3. 03

      Step 2: Identify .NET Runtime Libraries

      Filter frames to .NET runtime libraries:

      Filter frames to .NET runtime libraries: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…Skip libc.so, libart.so, and other Android system libraries unless the user specifically asks.
    4. 04

      Step 3: Download Debug Symbols

      For each unique .NET BuildId, download debug symbols:

      For each unique .NET BuildId, download debug symbols:Verify with file libmonosgen-2.0.so.debug — should show ELF 64-bit ... with debuginfo, not stripped. If the download returns 404 or HTML, symbols are not published for that build. Do not add or subtract library base add…
    5. 05

      Step 4: Symbolicate Each Frame

      The /w/1/s/ prefix is the CI workspace root — the meaningful path starts at src/runtime/, mapping to dotnet/dotnet VMR.

      The /w/1/s/ prefix is the CI workspace root — the meaningful path starts at src/runtime/, mapping to dotnet/dotnet VMR.

    Permission review

    Static risk signals and limitations

    Network access

    medium · line 51

    The documentation includes network, browsing, or remote request actions.

    https://msdl.microsoft.com/download/symbols/_.debug/elf-buildid-sym-<BUILDID>/_.debug

    Network access

    medium · line 55

    The documentation includes network, browsing, or remote request actions.

    curl -sL "https://msdl.microsoft.com/download/symbols/_.debug/elf-buildid-sym-1eb39fc72918c7c6c0c610b79eb3d3d47b2f81be/_.debug" \

    Writes files

    medium · line 96

    The documentation asks the agent to create, modify, or delete local files.

    Flags: `-CrashingThreadOnly` (limit to crashing thread), `-OutputFile path` (write to file), `-ParseOnly` (report libraries/BuildIds/URLs without downloading), `-SkipVersionLookup` (skip runtime version identification).

    Evidence record

    Why each signal appears

    EvidenceSourceComputedTestedEditorial
    SignalValueEvidence typeMeaning
    Quality score88/100ComputedDocumentation, specificity, maintenance, and trust rules
    Repository stars4,922SourceRepository attention, not individual Skill quality
    Compatibility0 platformsSourceDeclared in the catalog source record
    Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

    Pinned source

    Provenance and original SKILL.md

    Repository
    dotnet/skills
    Skill path
    plugins/dotnet-diag/skills/android-tombstone-symbolication/SKILL.md
    Commit
    805a42a675a47f14fdd77a54aa474fcb8e499b9e
    License
    MIT
    Collected
    2026-08-04
    Default branch
    main
    View the original SKILL.md

    Android Tombstone .NET Symbolication

    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.

    Inputs: Tombstone file or logcat crash output, llvm-symbolizer (from Android NDK or any LLVM 14+ toolchain), internet access for symbol downloads.

    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.


    Workflow

    Step 1: Parse the Tombstone Backtrace

    Each backtrace frame has this format:

    #NN pc OFFSET  /path/to/library.so (optional_symbol+0xNN) (BuildId: HEXSTRING)
    

    Extract: frame number, PC offset (hex, already library-relative), library name, and BuildId (32–40 hex chars).

    Symbolicate all threads by default (background threads like GC/finalizer often have useful .NET frames). The crashing thread's backtrace is listed first; additional threads appear after --- --- --- markers.

    Format notes:

    • The script auto-detects #NN pc frame lines with or without a backtrace: header, and strips logcat timestamp/tag prefixes automatically.
    • Logcat-captured tombstones often omit BuildIds. Recover via adb shell readelf -n, CI build artifacts, or the .NET runtime NuGet package.
    • GitHub issue pastes may mangle #1 pc into issue links — replace org/repo#N pc with #N pc before saving to a file.
    • If the script fails to parse a format, fall back to manual extraction of #NN pc OFFSET library.so (BuildId: HEX) tuples.

    Step 2: Identify .NET Runtime Libraries

    Filter frames to .NET runtime libraries:

    LibraryRuntime
    libmonosgen-2.0.soMono (MAUI, Xamarin, interpreter)
    libcoreclr.soCoreCLR (JIT mode)
    libSystem.*.so.NET BCL native components (Native, Globalization.Native, IO.Compression.Native, Security.Cryptography.Native.OpenSsl, Net.Security.Native)

    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.

    Skip libc.so, libart.so, and other Android system libraries unless the user specifically asks.

    Step 3: Download Debug Symbols

    For each unique .NET BuildId, download debug symbols:

    https://msdl.microsoft.com/download/symbols/_.debug/elf-buildid-sym-<BUILDID>/_.debug
    
    curl -sL "https://msdl.microsoft.com/download/symbols/_.debug/elf-buildid-sym-1eb39fc72918c7c6c0c610b79eb3d3d47b2f81be/_.debug" \
      -o libmonosgen-2.0.so.debug
    

    Verify 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.

    Step 4: Symbolicate Each Frame

    llvm-symbolizer --obj=libmonosgen-2.0.so.debug -f -C 0x222098
    

    Output:

    ves_icall_System_Environment_FailFast
    /__w/1/s/src/runtime/src/mono/mono/metadata/icall.c:6244
    

    The /__w/1/s/ prefix is the CI workspace root — the meaningful path starts at src/runtime/, mapping to dotnet/dotnet VMR.

    Step 5: Present the Symbolicated Backtrace

    Combine original frame numbers with resolved function names and source locations:

    #00  libc.so              abort+164
    #01  libmonosgen-2.0.so   ves_icall_System_Environment_FailFast        (mono/metadata/icall.c:6244)
    #02  libmonosgen-2.0.so   do_icall                                     (mono/mini/interp.c:2457)
    #03  libmonosgen-2.0.so   mono_interp_exec_method                      (mono/mini/interp.c)
    

    For unresolved frames (??), keep the original line with BuildId and PC offset.

    Automation Script

    scripts/Symbolicate-Tombstone.ps1 automates the full workflow:

    pwsh scripts/Symbolicate-Tombstone.ps1 -TombstoneFile tombstone_01.txt -LlvmSymbolizer llvm-symbolizer
    

    Flags: -CrashingThreadOnly (limit to crashing thread), -OutputFile path (write to file), -ParseOnly (report libraries/BuildIds/URLs without downloading), -SkipVersionLookup (skip runtime version identification).


    Finding llvm-symbolizer

    Check the Android NDK first: $ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/*/bin/llvm-symbolizer or $ANDROID_HOME/ndk/*/toolchains/llvm/prebuilt/*/bin/llvm-symbolizer. Also available via brew install llvm, apt install llvm, or xcrun --find llvm-symbolizer on macOS.

    If 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.


    Understanding the Output

    CI source paths use these prefixes:

    Path prefixMaps to
    /__w/1/s/src/runtime/src/runtime/ in dotnet/dotnet VMR
    /__w/1/s/src/mono/src/mono/ in the VMR (older builds)
    /__w/1/s/VMR root

    Runtime Version Identification

    The script identifies the exact .NET runtime version by matching BuildIds against locally-installed runtime packs. It searches: SDK packs ($DOTNET_ROOT/packs/), NuGet cache (~/.nuget/packages/), and NuGet.org as an online fallback. When found, it extracts the version and source commit from the .nuspec <repository commit="..." /> element. Pass -SkipVersionLookup to disable. Requires llvm-readelf (auto-discovered from the NDK).


    Validation

    1. file <debug-file> shows ELF ... with debug_info, not stripped
    2. At least one .NET frame resolves to a function name (not ??)
    3. Resolved paths contain recognizable .NET runtime structure (e.g., mono/metadata/, mono/mini/)

    Stop Signals

    • No .NET frames found: Report parsed frames and stop.
    • All frames resolved: Present symbolicated backtrace. Do not trace into source or attempt to build/debug the runtime.
    • Symbols not available (404): One attempt per BuildId, then stop. Report unsymbolicated frames with BuildIds and offsets.
    • llvm-symbolizer not available: Use -ParseOnly, present manual commands. Do not install LLVM.

    Common Pitfalls

    • Missing BuildIds: Logcat tombstones often omit BuildIds. Recover via: adb shell readelf -n /path/to/lib.so, CI build artifacts, or the runtime NuGet package (~/.dotnet/packs/Microsoft.NETCore.App.Runtime.Mono.android-arm64/<version>/). Prefer pulling raw tombstone files (adb shell cat /data/tombstones/tombstone_XX) which always include BuildIds.
    • Symbols not found (404): Pre-release/internal builds may not publish symbols. Check for local unstripped .so/.so.dbg in build artifacts or the NuGet runtime pack.
    • 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.
    • Wrong llvm-symbolizer version: Use LLVM 14+ for best DWARF compatibility.
    • Multiple BuildIds: Each .NET library has its own BuildId — download symbols for each separately.

    Alternatives

    Compare before choosing

    Computed 10023,781

    alirezarezvani/claude-skills

    app-store-optimization

    App Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklist

    Computed 1004,922

    dotnet/skills

    migrate-vstest-to-mtp

    Migrates .NET test projects from VSTest to Microsoft.Testing.Platform (MTP). Use when user asks to "migrate to MTP", "switch from VSTest", "enable Microsoft.Testing.Platform", "use MTP runner", set OutputType=Exe only for test projects in Directory.Build.props, or mentions EnableMSTestRunner, EnableNUnitRunner, or UseMicrosoftTestingPlatformRunner. USE FOR: MTP behavioral differences vs VSTest (exit code 8, zero tests discovered, --ignore-exit-code, TESTINGPLATFORM_EXITCODE_IGNORE); centralizing

    Computed 9929,558

    HKUDS/Vibe-Trading

    strategy-generate

    Create, modify, and optimize quantitative trading strategies, then backtest and evaluate them.

    Computed 9832,606

    K-Dense-AI/scientific-agent-skills

    dask

    Distributed computing for larger-than-RAM pandas/NumPy workflows. Use when you need to scale existing pandas/NumPy code beyond memory or across clusters. Best for parallel file processing, distributed ML, integration with existing pandas code. For out-of-core analytics on single machine use vaex; for in-memory speed use polars.