Embedded Debug
FastLED/FastLED
Firmware crash analysis, stack trace decoder, and register dump interpreter for ESP32/ARM/AVR platforms.
Decode and analyze an ESP32 dongle crash report (uploaded .coredump).
$ npx skills add haumacher/phoneblock --skill dongle-crash-analysis -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install haumacher/phoneblock dongle-crash-analysis --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ 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-srcUse ~/.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/
Install the "dongle-crash-analysis" agent skill from https://github.com/haumacher/phoneblock/tree/master/.claude/skills/dongle-crash-analysis into .claude/skills/dongle-crash-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dongle-crash-analysis", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/haumacher/phoneblock/tree/master/.claude/skills/dongle-crash-analysisType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add haumacher/phoneblock --skill dongle-crash-analysis -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install haumacher/phoneblock dongle-crash-analysis --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/haumacher/phoneblock.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/dongle-crash-analysis .agents/skills/dongle-crash-analysis && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "dongle-crash-analysis" agent skill from https://github.com/haumacher/phoneblock/tree/master/.claude/skills/dongle-crash-analysis into .agents/skills/dongle-crash-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dongle-crash-analysis", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add haumacher/phoneblock --skill dongle-crash-analysis -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install haumacher/phoneblock dongle-crash-analysis --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/haumacher/phoneblock.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/dongle-crash-analysis .cursor/skills/dongle-crash-analysis && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "dongle-crash-analysis" agent skill from https://github.com/haumacher/phoneblock/tree/master/.claude/skills/dongle-crash-analysis into .cursor/skills/dongle-crash-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dongle-crash-analysis", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/haumacher/phoneblock.git --path .claude/skills/dongle-crash-analysis--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add haumacher/phoneblock --skill dongle-crash-analysis -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install haumacher/phoneblock dongle-crash-analysis --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/haumacher/phoneblock.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/dongle-crash-analysis .gemini/skills/dongle-crash-analysis && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "dongle-crash-analysis" agent skill from https://github.com/haumacher/phoneblock/tree/master/.claude/skills/dongle-crash-analysis into .gemini/skills/dongle-crash-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dongle-crash-analysis", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install haumacher/phoneblock dongle-crash-analysisInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add haumacher/phoneblock --skill dongle-crash-analysis -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/haumacher/phoneblock.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/dongle-crash-analysis .github/skills/dongle-crash-analysis && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "dongle-crash-analysis" agent skill from https://github.com/haumacher/phoneblock/tree/master/.claude/skills/dongle-crash-analysis into .github/skills/dongle-crash-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dongle-crash-analysis", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add haumacher/phoneblock --skill dongle-crash-analysis -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install haumacher/phoneblock dongle-crash-analysis --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/haumacher/phoneblock.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/dongle-crash-analysis .opencode/skills/dongle-crash-analysis && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "dongle-crash-analysis" agent skill from https://github.com/haumacher/phoneblock/tree/master/.claude/skills/dongle-crash-analysis into .opencode/skills/dongle-crash-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dongle-crash-analysis", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
dongle-crash-analysisDecode and analyze an ESP32 dongle crash report (uploaded .coredump).
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.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 9287ad7. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
BashReadGlobGrepFrom allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
curlFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
cdn.phoneblock.netFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
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.
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.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
`sudo chown -R $USER:$USER <dir>` (or `chmod -R a+rX`) themselves — don't burnallowed-tools: Bash, Read, Glob, GrepAutomated 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.
The full file from haumacher/phoneblock at commit 9287ad7, republished under its GPL-3.0 licence (© haumacher). 842 words, ~1,889 tokens.
.claude/skills/dongle-crash-analysis/SKILL.md (or your agent's skills folder).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).
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.
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:
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 4c46Critical. 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:
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 inThe 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.
esp-coredump needs the Xtensa GDB, not system gdb. --chip is a global
flag, before the subcommand.
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/nullMatch 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.
Key fields at the top:
0x1c LoadProhibitedCause / 0x1d StoreProhibited = deref of an
invalid pointer; 0x02 InstrFetchProhibited = jumped through a bad function
pointer; 0x09 LoadStoreAlignment; etc.0x3ffb0000–0x40000000) or IRAM is a wild pointer.0x20–0x7e range) — a fingerprint of string/HTTP data written over a struct or
heap metadata.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.The top frame is often the victim, not the bug. The signature seen in 1.5.0:
httpdservingGET /api/status→add_system_load(web.c) →heap_caps_get_largest_free_block→tlsf_walk_pool→block_sizefaults 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.
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.)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.<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
Just SKILL.md in .claude/skills/dongle-crash-analysis of haumacher/phoneblock.
Open the folder on GitHubat commit 9287ad7
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Dongle Crash Analysis this skillhaumacher/phoneblock | 367 | — | ~1.9k | Automated safety check: Notes | GPL-3.0 | |
| Embedded DebugFastLED/FastLED | 7.5k | — | ~1.4k | Automated safety check: Pass | MIT | |
| Sentry Crash Analysishyvanmielenpelit/GnollHack | 161 | — | ~222 | Automated safety check: Pass | Custom licence | |
| React Native Best Practicesvercel-labs/openreview | 1.7k | 17 repos | ~1.1k | Automated safety check: Pass | MIT | |
| RuView CLI, API and WASMruvnet/RuView | 97k | — | ~1.2k | Automated safety check: Notes | MIT | |
| RuView Deployment Configurationruvnet/RuView | 97k | — | ~1.7k | Automated safety check: Notes | MIT |
FastLED/FastLED
Firmware crash analysis, stack trace decoder, and register dump interpreter for ESP32/ARM/AVR platforms.
hyvanmielenpelit/GnollHack
Systematic methodology for diagnosing GnollHack crash reports from the Sentry MCP server.
vercel-labs/openreview
A prioritized rule set for React Native and Expo apps covering list performance, animation, navigation, UI patterns, state, rendering, monorepos and configuration.
ruvnet/RuView
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.
ruvnet/RuView
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.
ruvnet/RuView
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.
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.
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.
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)…
Works with
Categories
Decode and analyze an ESP32 dongle crash report (uploaded .coredump). Dongle Crash Analysis is an agent skill from haumacher/phoneblock.coredump).
Dongle Crash Analysis fits situations like: asked to analyze the crash report; look at a .coredump; resolve a dongle backtrace.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.