You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Rust中如何获取当前栈帧深度?

Rust 获取当前栈帧深度实现方案

实现思路为通过捕获调用栈回溯,过滤掉无关帧后统计有效栈帧数量,即可得到当前的函数调用层数。

第一步:添加依赖

在Cargo.toml中加入backtrace库依赖,该库支持跨平台捕获调用栈信息:

[dependencies]
backtrace = "0.3"

第二步:实现栈帧深度统计函数

简易版(需手动调整偏移量)

use backtrace::Backtrace;

fn stack_frame_depth() -> usize {
    let bt = Backtrace::new();
    // 跳过的帧数包含backtrace内部实现帧、当前stack_frame_depth函数自身的帧
    // 可根据实际运行输出调整偏移量,匹配你预期的数值基准
    const SKIP_FRAMES: usize = 3;
    bt.frames().len().saturating_sub(SKIP_FRAMES)
}

fn print_depths() {
    println!("stack frame depth {}", stack_frame_depth());
    fn print_depth2() {
        println!("stack frame depth {}", stack_frame_depth());
    }
    print_depth2();
}

pub fn main() {
    print_depths();
}

兼容版(自动过滤无关帧)

如果需要避免不同编译配置、不同平台下偏移量波动的问题,可以通过匹配符号名实现自动过滤,无需手动调整偏移:

use backtrace::Backtrace;

fn stack_frame_depth() -> usize {
    let bt = Backtrace::new();
    let mut depth = 0;
    let mut found_self = false;
    for frame in bt.frames() {
        for sym in frame.symbols() {
            if let Some(name) = sym.name() {
                let name_str = name.to_string();
                // 先找到当前函数自身的帧,之后的帧才是调用栈的有效层级
                if !found_self && name_str.contains("stack_frame_depth") {
                    found_self = true;
                    continue;
                }
                if found_self {
                    depth += 1;
                }
            }
        }
    }
    depth
}

fn print_depths() {
    println!("stack frame depth {}", stack_frame_depth());
    fn print_depth2() {
        println!("stack frame depth {}", stack_frame_depth());
    }
    print_depth2();
}

pub fn main() {
    print_depths();
}

补充说明

  • 由于main函数本身存在运行时上层调用(比如标准库的启动入口),默认输出的数值会比示例中的1、2多一个固定偏移,调整简易版的SKIP_FRAMES数值即可对齐你想要的计数基准。
  • 上述方案适用于通用用户态Rust程序,如果是no_std裸机场景,需要结合目标架构的栈指针寄存器自行实现栈帧遍历逻辑。

内容的提问来源于stack exchange,提问作者JamesThomasMoon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:18:05