debugging - RUST_BACKTRACE 应该告诉我什么?

标签 debugging rust backtrace panic

我的程序崩溃了,所以我按照它的建议运行 RUST_BACKTRACE=1 并且我得到了这个(只是一小段)。

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

如果程序发生 panic ,它会停止整个程序,那么我在哪里可以找出它在哪一行发生 panic ?

这一行是否告诉我第 42 行和第 351 行有问题?

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

enter image description here

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

最佳答案

什么是堆栈跟踪?

如果你的程序出现 panic,说明你遇到了一个 bug 并且想要修复它;堆栈跟踪想在这里帮助你。当 panic 发生时,您想知道 panic 的原因(触发 panic 的函数)。但是直接触发 panic 的函数通常不足以真正看到发生了什么。因此我们还打印了调用前一个函数的函数……等等。我们追溯所有导致 panic 的函数调用,直到 main()。这是(几乎)第一个被调用的函数。

什么是调试符号?

当编译器生成机器代码时,它几乎只需要为 CPU 发出指令。问题在于,几乎不可能快速看出一组指令来自哪个 Rust 函数。因此,编译器可以将附加信息插入可执行文件中,这些信息会被 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 行)。

如果您在 Debug模式下编译(rustccargo build),调试符号默认激活。但是,如果您在 Release模式下编译(rustc -Ocargo build --release),则默认情况下禁用调试符号,因为它们会增加可执行文件的大小并且...通常对最终用户而言并不重要。您可以调整是否要在 Cargo.toml 中使用调试符号。在特定的 profile sectiondebug键。

这些奇怪的函数是什么?!

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

条目 10 仍然不是您的代码,但可能也很有趣: panic 是在 index() 中触发的Vec<T>的功能当您使用 [] 时调用运算符(operator)。最后,条目 11 显示了定义的函数。但是您可能已经注意到此条目缺少文件位置...上一节介绍了如何解决该问题。


堆栈跟踪有什么用? (tl;博士)

  1. 如果您还没有激活调试符号(例如,只在 Debug模式下编译)。
  2. 忽略 std 中的任何函数和 core 在堆栈跟踪的顶部。
  3. 查看您定义的第一个函数,在您的文件中找到相应的位置并修复错误。
  4. 如果您还没有,请更改所有 camelCase函数和方法名称为 snake_case坚持社区范围内的风格指南。

关于debugging - RUST_BACKTRACE 应该告诉我什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43335937/

相关文章:

javascript - 如何以 Dart 语言将变量完全转储/打印到控制台?

ios - Xamarin IOS SIGSEGV调试时

rust - 在柴油塔中使用新类型

linux - gdb:当 fglrx_dri.so 发生段错误时如何获得完整的回溯?

java - 如何使用intellij正确远程调试pod?

symfony - 分块上传验证: "The file could not be uploaded."

rust - 在 and_then 的类型定义中, T 从哪里来?

rust - 表驱动的词法分析需要多少缓冲?

c - 如何获取函数在调用栈中的位置?

javascript - 未捕获的类型错误 : Cannot read property 'length' of undefined