如何调试外部库中的崩溃

时间:2014-08-14 20:21:30

标签: rust

我的防锈代码在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

我错过了什么吗?

由于

2 个答案:

答案 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.hostNone,它不应该是new / new_request设置它,你改变了吗?)。

你也可以通过使用调试符号(我实际上不确定Cargo可以做到这一点)和使用gdb来进行更彻底的调试工作。要设置的断点名为rust_fail