Rust - 调试与发布模式的堆栈大小是不是不同?

Posted

技术标签:

【中文标题】Rust - 调试与发布模式的堆栈大小是不是不同?【英文标题】:Rust - Is the stack size different for debug vs. release mode?Rust - 调试与发布模式的堆栈大小是否不同? 【发布时间】:2021-04-29 09:44:55 【问题描述】:

考虑以下程序:

fn recursive_call(x: u32) -> u32 
    println!("x: :?", x);
    recursive_call(x +1)


fn main() 
    recursive_call(0);

当我运行cargo build && ./target/debug/recursive_call 时,在x: 58152 之后崩溃:

x: 58152

thread 'main' has overflowed its stack
fatal runtime error: stack overflow
Aborted (core dumped)

当我运行cargo build --release && ./target/release/recursive_call 时,它仅在x: 104728 之后崩溃:

x: 104728

thread 'main' has overflowed its stack
[...]

我想知道这种行为差异从何而来?发布与调试模式的堆栈大小是否不同?或者这是因为我缺少一些编译时优化(如果是,那么优化是什么?)

【问题讨论】:

【参考方案1】:

是的,according to Godbolt 在 x86-64 上,调试模式下函数的保留堆栈大小为 120 字节,启用优化 (-O) 为 72 字节。这很正常。

【讨论】:

【参考方案2】:

调试和发布的堆栈大小相同(除非您有线程,否则堆栈大小实际上是由操作系统固定的,参见例如 Linux 上的ulimit -s)。但是堆栈使用可能会有所不同,因为在调试模式下,编译器会向每个堆栈帧添加一些数据以帮助调试器找到局部变量。

注意tail-call optimization may cause the compiler to remove the recursion 并允许在释放模式下无限循环。

【讨论】:

以上是关于Rust - 调试与发布模式的堆栈大小是不是不同?的主要内容,如果未能解决你的问题,请参考以下文章

在发布与调试模式下生成本地堆栈变量的代码

Rust 堆栈大小 [重复]

如何增加 Rust 库可用的堆栈大小?

是否可以在 Rust 运行时确定大小的堆栈分配数组?

使用 DTrace 在 Rust 上获取堆栈跟踪/分析数据

调试器如何跟踪堆栈?