Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

libcompiler-builtins contains DWARF5 debuginfo in 1.62.0 #98746

Open
glandium opened this issue Jul 1, 2022 · 21 comments
Open

libcompiler-builtins contains DWARF5 debuginfo in 1.62.0 #98746

glandium opened this issue Jul 1, 2022 · 21 comments
Assignees
Labels
A-debuginfo Area: Debugging information in compiled programs (DWARF, PDB, etc.) C-bug Category: This is a bug. E-needs-mcve Call for participation: This issue has a repro, but needs a Minimal Complete and Verifiable Example E-needs-test Call for participation: Writing correctness tests. P-high High priority T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@glandium
Copy link
Contributor

glandium commented Jul 1, 2022

Building Firefox with rustc 1.62.0 on Linux and running it under valgrind makes valgrind emit the following error:

==31382== Valgrind: debuginfo reader: ensure_valid failed:
==31382== Valgrind:   during call to ML_(img_get)
==31382== Valgrind:   request for range [3275670898, +4) exceeds
==31382== Valgrind:   valid image size of 1880027600 for image:
==31382== Valgrind:   "/builds/worker/workspace/obj-build/toolkit/library/build/libxul.so"
==31382==
==31382== Valgrind: debuginfo reader: Possibly corrupted debuginfo file.
==31382== Valgrind: I can't recover.  Giving up.  Sorry.

As of filing, I don't have more information to share yet, but I thought I'd already file it before starting to investigate it next week.

@glandium glandium added the C-bug Category: This is a bug. label Jul 1, 2022
@aordano
Copy link

aordano commented Jul 1, 2022

I am unfamiliar with Valgrind, but i updated a couple hours ago and i can't get LLDB to display local variables while debugging. Maybe related? It worked perfectly fine before the updated and i didn't change anything else.

Tried common fixes, resetting, etc.

@glandium
Copy link
Contributor Author

glandium commented Jul 5, 2022

This seems to have started somewhere between nightly-2022-04-28 and nightly-2022-04-29... and there's an LLVM update in the range. I'm going to bisect further with the bors builds.

@glandium
Copy link
Contributor Author

glandium commented Jul 5, 2022

Yep, started on 1388b38.

@glandium
Copy link
Contributor Author

glandium commented Jul 5, 2022

So... if I build 1388b38 locally, it doesn't reproduce...

@glandium glandium changed the title Broken debug info with 1.62.0 libcompiler-builtins contains DWARF5 debuginfo in 1.62.0 Jul 5, 2022
@glandium
Copy link
Contributor Author

glandium commented Jul 5, 2022

The CI change in 278fdf6 had the unintended side effect of shipping libcompiler-builtins with DWARF5 debuginfo, which is not well supported.

@glandium
Copy link
Contributor Author

glandium commented Jul 5, 2022

For the record, libprofiler_builtins, and librustc-stable_rt.*san.a also have DWARF5 debuginfo.

@glandium
Copy link
Contributor Author

glandium commented Jul 5, 2022

For the record (bis), my local builds of 1.62 were unaffected despite being compiled with clang 14 because they don't contain debuginfo in those libs at all.

glandium added a commit to glandium/cc-rs that referenced this issue Jul 7, 2022
Rustc defaults to DWARF-2 on some targets, and DWARF-4 on others.
However using -g with the C compiler yields whatever default version the
C compiler prefers.

