Agent skill

Dongle Crash Analysis

by haumacher in haumacher/phoneblock

Decode and analyze an ESP32 dongle crash report (uploaded .coredump).

GPL-3.0Auto-check: notesMobile

Install Dongle Crash Analysis

skills CLI
$ npx skills add haumacher/phoneblock --skill dongle-crash-analysis -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install haumacher/phoneblock dongle-crash-analysis --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/haumacher/phoneblock.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/dongle-crash-analysis .claude/skills/dongle-crash-analysis && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
dongle-crash-analysis
GitHub stars
367
Token cost
~1.9k tokens
SKILL.md length
842 words
Files
1
Skills in repo
4
Repo updated
First seen
Licence
GPL-3.0

At a glance

Decode and analyze an ESP32 dongle crash report (uploaded .coredump).

  • Works in 7 steps: Find the files → Strip the 24-byte flash header → Get the EXACT-version unstripped ELF… → …
  • Asked to analyze the crash report
  • SKILL.md covers 0. Find the files, 1. Strip the 24-byte flash…, 2. Get the EXACT-version… and 3. Decode with esp-coredump +…, plus 4 more sections
  • Calls curl; reaches cdn.phoneblock.net

What it does

Dongle Crash Analysis is an agent skill from haumacher/phoneblock. Decode and analyze an ESP32 dongle crash report (uploaded .coredump). Strips the 24-byte flash header, pulls the exact-version unstripped ELF from the CDN, symbolizes with esp-coredump + xtensa gdb, and interprets the backtrace. Use when asked to "analyze the crash report", look at a .coredump, or resolve a dongle backtrace.

Its SKILL.md is about 1.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Mobile, covering Mobile testing and debugging, Mobile performance and Embedded systems. It works with ESP32. The repository describes itself as: Der Spam-Filter für Dein Telefon. The licence is GPL-3.0.

When your agent uses it

  • Asked to analyze the crash report
  • Look at a .coredump
  • Resolve a dongle backtrace

Example prompts

  • “analyze the crash report”
  • “/dongle-crash-analysis”

Requirements

  • Pre-approved tools (allowed-tools): Bash, Read, Glob, Grep

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Find the files
  2. Strip the 24-byte flash header
  3. Get the EXACT-version unstripped ELF from the CDN
  4. Decode with esp-coredump + the xtensa GDB
  5. Read the dump
  6. Interpret — messenger vs. culprit
  7. Root-causing heap corruption

What it can do on your machine

Read from SKILL.md and the folder at commit 9287ad7. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Bash
    • Read
    • Glob
    • Grep

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • curl

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • cdn.phoneblock.net

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Dongle Crash Analysis loads about 1.9k tokens when it runs. Until then it costs about 87 tokens; SKILL.md has 842 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~87
When it runs · the whole SKILL.md, loaded when a task matches
~1.9k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NoteRuns commands with sudoSKILL.md:28
    `sudo chown -R $USER:$USER <dir>` (or `chmod -R a+rX`) themselves — don't burn
  • NotePre-approves every shell command (allowed-tools: Bash)SKILL.md
    allowed-tools: Bash, Read, Glob, Grep

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from haumacher/phoneblock at commit 9287ad7, republished under its GPL-3.0 licence (© haumacher). 842 words, ~1,889 tokens.

