Rust异步代码栈溢出排查:寻求类堆分析器的栈分析工具
Rust异步代码栈溢出排查与解决
问题现象
- Rust默认2MiB栈空间无法支撑一段基础代码运行,程序直接崩溃
- 仅当设置环境变量
RUST_MIN_STACK=4159616(约3.97MiB)时程序可正常执行,哪怕仅减小1字节到RUST_MIN_STACK=4159615,仍会触发栈溢出 - 问题发生在Glommio异步运行时的单元测试启动逻辑中,调用链深度并不高
排查细节
- 栈上的核心闭包大小仅350KiB,理论上不足以耗尽默认栈空间,推测存在未被发现的大量隐式栈分配
- 尝试使用valgrind/massif、asan工具排查,但这类工具仅针对堆分配分析,无法提供栈占用的有效信息
- 版本差异对比:
- Debug构建版本需要至少约3.97MiB栈空间才能运行
- 开启LTO的Release构建版本仅需约2.65MiB(
RUST_MIN_STACK=2774720),Debug版本比Release多占用约1.38MiB栈空间
- 最终定位到异步机制的隐藏开销:通过
run_async执行异步闭包时,虽然闭包本身大小有限,但随着异步操作数量增加,future对应的栈占用会持续累积增长,直至超出栈空间上限
临时修复方案
通过Box::pin将future分配到堆内存中,彻底规避栈溢出问题
遗留问题
目前仍缺乏有效的手段,能够提前检测出大型future或其栈占用过高的情况,希望能找到对应的静态分析方法或工具链支持
内容的提问来源于stack exchange,提问作者Vitali
相关产品推荐
相关产品推荐