One side effect is that the DWARF debug info shipped in some libraries
with rustc itself (e.g. libcompiler_builtins and others) have recently
switched to DWARF-5 have a side effect of upgrading the clang version
used on rustc CI. (rust-lang/rust#98746)

Ideally, the prefered DWARF version would be given by the rust compiler
and/or cargo, but that's not the case at the moment, so the next best
thing is something that aligns with the current defaults, although
work in under way to add a rustc flag that would allow to pick the
prefered DWARF version (rust-lang/rust#98350)
glandium added a commit to glandium/cc-rs that referenced this issue Jul 7, 2022
Rustc defaults to DWARF-2 on some targets, and DWARF-4 on others.
However using -g with the C compiler yields whatever default version the
C compiler prefers.

One side effect is that the DWARF debug info shipped in some libraries
with rustc itself (e.g. libcompiler_builtins and others) have recently
switched to DWARF-5 as a side effect of upgrading the clang version
used on rustc CI. (rust-lang/rust#98746)

Ideally, the preferred DWARF version would be given by the rust compiler
and/or cargo, but that's not the case at the moment, so the next best
thing is something that aligns with the current defaults, although
work in under way to add a rustc flag that would allow to pick the
preferred DWARF version (rust-lang/rust#98350)
glandium added a commit to glandium/cc-rs that referenced this issue Jul 12, 2022
Rustc defaults to DWARF-2 on some targets, and DWARF-4 on others.
However using -g with the C compiler yields whatever default version the
C compiler prefers.

One side effect is that the DWARF debug info shipped in some libraries
with rustc itself (e.g. libcompiler_builtins and others) have recently
switched to DWARF-5 as a side effect of upgrading the clang version
used on rustc CI. (rust-lang/rust#98746)

Ideally, the preferred DWARF version would be given by the rust compiler
and/or cargo, but that's not the case at the moment, so the next best
thing is something that aligns with the current defaults, although
work in under way to add a rustc flag that would allow to pick the
preferred DWARF version (rust-lang/rust#98350)
glandium added a commit to glandium/cc-rs that referenced this issue Jul 12, 2022
Rustc defaults to DWARF-2 on some targets, and DWARF-4 on others.
However using -g with the C compiler yields whatever default version the
C compiler prefers.

One side effect is that the DWARF debug info shipped in some libraries
with rustc itself (e.g. libcompiler_builtins and others) have recently
switched to DWARF-5 as a side effect of upgrading the clang version
used on rustc CI. (rust-lang/rust#98746)

Ideally, the preferred DWARF version would be given by the rust compiler
and/or cargo, but that's not the case at the moment, so the next best
thing is something that aligns with the current defaults, although
work in under way to add a rustc flag that would allow to pick the
preferred DWARF version (rust-lang/rust#98350)
@fasterthanlime
Copy link
Contributor

Although this probably isn't the right issue for that, this affects various rustup shims as well (~/.cargo/bin/rustc, ~/.rustup/toolchains/XYZ/bin/rustc)

@stevenengler
Copy link
Contributor

stevenengler commented Aug 23, 2022

This also seems to prevent me from debugging binaries with rust code in gdb. For example with a C project that statically links a rust library on Ubuntu 20.04 with rustc/cargo 1.62.0 or 1.63.0:

$ gdb --args /my/binary
Reading symbols from /my/binary...
Dwarf Error: DW_FORM_strx1 found in non-DWO CU [in module /my/binary]
(No debugging symbols found in /my/binary)

Then gdb isn't able to show debugging symbols for most of the code.

An llvm thread says this is a bug with DWARF 5 and gdb: https://discourse.llvm.org/t/gdb-10-1-cant-read-clangs-dwarf-v5/6035

It's only a single part of the binary that has DWARF version 5:

$ llvm-dwarfdump -r 1 /my/binary
.debug_info contents:
0x00000000: Compile Unit: length = 0x000012fb version = 0x0004 abbr_offset = 0x0000 addr_size = 0x08 (next unit at 0x000012ff)

[... a bunch of other compilation units with version = 0x0004]

0x010a6be3: Compile Unit: length = 0x0000008f version = 0x0005 unit_type = DW_UT_compile abbr_offset = 0x83eff addr_size = 0x08 (next unit at 0x010a6c76)

0x010a6bef: DW_TAG_compile_unit
              DW_AT_producer	("clang version 14.0.1")
              DW_AT_language	(DW_LANG_C99)
              DW_AT_name	("./lib/builtins/popcountdi2.c")
              DW_AT_str_offsets_base	(0x00000008)
              DW_AT_stmt_list	(0x0065655b)
              DW_AT_comp_dir	("/cargo/registry/src/github.com-1ecc6299db9ec823/compiler_builtins-0.1.71")
              DW_AT_low_pc	(0x000000000147eb10)
              DW_AT_high_pc	(0x000000000147eb72)
              DW_AT_addr_base	(0x00000008)
              DW_AT_loclists_base	(0x0000000c)

If I build my project with rustc/cargo 1.61.0, then I'm able to debug it in gdb and the above gdb error goes away.

This underlying issue seems to be a bug with gdb < 10.1 (such as version 9.2 on ubuntu 20.04), but just wanted to mention a workflow that using DWARF 5 in compiler_builtins seems to break.

@nnethercote
Copy link
Contributor

FWIW, the next release of Valgrind (3.20) will have better support for DWARF 5 and should be out in the next week or two.

@pnkfelix pnkfelix added the T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. label Oct 24, 2022
@pnkfelix
Copy link
Member

@rustbot label: I-compiler-nominated

nominating for discussion at T-compiler meeting.

  1. I suspect this is a real bug that we need to address a bit more aggressively than we have been. (Who knows how many rust users are impacted, and what percentage of them will not be prepared to upgrade to the next valgrind release.)
  2. It might be a sign of a process issue that we didn't flag it as something that needs prioritization. (I blame myself here as well; I looked at this issue 10 days ago, but didn't make the connection that it wasn't tagged T-compiler and wasn't prioritized.)

@rustbot rustbot added the I-compiler-nominated The issue / PR has been nominated for discussion during a compiler team meeting. label Oct 24, 2022
@pnkfelix pnkfelix added the I-prioritize Issue: Indicates that prioritization has been requested for this issue. label Oct 24, 2022
@nnethercote
Copy link
Contributor

Valgrind 3.20 has been released.

@glandium
Copy link
Contributor Author

Note that valgrind is not the only tool that has problems with DWARF 5.

@glandium
Copy link
Contributor Author

Also note there's been a PR on cc-rs for this for a while.

@apiraino
Copy link
Contributor

@glandium I think you're referring to this one PR on cc-rs: rust-lang/cc-rs#694

(linking it here for reference)

@pnkfelix pnkfelix self-assigned this Nov 10, 2022
@apiraino
Copy link
Contributor

Assigning priority as suggestd in T-compiler meeting (Zulip discussion).

@rustbot label -I-prioritize +P-high -I-compiler-nominated

@rustbot rustbot added the P-high High priority label Nov 10, 2022
@rustbot rustbot removed I-prioritize Issue: Indicates that prioritization has been requested for this issue. I-compiler-nominated The issue / PR has been nominated for discussion during a compiler team meeting. labels Nov 10, 2022
glandium added a commit to glandium/cc-rs that referenced this issue Nov 10, 2022
Rustc defaults to DWARF-2 on some targets, and DWARF-4 on others.
However using -g with the C compiler yields whatever default version the
C compiler prefers.

One side effect is that the DWARF debug info shipped in some libraries
with rustc itself (e.g. libcompiler_builtins and others) have recently
switched to DWARF-5 as a side effect of upgrading the clang version
used on rustc CI. (rust-lang/rust#98746)

Ideally, the preferred DWARF version would be given by the rust compiler
and/or cargo, but that's not the case at the moment, so the next best
thing is something that aligns with the current defaults, although
work in under way to add a rustc flag that would allow to pick the
preferred DWARF version (rust-lang/rust#98350)
thomcc pushed a commit to rust-lang/cc-rs that referenced this issue Nov 10, 2022
Rustc defaults to DWARF-2 on some targets, and DWARF-4 on others.
However using -g with the C compiler yields whatever default version the
C compiler prefers.

One side effect is that the DWARF debug info shipped in some libraries
with rustc itself (e.g. libcompiler_builtins and others) have recently
switched to DWARF-5 as a side effect of upgrading the clang version
used on rustc CI. (rust-lang/rust#98746)

Ideally, the preferred DWARF version would be given by the rust compiler
and/or cargo, but that's not the case at the moment, so the next best
thing is something that aligns with the current defaults, although
work in under way to add a rustc flag that would allow to pick the
preferred DWARF version (rust-lang/rust#98350)
@Mark-Simulacrum Mark-Simulacrum added the E-needs-test Call for participation: Writing correctness tests. label Jan 14, 2023
@JohnTitor JohnTitor added the E-needs-mcve Call for participation: This issue has a repro, but needs a Minimal Complete and Verifiable Example label Jan 14, 2023
glandium added a commit to glandium/rust that referenced this issue Jan 16, 2023
Fixes (without a test) rust-lang#98746.
compiler-errors added a commit to compiler-errors/rust that referenced this issue Jan 22, 2023
compiler-errors added a commit to compiler-errors/rust that referenced this issue Jan 22, 2023
@workingjubilee workingjubilee added the A-debuginfo Area: Debugging information in compiled programs (DWARF, PDB, etc.) label Mar 11, 2023
@RalfJung
Copy link
Member

RalfJung commented Aug 14, 2023

Sadly Debian still doesn't have Valgrind 3.20, even in 'unstable', so this issue makes it quite hard to e.g. profile rustc performance issues on Debian.

@glandium
Copy link
Contributor Author

This should actually be fixed as of 5645d10

@RalfJung
Copy link
Member

RalfJung commented Aug 14, 2023 via email

@glandium
Copy link
Contributor Author

Oh indeed, while libcompiler_builtins is DWARF4, the rustc binary itself is DWARF5...

@glandium
Copy link
Contributor Author

... which is weird because the rust compiler itself defaults to emitting DWARF 4 at most.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-debuginfo Area: Debugging information in compiled programs (DWARF, PDB, etc.) C-bug Category: This is a bug. E-needs-mcve Call for participation: This issue has a repro, but needs a Minimal Complete and Verifiable Example E-needs-test Call for participation: Writing correctness tests. P-high High priority T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

No branches or pull requests