当试图运行一个构建大clap::App(find the source here)的程序时,我得到一个stackoverflow:thread '<main>' has overflowed its stack.

到目前为止,我还不知道如何指示rustc为蛮力解决方案增加堆栈大小.RUST_MIN_STACK似乎只适用于运行时,即使在那里,它似乎也没有任何效果.

在生成代码时,我可能需要做的是将SubCommand创建移动到运行时,这就是我接下来要try 的.

However, do you see a way to fix this differently ?

It seems quite important to figure this one out as the builder patterns appears to be prone to this issue, if the built structure is just large and nested enough.

How to reproduce

git clone -b clap https://github.com/Byron/google-apis-rs
cd google-apis-rs
git checkout 9a8ae4b
make dfareporting2d1-cli-cargo ARGS=run

请注意,您将需要我的fork of quasi,并在本地设置一个覆盖,以允许使用最新的编译器进行构建.

Meta

➜  google-apis-rs git:(clap) rustc --version
rustc 1.1.0-nightly (97d4e76c2 2015-04-27) (built 2015-04-28)

推荐答案

无法设置主线程的堆栈大小.事实上,关于主线程堆栈大小的假设是在Rust运行时库(https://github.com/rust-lang/rust/blob/master/src/libstd/rt/mod.rs#L85)的源代码级别进行的.

环境变量RUST_MIN_STACK会影响程序中创建的非主线程线程的堆栈大小,但您可以在运行时在源代码中轻松指定该值.

解决问题最直接的方法可能是在创建的单独线程中运行clap,以便控制其堆栈大小.

以这段代码为例:

extern crate clap;
use clap::App;
use std::thread;

fn main() {
    let child = thread::Builder::new().stack_size(32 * 1024 * 1024).spawn(move || {
        return App::new("example")
            .version("v1.0-beta")
            .args_from_usage("<INPUT> 'Sets the input file to use'")
            .get_matches();
    }).unwrap();

    let matches = child.join().unwrap();

    println!("INPUT is: {}", matches.value_of("INPUT").unwrap());
}

clap似乎能够从子线程中正确终止应用程序,因此您的代码只需稍加修改即可工作.

Rust相关问答推荐

移植带有可变borrow 的C代码-卸载期间错误(nappgui示例)

用 rust 蚀中的future 展望 struct 的future

Pin<;&;mut可能将Uninit<;T>;>;合并为Pin<;&;mut T>;

为什么TcpListener的文件描述符和生成的TcpStream不同?

将一个泛型类型转换为另一个泛型类型

习语选项<;T>;到选项<;U>;当T->;U用From定义

有没有一种方法可以创建一个闭包来计算Rust中具有随机系数的n次多项式?

通过异常从同步代码中产生yield 是如何工作的?

我应该如何表达具有生命周期参数的类型的总排序,同时允许与不同生命周期进行比较?

返回迭代器考虑静态生命周期类型

Rust 异步循环函数阻塞了其他future 任务的执行

Rust 打包在 .deb 中

不安全块不返回预期值

如何递归传递闭包作为参数?

在 Rust 中,我如何处理请求 javascript 的页面?

切片不能被 `usize` 索引?

从现有系列和 map 值创建新系列

只有一个字符被读入作为词法分析器的输入

使用部分键从 Hashmap 中检索值

在同一向量 Rust 中用另一个字符串扩展一个字符串