我的防锈代码在rust-http里面崩溃了,我不知道如何调试它。
运行时出现此错误:
$ ./target/ecmiwc -i www.google.com -u testuser -v test
task '<main>' failed at 'called `Option::unwrap()` on a `None` value', /Users/rustbuild/src/rust-buildbot/slave/nightly-mac/build/src/libcore/option.rs:262
我想获得一些关于如何找到调用Option::unwrap()
的代码的说明。
如何触发核心文件或是否有其他方法可以获取更多信息?
我的编程经验主要是动态语言,崩溃提供完整的回溯,并且很容易找到有问题的代码。我怎样才能获得与锈相似的信息?
稍后编辑:
根据Steve K的回答,我启用了回溯env但不幸的是,回溯并不是很有用:
$ RUST_BACKTRACE=1 ./target/ecmiwc -i www.google.com -u testuser -v test
task '<main>' failed at 'called `Option::unwrap()` on a `None` value', /Users/rustbuild/src/rust-buildbot/slave/nightly-mac/build/src/libcore/option.rs:262
stack backtrace:
1: 0x10b70c065 - rt::backtrace::imp::write::h471bb232e1b48857jar
2: 0x10b70f1ef - failure::on_fail::h05edea1dadf8fbaaOqr
3: 0x10b715e25 - unwind::begin_unwind_inner::h7c6fecebc6991c8bS5d
4: 0x10b715a5b - unwind::begin_unwind_fmt::h227376fe1e021a36n3d
5: 0x10b7158b2 - rust_begin_unwind
6: 0x10b73769c - failure::begin_unwind::h7d8f396ab219c1bbn5j
7: 0x10b5a2cce - option::Option<T>::unwrap::h6219013626023885255
8: 0x10b5a25e8 - client::request::RequestWriter<S>::connect::h10689478801106876767
9: 0x10b59d523 - Ecm::login::h463674fdedafce079ja
10: 0x10b5ab502 - main::h2d8f53839ca9df9eDJa
11: 0x10b6fd879 - start::closure.8479
12: 0x10b716b3c - rust_try_inner
13: 0x10b716b26 - rust_try
14: 0x10b713e0b - unwind::try::h5982dbe8fdfe64a5nUd
15: 0x10b713beb - task::Task::run::h1c9de674e75b1485v2c
16: 0x10b6fd6af - start::h15d3cd64eea8fd88hve
17: 0x10b6fd4dc - lang_start::h7823875e69d425d0Bue
18: 0x10b5ab6df - main
我错过了什么吗?
由于
答案 0 :(得分:9)
RUST_BACKTRACE
环境变量将为您提供回溯。尝试
$ RUST_BACKTRACE=1 ./target/ecmiwc -i www.google.com -u testuser -v test
答案 1 :(得分:0)
回溯显示来自rust-http的client::request::RequestWriter<S>::connect
正在调用失败的unwrap
。这是方法的主体:
pub fn connect(&mut self) -> IoResult<()> {
if !self.stream.is_none() {
fail!("I don't think you meant to call connect() twice, you know.");
}
self.stream = match self.remote_addr {
Some(addr) => {
let stream = try!(Connecter::connect(
addr, self.headers.host.as_ref().unwrap().name.as_slice(), self.use_ssl));
Some(BufferedStream::new(stream))
},
None => fail!("connect() called before remote_addr was set"),
};
Ok(())
}
unwrap
上有self.headers.host.as_ref()
来电;这表明self.headers.host
是None
,它不应该是new
/ new_request
设置它,你改变了吗?)。
你也可以通过使用调试符号(我实际上不确定Cargo可以做到这一点)和使用gdb来进行更彻底的调试工作。要设置的断点名为rust_fail
。