android-tombstone-symbolication
Symbolicate the .NET runtime frames in an Android tombstone file.
Skill by SteffenCarlsen
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/steffencarlsen-android-tombstone-symbolication
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: backend
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/android-tombstone-symbolication
What's inside
- Skill name
android-tombstone-symbolication- Description
- 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/Kotlin crashes, managed .NET exceptions that are already captured in logcat, or iOS crash logs. INVOKES Symbolicate-Tombstone.ps1 script, llvm-symbolizer, Microsoft symbol server.
- License
- MIT
- Instructions
- 144 lines in SKILL.md · view on GitHub
Before installing
- Ships executable scripts
- Instructions call the network
Files (2)
- SKILL.md
- Symbolicate-Tombstone.ps1 · scripts/
SKILL.md (first lines)
# 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: | Library | Runtime | |---------|---------| | `libmonosgen-2.0.so` | Mono (MAUI, Xamarin, interpreter) | | `libcoreclr.so` | CoreCLR (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 ``` ```bash 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 ```bash 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](https://github.com/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](scripts/Symbolicate-Tombstone.ps1) automates the full workflow: ```powershell 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 prefix | Maps to | |---|---| | `/__w/1/s/src/runtime/` | `src/runtime/` in [dotnet/dotnet](https://github.com/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).
From SteffenCarlsen/agent-skills, MIT.
More from SteffenCarlsen/agent-skills
- 0.524score
code-testing-agent
SteffenCarlsen
Generates and writes new unit tests for any programming language using a Research-Plan-Implement pipeline.
SkillBFreshness: BClaude Code +9 - 0.479score
convert-to-cpm
SteffenCarlsen
Convert .NET projects and solutions (.sln, .slnx) to NuGet Central Package Management (CPM) using Directory.Packages.props.
SkillCFreshness: CClaude Code +9 - 0.479score
author-component
SteffenCarlsen
Create or review Blazor components (.razor files) with correct architecture.
SkillCFreshness: CClaude Code +9 - 0.479score
clr-activation-debugging
SteffenCarlsen
Diagnoses .NET Framework CLR activation issues using CLR activation logs (CLRLoad logs) produced by mscoree.dll.
SkillCFreshness: CClaude Code +9 - 0.479score
apple-crash-symbolication
SteffenCarlsen
Symbolicate .NET runtime frames in Apple platform .ips crash logs (iOS, tvOS, Mac Catalyst, macOS).
SkillCFreshness: CClaude Code +9 - 0.474score
convert-blazor-server-to-webapp
SteffenCarlsen
Guides conversion of a pre-.NET 8 Blazor Server app into a .NET 8+ Blazor Web App.
SkillCFreshness: CClaude Code +9 - 0.474score
build-parallelism
SteffenCarlsen
Guide for optimizing MSBuild build parallelism and multi-project scheduling.
SkillCFreshness: CClaude Code +9 - 0.474score
build-perf-baseline
SteffenCarlsen
Establish build performance baselines and apply systematic optimization techniques.
SkillCFreshness: CClaude Code +9 - 0.474score
build-perf-diagnostics
SteffenCarlsen
Diagnose MSBuild build performance bottlenecks using binary log analysis.
SkillCFreshness: CClaude Code +9 - 0.474score
check-bin-obj-clash
SteffenCarlsen
Detects MSBuild projects with conflicting OutputPath or IntermediateOutputPath.
SkillCFreshness: CClaude Code +9 - 0.474score
binlog-failure-analysis
SteffenCarlsen
Analyze MSBuild binary logs to diagnose build failures.
SkillCFreshness: CClaude Code +9 - 0.474score
collect-user-input
SteffenCarlsen
Build forms, validate data, and react to user input in Blazor.
SkillCFreshness: CClaude Code +9
Signals
- Stars
- 0
- Forks
- 0
- Open issues
- 0
- Last commit (this folder)
- Jul 15, 2026 (3 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/SteffenCarlsen/agent-skills
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from SteffenCarlsen
- 0.524score
code-testing-agent
SteffenCarlsen
Generates and writes new unit tests for any programming language using a Research-Plan-Implement pipeline.
SkillBFreshness: BClaude Code +9 - 0.479score
convert-to-cpm
SteffenCarlsen
Convert .NET projects and solutions (.sln, .slnx) to NuGet Central Package Management (CPM) using Directory.Packages.props.
SkillCFreshness: CClaude Code +9 - 0.479score
clr-activation-debugging
SteffenCarlsen
Diagnoses .NET Framework CLR activation issues using CLR activation logs (CLRLoad logs) produced by mscoree.dll.
SkillCFreshness: CClaude Code +9 - 0.479score
author-component
SteffenCarlsen
Create or review Blazor components (.razor files) with correct architecture.
SkillCFreshness: CClaude Code +9 - 0.479score
apple-crash-symbolication
SteffenCarlsen
Symbolicate .NET runtime frames in Apple platform .ips crash logs (iOS, tvOS, Mac Catalyst, macOS).
SkillCFreshness: CClaude Code +9 - 0.474score
assertion-quality
SteffenCarlsen
Analyzes the variety and depth of assertions across .NET test suites.
SkillCFreshness: CClaude Code +9
Cite this page
android-tombstone-symbolication skill. Agent Mart. https://agentmart.dev/skills/steffencarlsen-android-tombstone-symbolication (last updated 2026-10-24)