Download SKILL.mdSave it as .claude/skills/dongle-crash-analysis/SKILL.md (or your agent's skills folder).
name
dongle-crash-analysis
description
Decode and analyze an ESP32 dongle crash report (uploaded *.coredump). Strips the 24-byte flash header, pulls the exact-version unstripped ELF from the CDN, symbolizes with esp-coredump + xtensa gdb, and interprets the backtrace. Use when asked to "analyze the crash report", look at a .coredump, or resolve a dongle backtrace.
allowed-tools
Bash, Read, Glob, Grep

Dongle crash-report analysis

The dongle firmware (phoneblock-dongle/firmware/, an ESP32-PICO-D4 / IDF v5.3 app) writes an ESP core dump to its coredump flash partition on a panic, and on the next boot crashreport_upload_async() (main/crashreport.c) POSTs the raw image to ${BASE}/api/dongle/coredump with the firmware version as a query param. The server stores them per-version, e.g. phoneblock/tmp/crash-reports/<version>/<device-uuid>-<YYYYMMDD>-<HHMMSS>.coredump.

This skill turns one of those files into a symbolized backtrace and a root-cause read. Do the whole flow — a decode against the wrong ELF is worse than useless (see step 2).

0. Find the files

bash
find / -type d -name '<version>' -path '*crash-reports*' 2>/dev/null   # e.g. .../crash-reports/1.5.0
ls -la <dir>

Those directories are sometimes owned by root with mode 0750. If you get "Permission denied" and sudo needs a password, ask the user to run sudo chown -R $USER:$USER <dir> (or chmod -R a+rX) themselves — don't burn turns retrying.

1. Strip the 24-byte flash header

The .coredump is not a bare ELF. It carries a 24-byte ESP flash core-dump header (data_len u32 = full file size, version u32 ≈ 0x0102, …). The real ELF magic \x7fELF begins at offset 24. Confirm, then strip:

bash
f=<file>.coredump
grep -aboF $'\x7fELF' "$f" | head -1          # must print "24:..."
tail -c +25 "$f" > "$SCRATCH/core.elf"        # SCRATCH = your scratchpad dir
xxd -l 8 "$SCRATCH/core.elf"                   # sanity: starts with 7f45 4c46

2. Get the EXACT-version unstripped ELF from the CDN

Critical. Symbolization is only trustworthy against the same build that produced the dump. A local checkout that is even a few commits past the dongle-vX.Y.Z tag mis-resolves every address — IDF-internal frames come out as nonsense (esp_startup_start_app_other_cores, wifi_transmit, …) that look plausible and will send you down a rabbit hole.

release.sh uploads the unstripped ELF to the CDN specifically for this (look for the phoneblock_dongle.elf copy + the espcoredump.py comment in firmware/scripts/release.sh). Pull it by version:

bash
curl -fsSL -o "$SCRATCH/dongle-<ver>.elf" \
  https://cdn.phoneblock.net/dongle/firmware/<ver>/phoneblock_dongle.elf
file "$SCRATCH/dongle-<ver>.elf"                       # "with debug_info, not stripped"
strings "$SCRATCH/dongle-<ver>.elf" | grep -Eo '<ver>' | head   # confirm version baked in

The CDN layout (from release.sh): base https://cdn.phoneblock.net/dongle/firmware/, then <version>/ holds phoneblock_dongle.{bin,elf}, bootloader.bin, partition-table.bin, ota_data_initial.bin, manifest.json; the stable/ and beta/ dirs hold the channel manifest.json that flips per release.

3. Decode with esp-coredump + the xtensa GDB

esp-coredump needs the Xtensa GDB, not system gdb. --chip is a global flag, before the subcommand.

bash
source ~/.espressif/python_env/idf5.3_py3.10_env/bin/activate
GDB=~/.espressif/tools/xtensa-esp-elf-gdb/*/xtensa-esp-elf-gdb/bin/xtensa-esp32-elf-gdb
esp-coredump --chip esp32 info_corefile --gdb $GDB \
    --core "$SCRATCH/core.elf" --core-format elf \
    "$SCRATCH/dongle-<ver>.elf" > "$SCRATCH/decoded-<ver>.txt" 2>/dev/null

Match check: in a correct decode the IDF frames resolve to the release build host path /home/bhu/... and the app frames to /home/bhu/git/phoneblock/.... If instead you see local /home/haui/... paths and absurd IDF frames, the ELF is the wrong build — go back to step 2. dbg_corefile (instead of info_corefile) drops you into an interactive gdb on the dump for deeper poking.

4. Read the dump

Key fields at the top:

  • Crashed task name + whether it was in interrupt context.
  • exccause: 0x1c LoadProhibitedCause / 0x1d StoreProhibited = deref of an invalid pointer; 0x02 InstrFetchProhibited = jumped through a bad function pointer; 0x09 LoadStoreAlignment; etc.
  • excvaddr: the bad address that was accessed. A value outside DRAM (0x3ffb0000–0x40000000) or IRAM is a wild pointer.
  • a0–a15: check for ASCII text in supposedly-pointer registers (bytes in the 0x20–0x7e range) — a fingerprint of string/HTTP data written over a struct or heap metadata.
  • Stack usage table: USED/FREE per task. A task at/near its limit ⇒ stack overflow (a different failure mode than heap corruption). Healthy free stack everywhere rules that out.
Show full SKILL.md (370 more words)Show less

5. Interpret — messenger vs. culprit

The top frame is often the victim, not the bug. The signature seen in 1.5.0:

httpd serving GET /api/status → add_system_load (web.c) → heap_caps_get_largest_free_block → tlsf_walk_pool → block_size faults on a wild block pointer (0x8d513e9…).

add_system_load only reads heap metadata; it crashed because it was the first code to walk an already-corrupted heap. A crash inside tlsf_* / multi_heap_* / heap_caps_* almost always means heap corruption that happened earlier — a use-after-free or buffer overflow whose write already returned. ASCII bytes sitting in the TLSF block header confirm an overrun. The originating write is NOT in the backtrace; you have to hunt it (step 6).

General rule: when the fault is deep in an allocator, ring buffer, or scheduler that "can't" be buggy, treat it as a corruption detector and look for who wrote out of bounds — don't file a bug against the IDF component.

6. Root-causing heap corruption

Single dumps prove corruption reached the field but rarely name the write. To catch it at the source:

  • CONFIG_HEAP_POISONING_COMPREHENSIVE (Component config → Heap memory debugging) on a test/beta build. It brackets every allocation with head/tail canaries and fills freed memory; the next heap op over a smashed region aborts with the offending allocation's info instead of crashing later elsewhere. Add periodic heap_caps_check_integrity_all(true) to shorten the gap between the bad write and the abort. (Comprehensive = every free byte is also poisoned, so a use-after-free write is caught too; the lighter CONFIG_HEAP_POISONING_LIGHT only checks canaries on alloc/free.)
  • Grep the suspect subsystem (the crashed task's normal work) for fixed-size buffers filled from external data — strcpy/memcpy/sprintf/snprintf whose bound isn't tied to the destination size. For the 1.5.0 httpd signature, that's the HTTP request path (header values, URI, query, POST body).
  • CONFIG_HEAP_TRACING (leaks / alloc history) and, on Xtensa, a watchpoint in dbg_corefile's gdb can corner a repeating offender.

Caveats

  • Don't over-claim from one dump. State the confirmed fault, name the most likely cause, and flag it as a single data point. ASCII-in-metadata hints at the payload's origin but doesn't prove the specific write site.
  • Verify addresses against the memory map before calling a pointer "wild"; note the <optimized out> frames are inlined, not missing.

Save the decoded .txt and the pulled ELF to the scratchpad so re-reads are free.

© haumacher, GPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/dongle-crash-analysis of haumacher/phoneblock.

Open the folder on GitHubat commit 9287ad7

Compare with similar skills

Dongle Crash Analysis next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Dongle Crash Analysis compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Dongle Crash Analysis this skillhaumacher/phoneblock367—~1.9kAutomated safety check: NotesGPL-3.0
Embedded DebugFastLED/FastLED7.5k—~1.4kAutomated safety check: PassMIT
Sentry Crash Analysishyvanmielenpelit/GnollHack161—~222Automated safety check: PassCustom licence
React Native Best Practicesvercel-labs/openreview1.7k17 repos~1.1kAutomated safety check: PassMIT
RuView CLI, API and WASMruvnet/RuView97k—~1.2kAutomated safety check: NotesMIT
RuView Deployment Configurationruvnet/RuView97k—~1.7kAutomated safety check: NotesMIT

Similar skills

  • Embedded Debug

    FastLED/FastLED

    Firmware crash analysis, stack trace decoder, and register dump interpreter for ESP32/ARM/AVR platforms.

    7.5k GitHub stars~1.4k tokensUpdated today
    DevelopmentAuto-check passed
  • Sentry Crash Analysis

    hyvanmielenpelit/GnollHack

    Systematic methodology for diagnosing GnollHack crash reports from the Sentry MCP server.

    161 GitHub stars~222 tokensUpdated yesterday
    MobileAuto-check passed
  • React Native Best Practices

    vercel-labs/openreview

    Official

    A prioritized rule set for React Native and Expo apps covering list performance, animation, navigation, UI patterns, state, rendering, monorepos and configuration.

    1.7k GitHub starsUsed in 17 repos~1.1k tokens
    MobileAuto-check passed
  • Covers the RuView `wifi-densepose` command line binary, its Axum REST API and the WebAssembly builds for browsers and ESP32, for embedding or scripting RuView.

    97k GitHub stars~1.2k tokensUpdated today
    Backend & APIsAuto-check: notes
  • Tunes a deployed RuView WiFi-sensing system without changing code: firmware sdkconfig variants, NVS provisioning over serial, channel and MAC filtering, edge processing tiers and mesh slotting.

    97k GitHub stars~1.7k tokensUpdated today
    DevOps & CloudAuto-check: notes
  • Brings a RuView CSI sensing node online by building ESP32-S3 or ESP32-C6 firmware, flashing the board, provisioning WiFi and checking the serial output.

    97k GitHub stars~1.8k tokensUpdated today
    DevelopmentAuto-check: notes

More from haumacher/phoneblock

  • Cleanup Workspace

    haumacher/phoneblock

    Park a finished worktree — commit real work, delete temporary/generated leftovers, then switch to the throwaway branch named after the workspace directory and reset it to origin/master.

    367 GitHub stars~1.1k tokensUpdated 8 days ago
    Auto-check: notes
  • Fix Issue

    haumacher/phoneblock

    Start work on a GitHub issue — verify a clean workspace, read the issue, branch off the correct base (the branch where the fix will ship) as issue-<nr-<short-description, then plan the implementation.

    367 GitHub stars~1.1k tokensUpdated 8 days ago
    Auto-check: notes
  • Diag Tuning

    haumacher/phoneblock

    Tune the PhoneBlock diagnostics log analysis — inspect aggregated log signatures, find noise / signature fragmentation / PII leaks, and propose, audit and promote scrub rules (and detection rules)…

    367 GitHub stars~2.1k tokensUpdated 8 days ago
    Auto-check passed

Works with

Categories

Questions about Dongle Crash Analysis

What does Dongle Crash Analysis do?

Decode and analyze an ESP32 dongle crash report (uploaded .coredump). Dongle Crash Analysis is an agent skill from haumacher/phoneblock.coredump).

When should I use Dongle Crash Analysis?

Dongle Crash Analysis fits situations like: asked to analyze the crash report; look at a .coredump; resolve a dongle backtrace.

How do I install Dongle Crash Analysis in Claude Code?

Run `npx skills add haumacher/phoneblock --skill dongle-crash-analysis -a claude-code`. Or copy the skill folder (.claude/skills/dongle-crash-analysis in haumacher/phoneblock) into .claude/skills/dongle-crash-analysis in your project. Claude Code loads it when a task matches its description.

How do I install Dongle Crash Analysis in Codex?

Run `npx skills add haumacher/phoneblock --skill dongle-crash-analysis -a codex`. Or copy the skill folder (.claude/skills/dongle-crash-analysis in haumacher/phoneblock) into .agents/skills/dongle-crash-analysis in your project. Codex loads it when a task matches its description.

Can I use Dongle Crash Analysis in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add haumacher/phoneblock --skill dongle-crash-analysis -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/dongle-crash-analysis, .gemini/skills/dongle-crash-analysis, .github/skills/dongle-crash-analysis and .opencode/skills/dongle-crash-analysis in your project.

What does Dongle Crash Analysis need to run?

Going by SKILL.md and its folder, Dongle Crash Analysis needs the command-line tools its instructions call (curl). Its frontmatter pre-approves these tools: Bash, Read, Glob, Grep.

Does Dongle Crash Analysis access the network?

SKILL.md names 1 domain. In commands or code: cdn.phoneblock.net; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Dongle Crash Analysis safe to install?

Our automated static check of SKILL.md found notes only (runs commands with sudo; pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Dongle Crash Analysis use?

Dongle Crash Analysis is published under the GPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Dongle Crash Analysis use?

About 1.9k tokens (SKILL.md is roughly 7.6k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Dongle Crash Analysis?

Skills that share tags, products or a category with Dongle Crash Analysis: Embedded Debug (FastLED/FastLED, 7.5k stars), Sentry Crash Analysis (hyvanmielenpelit/GnollHack, 161 stars), React Native Best Practices (vercel-labs/openreview, 1.7k stars) and RuView CLI, API and WASM (ruvnet/RuView, 97k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Dongle Crash Analysis?

haumacher (a GitHub user) maintains it in haumacher/phoneblock, which has 367 GitHub stars. The repository holds 4 skills in this directory. The repository was last updated on October 3, 2026.

Source: haumacher/phoneblock on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.