Skip to content

Releases: pablogsal/stackpulse

stackpulse 0.12.1

Choose a tag to compare

@github-actions github-actions released this 20 Sep 21:33
aba69bc

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-stackpulse 0.17.1 to preserve frame-pointer fallback before the first indexed FDE.

Added

  • Publish stackpulse-jit 0.1.0 for GDB JIT discovery, symbols, and unwind data without perf dependencies. StackPulse preserves the stackpulse::jit API and its existing custom-symbolizer feature behavior.
  • Share the JIT overlay assembler fixture through stackpulse_jit::fixtures, preserving the StackPulse benchmark import.
  • RecorderBuilder::sampling_event can select software CPU-clock sampling. Hardware CPU cycles remain the default.

stackpulse 0.12.0

Choose a tag to compare

@github-actions github-actions released this 19 Sep 19:09
129a602

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-stackpulse to 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

Choose a tag to compare

@github-actions github-actions released this 07 Sep 17:02
cb2ebcd

Fixed

  • framehop-stackpulse 0.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

Choose a tag to compare

@github-actions github-actions released this 06 Sep 19:51
be318cd

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-stackpulse 0.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

Choose a tag to compare

@github-actions github-actions released this 05 Sep 03:27
8423371

Added

  • Tail::discard_consumed can release filesystem blocks for batches already processed by a recorder-owned tail.

stackpulse 0.10.1

Choose a tag to compare

@github-actions github-actions released this 05 Sep 03:12
8bffae5

Changed

  • StackPulse now maintains its Framehop integration as the separately published framehop-stackpulse workspace 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

Choose a tag to compare

@github-actions github-actions released this 03 Sep 21:48
22dc3b0

Added

  • Tail incrementally reads a growing spool into bounded, reusable sample batches. Symbolizer::update applies definition and symbol-source changes and reports invalidations for caller-owned prepared-stack caches.
  • Recorder::tail shares validated image handles with a live reader, and native symbolizer plug-ins receive module-retirement notifications.

Changed

  • Snapshot and Replay now accept only the current SPULSE3 format.
  • CI no longer checks public API compatibility against the previous crates.io release.

stackpulse 0.9.0

Choose a tag to compare

@github-actions github-actions released this 01 Sep 23:40
ad36cc0

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 to linux::module_tracking.
  • AArch64 unwinding now strips pointer-authentication bits from recovered return addresses.
  • Recording, spool reading, and symbolization now use the Recorder, Snapshot, Replay, and Symbolizer APIs. Typed Pid and Tid values reject invalid identifiers at the boundary, and Recorder::poll combines waiting with event draining.
  • Native symbolizers now receive batched NativeLookup requests. Symbolizer::resolve returns borrowed resolved stacks and supports caller-owned stack caching.
  • NativeModule and NativeLookup have 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::TargetGone distinguishes a vanished process while retaining the original OS error.

stackpulse 0.8.0

Choose a tag to compare

@pablogsal pablogsal released this 22 Aug 16:40
9b9578a

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

Choose a tag to compare

@pablogsal pablogsal released this 20 Aug 16:54
86aac67

Fixed

  • Prefer the PT_LOAD segment at an executable mapping's starting file offset when resolving ELF image bases for coarse mappings.