Skip to content

Conversation

@adambratschikaye
Copy link
Contributor

Add Config::wasm_backtrace_max_frames option to limit the number of frames collected in backtraces and set the default at 20. This helps prevent expensive work from very deep call stacks.

Setting the value to 0 is the same as disabling backtraces and so this change deprecates Config::wasm_backtrace.

Addresses #5052

Add `Config::wasm_backtrace_max_frames` option to limit the number of
frames collected in backtraces and set the default at 20. This helps
prevent expensive work from very deep call stacks.

Setting the value to 0 is the same as disabling backtraces and so this
change deprecates `Config::wasm_backtrace`.

Addresses bytecodealliance#5052
@adambratschikaye adambratschikaye requested a review from a team as a code owner February 9, 2026 15:23
@adambratschikaye adambratschikaye requested review from fitzgen and removed request for a team February 9, 2026 15:23
@github-actions github-actions bot added wasmtime:api Related to the API of the `wasmtime` crate itself wasmtime:config Issues related to the configuration of Wasmtime labels Feb 9, 2026
Copy link
Member

@fitzgen fitzgen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks! A couple nitpicks inline below before we merge this.

pub(crate) disabled_features: WasmFeatures,
pub(crate) wasm_backtrace: bool,
pub(crate) wasm_backtrace_details_env_used: bool,
pub(crate) wasm_backtrace_max_frames: usize,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we represent this as an Option<NonZeroUsize>? That will make use sites clearer, rather than checking for zero.

Comment on lines 454 to 460
if enable {
if self.wasm_backtrace_max_frames == 0 {
self.wasm_backtrace_max_frames = DEFAULT_WASM_BACKTRACE_MAX_FRAMES;
}
} else {
self.wasm_backtrace_max_frames = 0;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor nitpick, but I think the logic is a little more clear when collapsing the nested conditionals into a single match:

Suggested change
if enable {
if self.wasm_backtrace_max_frames == 0 {
self.wasm_backtrace_max_frames = DEFAULT_WASM_BACKTRACE_MAX_FRAMES;
}
} else {
self.wasm_backtrace_max_frames = 0;
}
match (enable, self.wasm_backtrace_max_frames) {
(false, _) => self.wasm_backtrace_max_frames = None,
// Wasm backtraces were disabled; enable them with the
// default maximum number of frames to capture.
(true, None) => self.wasm_backtrace_max_frames = {
Some(NonZeroUsize::new(DEFAULT_WASM_BACKTRACE_MAX_FRAMES).unwrap());
}
// Wasm backtraces are already enabled; keep the existing
// max-frames configuration.
(true, Some(_)) => {}
}

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(Also, we could avoid the NonZeroUsize::new(...).unwrap() noise here by making the DEFAULT_WASM_BACKTRACE_MAX_FRAMES constant be a NonZeroUsize already.)

@github-actions
Copy link

github-actions bot commented Feb 9, 2026

Label Messager: wasmtime:config

It looks like you are changing Wasmtime's configuration options. Make sure to
complete this check list:

  • If you added a new Config method, you wrote extensive documentation for
    it.

    Details

    Our documentation should be of the following form:

    Short, simple summary sentence.
    
    More details. These details can be multiple paragraphs. There should be
    information about not just the method, but its parameters and results as
    well.
    
    Is this method fallible? If so, when can it return an error?
    
    Can this method panic? If so, when does it panic?
    
    # Example
    
    Optional example here.
    
  • If you added a new Config method, or modified an existing one, you
    ensured that this configuration is exercised by the fuzz targets.

    Details

    For example, if you expose a new strategy for allocating the next instance
    slot inside the pooling allocator, you should ensure that at least one of our
    fuzz targets exercises that new strategy.

    Often, all that is required of you is to ensure that there is a knob for this
    configuration option in wasmtime_fuzzing::Config (or one
    of its nested structs).

    Rarely, this may require authoring a new fuzz target to specifically test this
    configuration. See our docs on fuzzing for more details.

  • If you are enabling a configuration option by default, make sure that it
    has been fuzzed for at least two weeks before turning it on by default.


Details

To modify this label's message, edit the .github/label-messager/wasmtime-config.md file.

To add new label messages or remove existing label messages, edit the
.github/label-messager.json configuration file.

Learn more.

trap_pc: Option<usize>,
max_frames: usize,
) -> Self {
let mut wasm_trace = Vec::<FrameInfo>::with_capacity(runtime_trace.frames().len());

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
let mut wasm_trace = Vec::<FrameInfo>::with_capacity(runtime_trace.frames().len());
let mut wasm_trace = Vec::<FrameInfo>::with_capacity(max_frames);

@adambratschikaye
Copy link
Contributor Author

Regarding the note on fuzzing - I guess we don't need to do anything because fuzzing always used the default of enabling backtraces and that isn't changing.

Copy link
Member

@fitzgen fitzgen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@fitzgen fitzgen added this pull request to the merge queue Feb 10, 2026
@github-merge-queue github-merge-queue bot removed this pull request from the merge queue due to failed status checks Feb 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

wasmtime:api Related to the API of the `wasmtime` crate itself wasmtime:config Issues related to the configuration of Wasmtime

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants