Skip to content

rustc segfaults when printing a backtrace for ICEs when debug=true is set #69151

Closed

Description

@Aaron1011

When debug=true is set in config.toml, my machine generates a librustc_driver.so with a size of 2.2 GB, of which 2.1 GB is debuginfo. This ends up triggering ianlancetaylor/libbacktrace#32. Since backtrace-rs ignores errors from libbacktrace, we continue trying to print the backtrace, which leads to a segfaut since the strtab has been freed due to the libbacktrace error.

There are a couple of ways that we can address this:

  1. Fix the libbacktrace bug - I think this should be fairly straightforward, but I haven't attempted it yet.
  2. Switch over to using backtrace-rs's gimli backend - however, I don't think it's feature-complete atm.

It would probably also be a good idea to investigate why 2.1 GB of debuginfo is getting generated - this seems really excessive.

Activity

  1. Mark-Simulacrum commented on Feb 14, 2020

    @Mark-Simulacrum
    Member

    cc @eddyb for debuginfo size, though I imagine this is just another case where our defaults being =2 vs. =1 is probably not ideal.

  2. added
    A-debuginfoArea: Debugging information in compiled programs (DWARF, PDB, etc.)
    T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
    on Feb 14, 2020
  3. added
    I-crashIssue: The compiler crashes (SIGSEGV, SIGABRT, etc). Use I-ICE instead when the compiler panics.
    on Feb 14, 2020
  4. eddyb commented on Feb 15, 2020

    @eddyb
    Contributor

    It would probably also be a good idea to investigate why 2.1 GB of debuginfo is getting generated - this seems really excessive.

    You pretty much never want debug=true. For backtraces, all you need is debuginfo-level=1.

    debug=true is for stepping rustc in a debugger and inspecting variables... which I'm not really aware of anyone doing (with perhaps the rare exception of a crash inside LLVM?)

  5. MeFisto94 commented on Feb 15, 2020

    @MeFisto94

    Note that the same happens when building servo in debug mode, it's just that when 2GiB of Debug Symbols are exceeded libbacktrace failed.

    The actual error is ianlancetaylor/libbacktrace#29, where there even is a patch added, I just need to try it out.
    The read() call failing just triggers the bug of not properly failing and/or a premature free of the table.

  6. MeFisto94 commented on Feb 15, 2020

    @MeFisto94

    The patch at ianlancetaylor/libbacktrace#29 fixes things, but mmapio should still be used, which actually also removes the trigger condition for the bug present in #29

  7. Aaron1011 commented on Jun 1, 2020

    @Aaron1011
    ContributorAuthor

    With #70361 merged, this can be closed

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-debuginfoArea: Debugging information in compiled programs (DWARF, PDB, etc.)C-bugCategory: This is a bug.I-crashIssue: The compiler crashes (SIGSEGV, SIGABRT, etc). Use I-ICE instead when the compiler panics.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions