Debugging 调试失败!在图书馆

Debugging 调试失败!在图书馆,debugging,exception,rust,Debugging,Exception,Rust,我一直在构建我的代码,这样我就有了一个库,然后在另一个文件中使用。除了今天我遇到了一个由fail!抛出的错误外,这一切都很好宏(索引超出范围)。 具体来说,我不知道它们是从哪里扔来的。报告说,当我用extern-claret blah=“blabla”加载库时,它们被抛出,但这不是真的,因为当我注释掉测试文件中的一些函数调用时,一切都正常运行 我的一个想法是手动包含所有文件,而不使用库。这似乎很有意思。。。Gdb也没有帮助(尽管有-g标志) 谢谢 编辑: 很抱歉,不够清晰。这是一个运行时问题。我

我一直在构建我的代码,这样我就有了一个库,然后在另一个文件中使用。除了今天我遇到了一个由
fail!抛出的错误外,这一切都很好宏(索引超出范围)。
具体来说,我不知道它们是从哪里扔来的。报告说,当我用
extern-claret blah=“blabla”
加载库时,它们被抛出,但这不是真的,因为当我注释掉测试文件中的一些函数调用时,一切都正常运行

我的一个想法是手动包含所有文件,而不使用库。这似乎很有意思。。。Gdb也没有帮助(尽管有-g标志)

谢谢

编辑:

很抱歉,不够清晰。这是一个运行时问题。我已经模拟了一些复制此错误的示例代码

库文件:

#![crate_id = "that"]
#![crate_type = "rlib"]

pub mod thing {
  fn a() {
    let v = vec!(1f32);
    println!("{}", v.get(3));
  }

  pub fn b() {
    a();
  }
}
Bin文件:

extern crate that;

fn main() {
  that::thing::b();
}
编译和运行时,出现以下错误:

task '<main>' failed at 'index out of bounds: the len is 1 but the index is 3', lib.rs:1
任务“”在“索引超出范围:len为1但索引为3”处失败,库rs:1
虽然该报告确实正确,但行号/位置具有误导性。对于这个简单的问题,很容易看出哪里出了问题。对于较大的文件,情况并非如此

编辑2

使用RUST_BACKTRACE=1运行的结果:

>>>>>>> RUST_BACKTRACE=1 ./bin 

task '<main>' failed at 'index out of bounds: the len is 1 but the index is 3', lib.rs:1
stack backtrace:
   1:           0x4661d0 - rt::backtrace::imp::write::hfe294d72359867edAZy::v0.11.0.pre
   2:           0x44d850 - rt::unwind::begin_unwind_inner::h0c8451a5a31731e8Hzy::v0.11.0.pre
   3:           0x44cd30 - rt::unwind::begin_unwind_fmt::h2e6bc3145b6b3fb9Ryy::v0.11.0.pre
   4:           0x4660e0 - rust_begin_unwind
   5:           0x4a75d0 - failure::begin_unwind::h3bb6514279e9a504IOv::v0.11.0.pre
   6:           0x4a7610 - failure::fail_bounds_check::he1ed5c80925626c6IMv::v0.11.0.pre
   7:           0x44c810 - vec::Vec<T>::get::h5370221266733407395::v0.0
   8:           0x44b0f0 - thing::a::h3f669f2dfb075f3cfaa::v0.0
   9:           0x44cd00 - thing::b::h8fc1d5bafb3ab544rba::v0.0
  10:           0x4032b0 - main::he270e826329bbcf4faa::v0.0
  11:           0x44af90 - start::closure.7862
  12:           0x4617c0 - rt::task::Task::run::closure.25316
  13:           0x46db00 - rust_try
  14:           0x461710 - rt::task::Task::run::hb455d17a166d559b4ow::v0.11.0.pre
  15:           0x44abd0 - start::h58e604f51e8fd72cipe::v0.11.0.pre
  16:           0x44ab40 - lang_start::h90f473af132f8958Coe::v0.11.0.pre
  17:           0x4032e0 - main
  18:     0x7ff54744df10 - __libc_start_main
  19:           0x4031b0 - <unknown>
  20:                0x0 - <unknown>
>>锈迹_BACKTRACE=1./bin
任务“”在“索引超出范围”处失败:len为1,但索引为3,库rs:1
堆栈回溯:
1:0x4661d0-rt::回溯::imp::写入::hfe294d72359867edAZy::v0.11.0.pre
2:0x44d850-rt::展开::开始展开\内部::h0c8451a5a31731e8Hzy::v0.11.0.pre
3:0x44cd30-rt::展开::开始_展开_fmt::h2e6bc3145b6b3fb9Ryy::v0.11.0.pre
4:0x4660e0-生锈\u开始\u展开
5:0x4a75d0-故障::开始解卷::h3bb6514279e9a504IOv::v0.11.0.pre
6:0x4a7610-故障::故障检查::he1ed5c80925626c6IMv::v0.11.0.pre
7:0x44c810-vec::vec::get::h5370221266733407395::v0.0
8:0x44b0f0-thing::a::h3f669f2dfb075f3cfaa::v0.0
9:0x44cd00-thing::b::H8FC1D5BAFB3B3AB544RBA::v0.0
10:0x4032b0-主要::he270e826329bbcf4faa::v0.0
11:0x44af90-开始::关闭.7862
12:0x4617c0-rt::task::task::run::Close.25316
13:0x46db00-锈蚀试验
14:0x461710-rt::task::task::run::hb455d17a166d559b4ow::v0.11.0.pre
15:0x44abd0-开始::h58e604f51e8fd72cipe::v0.11.0.pre
16:0x44ab40-lang_start::h90f473af132f8958Coe::v0.11.0.pre
17:0x4032e0-主
18:0x7ff54744df10-\uuu libc\u start\u main
19:0x4031b0-
20:0x0-

要在紧急情况发生时调试紧急情况,请在
rust\u panic
函数上设置断点

b rust_panic

是编译代码失败还是运行代码失败?请提供完整的控制台输出。您可能希望尝试使用
RUST\u BACKTRACE=1
运行程序,以获得完整的堆栈跟踪。只添加了示例文件和控制台输出。很抱歉,我的原始帖子没有具体说明,而且出现了延迟。@BurntSushi5 the RUST_BACKTRACE=1是一个很好的技巧。它确实告诉了我有问题的函数,但是没有行号,而且有点神秘。用结果编辑。@luke:第7帧和第8帧告诉您这里需要知道的是
。get
调用函数
a
;我猜你的大例子中的函数可能更大,因此追踪确切原因更复杂?