stackpulse 0.2.0

Linux perf_event stack sampling with native unwinding, symbolization, and compact spooling
Documentation
# Changelog

## 0.2.0 - 2026-07-18

### Fixed

- ELF image-base correlation accepts legitimate page-rounded load-segment tails while rejecting ambiguous shared boundary pages.
- Process-image changes, overlapping executable remaps, and lost perf lifecycle records now rebuild stale module and Framehop state.
- Exact-address DSO reuse and partial `MAP_FIXED` replacements now retain correct module generations and surviving VMA fragments.
- LOST recovery now runs at a forward event boundary, rescans every tracked image, and repairs missed child/thread bookkeeping.
- Thread-group leader exit no longer tears down profiling state while sibling threads are still running.
- Exited process perf and pidfd state is released promptly, preventing descriptor exhaustion under process churn.
- 32-bit perf register samples no longer enter the native 64-bit unwinder.
- Transient and deleted mapped ELF files can be retried and opened through `/proc/<pid>/map_files` while the target is alive.
- Unresolved or invalid image bases no longer poison symbol caches or produce wrapped AVMA/SVMA translations.
- Live native unwinding now consumes canonical assigned module IDs instead of aliasing unrelated ELF files through ID zero.
- Device and inode-generation identity are retained across MMAP2 events, profile files, and symbolizer reuse.
- vDSO mappings now provide ELF unwind information when the target mapping is readable.
- Attaching waits for the complete thread group to stop and resumes only processes Stackpulse stopped itself.

### Performance

- Perf recording no longer requests non-executable MMAP traffic that Stackpulse does not consume.
- Sampling counters share bounded output rings instead of allocating a full mmap ring for every CPU/task pair.
- Repeated mappings of the same ELF reuse symbolizer state, keeping high-churn `dlopen` workloads bounded.

### Changed

- `ModuleRecord` now exposes device and inode-generation identity for mapped files.
- New profiles use spool format `SPULSE3`; the reader remains compatible with `SPULSE1` and `SPULSE2` profiles.

## 0.1.4 - 2026-07-06

### Fixed

- Perf-mode native unwinding now resolves ELF image bases correctly for large executable mappings that span multiple load segments.
- Perf-mode module tracking now reconciles executable mappings from `/proc/<pid>/maps` when a sampled user address is not covered by the current module table.

## 0.1.3 - 2026-07-06

### Fixed

- Kernel frames resolve more reliably when kernel symbol data is sparse or only partially available.
- Truncated user stacks are reported consistently when perf samples are missing user-register state or contain a truncated user callchain tail.
- Missing user-register samples are counted separately as `NativeUserRegistersMissing` instead of being grouped with generic register-capture failures.

## 0.1.2 - 2026-07-05

### Fixed

- Recording and profile reads are more resilient to malformed ELF data and truncated spool files.
- Truncated stack markers are preserved when reading and symbolizing profiles.
- Child and forked process profiling is more reliable and respects live kernel perf frequency limits.
- Symbolization works correctly when called from inside an existing Tokio runtime.
- Kernel symbolization handles malformed or unavailable kernel symbol data more gracefully.
- `NativeSymbol::offset` and `inline_depth` documentation now match their actual meanings.

### Changed

- Examples, tutorials, API docs, and reference docs were updated for the current recorder and symbolizer behavior.

### Performance

- Perf event draining and symbolization are faster on repeated or high-volume profiles.