Debugging RUST_BACKTRACE应该告诉我什么?

Debugging RUST_BACKTRACE应该告诉我什么?,debugging,rust,backtrace,panic,Debugging,Rust,Backtrace,Panic,我的程序正在恐慌,所以我按照它的建议运行了RUST\u BACKTRACE=1,我得到了这个(只是一个小片段) 1:0x800c05b5-std::sys::imp::backtrace::tracing::imp::write::HF33AE72D0BAA1ED at/buildslave/rust buildbot/slave/stable dist rustc linux/build/src/libstd/sys/unix/backtrace/tracing/gcc_.s.rs:42 2:

我的程序正在恐慌,所以我按照它的建议运行了
RUST\u BACKTRACE=1
,我得到了这个(只是一个小片段)

1:0x800c05b5-std::sys::imp::backtrace::tracing::imp::write::HF33AE72D0BAA1ED
at/buildslave/rust buildbot/slave/stable dist rustc linux/build/src/libstd/sys/unix/backtrace/tracing/gcc_.s.rs:42
2:0x800c22ed-std::panicking::default_hook:{{closure}}::h59672b733cc6a455
at/buildslave/rust buildbot/slave/stable dist rustc linux/build/src/libstd/panicking.rs:351
如果程序惊慌失措,它会停止整个程序,那么我在哪里可以知道它在哪一行惊慌失措呢

这是不是告诉我42号线和351号线有问题

整个回溯都在这张图片上,我觉得在这里复制粘贴会很混乱

我从来没有听说过堆栈跟踪或回溯跟踪。我正在编译警告,但我不知道调试符号是什么

什么是堆栈跟踪? 如果您的程序陷入恐慌,您会遇到一个bug并希望修复它;堆栈跟踪希望在这里帮助您。当恐慌发生时,您想知道恐慌的原因(触发恐慌的函数)。但是直接触发恐慌的功能通常不足以真正看到发生了什么。因此,我们还打印调用前一个函数的函数。。。等等我们追溯所有导致死机的函数调用,直到
main()
,这几乎是第一个被调用的函数

什么是调试符号? 当编译器生成机器代码时,它几乎只需要为CPU发出指令。问题是,几乎不可能快速看出一组指令来自哪个函数。因此,编译器可以将CPU忽略但调试工具使用的附加信息插入到可执行文件中

一个重要的部分是文件位置:编译器在哪一行注释哪个指令来自哪个文件。这也意味着我们以后可以看到特定函数的定义位置。如果我们没有调试符号,我们就不能

在堆栈跟踪中,您可以看到几个文件位置:

1: 0x800c05b5 - std::sys::imp::backtrace::tracing::imp::write::hf33ae72d0baa11ed
        at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/src/libstd/sys/unix/backtrace/tracing/gcc_s.rs:42
Rust标准库附带调试符号。因此,我们可以看到函数的定义位置(
gcc_.s.rs
第42行)

如果在调试模式下编译(
rustc
cargo build
),默认情况下会激活调试符号。但是,如果在发布模式下编译(
rustc-O
cargo build--release
),调试符号在默认情况下会被禁用,因为它们会增加可执行文件的大小和。。。通常对最终用户来说并不重要。您可以使用
debug
键调整是否要在特定的
Cargo.toml
中调试符号

这些奇怪的功能是什么?! 当您第一次查看堆栈跟踪时,您可能会被看到的所有奇怪的函数名弄糊涂。别担心,这很正常!您感兴趣的是代码的哪一部分触发了死机,但是堆栈跟踪显示了以某种方式涉及的所有函数。在您的示例中,您可以忽略前9个条目:这些只是处理恐慌并生成您所看到的确切消息的函数

条目10仍然不是您的代码,但可能也很有趣:恐慌是在
Vec
index()
函数中触发的,当您使用
[]
操作符时调用该函数。最后,条目11显示了您定义的函数。但您可能已经注意到,此条目缺少一个文件位置。。。上面的部分描述了如何解决这个问题


如何处理堆栈跟踪?(tl;dr)
  • 激活调试符号如果尚未激活(例如,仅在调试模式下编译)
  • 忽略堆栈跟踪顶部的
    std
    core
    中的任何函数
  • 查看您定义的第一个函数,在文件中找到相应的位置并修复错误
  • 如果尚未更改,请将所有
    camelCase
    函数和方法名称更改为
    snake\u case
    ,以遵守社区范围的样式指南

  • 嗯,我知道了。它在334 gg线上。不管怎样,你应该发布一个答案,如果你愿意,我会给你最好的答案。生锈的痕迹。@PavelStrakhov Sweet:3当前的痕迹相当。。。丑陋的。我会更新我的答案,一旦这达到稳定,这应该是在2周内(我想)。