任务 'rustc' 已溢出其堆栈
Posted
技术标签:
【中文标题】任务 \'rustc\' 已溢出其堆栈【英文标题】:Task 'rustc' has overflowed its stack任务 'rustc' 已溢出其堆栈 【发布时间】:2014-12-03 16:38:10 【问题描述】:聊天服务器编译失败:
use std::io::TcpListener, TcpStream;
use std::io::Acceptor, Listener;
enum StreamOrSlice
Strm(TcpStream),
Slc(uint, [u8, ..1024])
fn main()
let listener = TcpListener::bind("127.0.0.1", 5555);
// bind the listener to the specified address
let mut acceptor = listener.listen();
let (tx, rx) = channel();
spawn(proc()
let mut streams: Vec<TcpStream> = Vec::new();
loop
let rxd: StreamOrSlice = rx.recv();
match rxd
Strm(stream) =>
streams.push(stream);
Slc(len, buf) =>
for stream in streams.iter_mut()
let _ = stream.write(buf.slice(0, len));
);
// accept connections and process them, spawning a new tasks for each one
for stream in acceptor.incoming()
match stream
Err(e) => /* connection failed */
Ok(mut stream) =>
// connection succeeded
tx.send(Strm(stream.clone()));
let tx2 = tx.clone();
spawn(proc()
let mut buf: [u8, ..1024] = [0, ..1024];
loop
let len = stream.read(buf);
tx2.send(Slc(len.unwrap(), buf));
)
错误是:
Compiling chat v0.1.0 (file:///home/chris/rust/chat)
task 'rustc' has overflowed its stack
Could not compile `chat`.
这可以在代码中修复,还是编译器错误?
注意:@Levans 感谢您今晚的帮助。
【问题讨论】:
【参考方案1】:编译器崩溃了。您甚至没有编写自己的宏。这是 100% 的编译器错误。举报吧。
【讨论】:
在gdb中运行显示它是两部分递归,在rustc::middle::trans::_match::compile_submatch
和rustc::middle::trans::_match::compile_submatch_continue
之间来回跳转。在生成的 proc 中删除循环内的匹配确实可以修复它……必须进一步挖掘以产生最小的测试用例。
好的,这是一个有趣的错误。这只是与[u8, ..1024]
的匹配。我将其归档为github.com/rust-lang/rust/issues/17877
@ChrisMorgan 您能否建议一种解决此错误的方法,直到它被修复?
@chrisdew:如果您从[u8, ..1024]
切换到Vec<u8>
,它将被修复。相关新部件:let mut buf = Vec::from_elem(1024, 0);
、stream.read(buf.as_mut_slice())
、Slc(len.unwrap(), buf.clone())
。更好的是,一旦你这样做了,删除Slc
的uint
部分并更改为tx2.send(Slc(buf.slice_to(len.unwrap()).to_vec()
。以上是关于任务 'rustc' 已溢出其堆栈的主要内容,如果未能解决你的问题,请参考以下文章