Releases: pablogsal/stackpulse
Releases · pablogsal/stackpulse
Release list
stackpulse 0.12.1
Fixed
- Discard and count kernel-mode records when kernel capture is disabled, before using their saved user registers for unwinding.
- Use the registered object's text base consistently across executable sections sharing JIT unwind data.
- Index shared JIT unwind tables with 64-bit addresses when executable sections are more than 4 GiB apart.
- Keep JIT registration updates current across mapping changes, metadata retries, removal, and address reuse without replacing symbol identities during CFI-only refreshes.
- Require
framehop-stackpulse0.17.1 to preserve frame-pointer fallback before the first indexed FDE.
Added
- Publish
stackpulse-jit0.1.0 for GDB JIT discovery, symbols, and unwind data without perf dependencies. StackPulse preserves thestackpulse::jitAPI and its existing custom-symbolizer feature behavior. - Share the JIT overlay assembler fixture through
stackpulse_jit::fixtures, preserving the StackPulse benchmark import. RecorderBuilder::sampling_eventcan select software CPU-clock sampling. Hardware CPU cycles remain the default.
stackpulse 0.12.0
Added
- Record generated function names and recover callers through the GDB JIT interface, including supported LLVM MCJIT workloads. Saved names remain available after code removal, address reuse, and process exit.
- Refresh runtime information when unwinding fails inside known JIT code, then retry the captured stack once if the information changed.
- Add a JIT recording guide with runtime settings, update timing, and measured cost.
Changed
- Recordings with registered JIT code require an updated reader. Recordings without JIT entries remain compatible with StackPulse 0.11 readers.
- Update
framehop-stackpulseto 0.17.0 and Gimli to 0.34. Framehop's public DWARF errors now contain Gimli 0.34 errors. - Update the locked rustls and rustls-webpki patch releases.
Performance
- Skip repeated JIT checks after confirming that no supported runtime is present. Reuse temporary storage during metadata checks and avoid rescanning executables after unrelated anonymous mapping changes.
stackpulse 0.11.1
Fixed
framehop-stackpulse0.16.5 treats a zero frame pointer as the end of a fallback walk, so loader entry frames no longer produce a false truncated-stack marker.
stackpulse 0.11.0
Changed
- Breaking API redesign: recorder builders and prepared launches, source-bound samples and stacks, repeatable resolved frames, and identity-bound process handles replace the previous public interfaces without compatibility wrappers.
- Recorder-owned live readers expose published batches, completion and failures. Disposable spools reclaim consumed pages as the linked reader advances.
- Live symbolization sessions manage bounded caller-produced stack values and invalidate them when native or perf-map symbols change.
- Native backends receive paired lookup/result batches, report persistent refresh generations, and borrow retained image handles.
- SPULSE4 records nanosecond sampling intervals, optional monotonic/wall-clock correlation, and native paths preserving operating-system bytes. Earlier spool versions are rejected.
- Python source positions use optional coordinates, and truncated stacks have an explicit frame variant.
- StackPulse now requires
framehop-stackpulse0.16.4.
Fixed
- AArch64 unwinding can recover the stack pointer when a frame-pointer fallback is followed by an SP-relative DWARF rule.
- Frame-pointer fallback diagnostics are tested through the rule cache, including retry after sample-dependent DWARF failures.
- Unwind-cache generation rollover cannot reuse stale rules.
- Adding counters to a paused recording keeps them paused. Terminal writer failures prevent subsequent records, and finish errors retain final recording counters and cleanup sources.
Performance
- Prepared-stack cache hits avoid symbol resolution; warmed repeated live batches and module clones avoid allocations.
- Recorded modules, module identities, and native mappings share immutable path storage.
- Live sessions reuse mapping-context storage and perf-map paths between batches, including batches introducing new frames.
- Module indexes sort existing entries, stack compaction uses smaller temporary buffers, and inherited threads skip unnecessary counter setup.
stackpulse 0.10.2
Added
Tail::discard_consumedcan release filesystem blocks for batches already processed by a recorder-owned tail.
stackpulse 0.10.1
Changed
- StackPulse now maintains its Framehop integration as the separately published
framehop-stackpulseworkspace crate. - Linux perf samples now capture every x86-64 general-purpose register needed by DWARF CFA expressions.
- Recording summaries report why native unwinding used frame-pointer fallback.
stackpulse 0.10.0
Added
Tailincrementally reads a growing spool into bounded, reusable sample batches.Symbolizer::updateapplies definition and symbol-source changes and reports invalidations for caller-owned prepared-stack caches.Recorder::tailshares validated image handles with a live reader, and native symbolizer plug-ins receive module-retirement notifications.
Changed
SnapshotandReplaynow accept only the current SPULSE3 format.- CI no longer checks public API compatibility against the previous crates.io release.
stackpulse 0.9.0
Changed
- Linux capture now holds zero-copy ring records until timestamp ordering releases them, uses bounded loss/recovery pacing, and reports the effective per-CPU data-ring capacity.
- Perf rings use a 1 GiB aggregate recorder budget and a 256 MiB per-CPU ceiling. Wakeup watermarks follow the effective budgeted or fallback capacity.
- Forked processes reuse inherited unwind and ELF state. Shared ELF retention is bounded by image count and bytes.
- CI now tests Linux x86-64 and AArch64, Rust 1.88, and every Cargo feature combination.
- CI audits
Cargo.lock, checks public API compatibility, verifies the packaged crate, and rejects undocumented unsafe blocks and unannotated explicit panics in library code. - Rustdoc now links tutorials, recipes, reference material, design notes, and the SPULSE format contract. GitHub Pages publishes the generated documentation.
- Perf-map parsing moved to
symbolize::perf_map; executable module tracking moved tolinux::module_tracking. - AArch64 unwinding now strips pointer-authentication bits from recovered return addresses.
- Recording, spool reading, and symbolization now use the
Recorder,Snapshot,Replay, andSymbolizerAPIs. TypedPidandTidvalues reject invalid identifiers at the boundary, andRecorder::pollcombines waiting with event draining. - Native symbolizers now receive batched
NativeLookuprequests.Symbolizer::resolvereturns borrowed resolved stacks and supports caller-owned stack caching. NativeModuleandNativeLookuphave public constructors for custom-symbolizer tests, with opaque image identities generated by StackPulse.- Recording, process management, liveness checks, spool reading, and symbolization return
stackpulse::Result.ErrorKind::TargetGonedistinguishes a vanished process while retaining the original OS error.
stackpulse 0.8.0
Makes built-in Wholesym support optional for consumers with their own symbolizer, avoids an unnecessary native-symbol setup path when disabled, and returns standard process exit statuses. Also updates Nix to 0.31 and trims unused unwind-format support.
stackpulse 0.7.1
Fixed
- Prefer the
PT_LOADsegment at an executable mapping's starting file offset when resolving ELF image bases for coarse mappings.