首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RUST_BACKTRACE应该告诉我什么?

RUST_BACKTRACE应该告诉我什么?
EN

Stack Overflow用户
提问于 2017-04-11 02:46:22
回答 1查看 8.1K关注 0票数 9

我的程序惊慌失措,所以我按照它的建议运行RUST_BACKTRACE=1,我得到了这个(只是一个小片段)。

代码语言:javascript
复制
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

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线有问题吗?

整个回溯是在这张图片上,我觉得复制和粘贴在这里会很麻烦。

我从没听说过堆栈跟踪或反向跟踪。我正在用警告进行编译,但我不知道调试符号是什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-11 07:38:47

什么是堆栈跟踪?

如果您的程序惊慌失措,您会遇到一个bug,并希望修复它;堆栈跟踪希望在这里帮助您。当恐慌发生时,您想知道恐慌的原因(引发恐慌的函数)。但直接触发恐慌的功能通常不足以真正了解到底发生了什么。因此,我们还打印了调用前一个函数的函数.诸若此类。我们将所有导致恐慌的函数调用追溯到main(),这是(基本上)第一个被调用的函数。

什么是调试符号?

当编译器生成机器代码时,它只需要发出CPU的指令。问题是,几乎不可能很快看出一组指令是从哪个锈蚀函数中产生的。因此,编译器可以将其他信息插入到可执行文件中,这些可执行文件被CPU忽略,但由调试工具使用。

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

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

代码语言:javascript
复制
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行)。

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

这些奇怪的功能是什么?!

当您第一次查看堆栈跟踪时,您可能会对所看到的所有奇怪的函数名称感到困惑。别担心,这很正常!您感兴趣的是代码的哪一部分触发了恐慌,但是堆栈跟踪显示了所涉及的所有函数。在您的示例中,您可以忽略前9个条目:这些只是处理恐慌和生成所看到的确切消息的函数。

条目10仍然不是您的代码,但可能也很有趣:在使用index()运算符时调用的Vec<T>函数中触发了恐慌。最后,条目11显示了您定义的函数。但你可能已经注意到这个条目缺少一个文件位置..。上述部分描述了如何修复该问题。

堆栈跟踪怎么办?(tl;dr)

  1. 如果还没有激活调试符号(例如,只需在调试模式下编译)。
  2. std忽略堆栈跟踪顶部的、、和的任何函数。
  3. 查看(您定义的第一个函数),在您的文件中找到相应的位置并修复错误。
  4. 如果还没有,请将所有camelCase函数和方法名更改为snake_case,以坚持社区范围的样式指南。
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43335937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档