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

gdb can't print backtraces in musl binaries during syscalls #90103

Closed
wesleywiser opened this issue Oct 20, 2021 · 1 comment · Fixed by #90733
Closed

gdb can't print backtraces in musl binaries during syscalls #90103

wesleywiser opened this issue Oct 20, 2021 · 1 comment · Fixed by #90733
Assignees
Labels
A-debuginfo Area: Debugging information in compiled programs (DWARF, PDB, etc.) C-bug Category: This is a bug. O-musl Target: The musl libc

Comments

@wesleywiser
Copy link
Member

If you run gdb and attempt to get the backtrace during a sycall (or are debugging a crash dump that includes frames in the middle of syscalls), gdb is unable to correctly print the backtrace and shows a truncated stack instead.

Repro:

$ cat test.rs
fn main() {
    a();
}

fn a() {
    b();
}

fn b() {
    c();
}

fn c() {
    d();
}

fn d() {
    println!("hello world");
}

$ rustc +nightly --version
rustc 1.58.0-nightly (1af55d19c 2021-10-19)

$ rustc +nightly --crate-name musl_test -g --target x86_64-unknown-linux-musl test.rs

$ gdb --version
GNU gdb (Ubuntu 10.1-2ubuntu2) 10.1.90.20210411-git 

$ gdb -q ./musl_test -ex "catch syscall write" -ex "run" -ex "bt"
Reading symbols from ./musl_test...
warning: Missing auto-load script at offset 0 in section .debug_gdb_scripts
of file /tmp/musl_test.
Use `info auto-load python-scripts [REGEXP]' to list them.
Catchpoint 1 (syscall 'write' [1])
Starting program: /tmp/musl_test

Catchpoint 1 (call to syscall write), 0x00007ffff7fe0ffd in sccp ()
#0  0x00007ffff7fe0ffd in sccp ()
#1  0x00007ffff7fe1bb1 in write ()
#2  0x0000000000000000 in ?? ()

For comparison, the same program compiled using x86_64-unknown-linux-gnu produces a backtrace like this:

Catchpoint 1 (call to syscall write), 0x00007ffff7f95297 in __libc_write (fd=1, buf=0x555555590057, nbytes=12)
    at ../sysdeps/unix/sysv/linux/write.c:26
26      ../sysdeps/unix/sysv/linux/write.c: No such file or directory.
#0  0x00007ffff7f95297 in __libc_write (fd=1, buf=0x555555590057, nbytes=12) at ../sysdeps/unix/sysv/linux/write.c:26
#1  0x000055555556e4fe in std::sys::unix::fd::FileDesc::write () at library/std/src/sys/unix/fd.rs:132
#2  <std::sys::unix::stdio::Stdout as std::io::Write>::write () at library/std/src/sys/unix/stdio.rs:39
#3  std::io::Write::write_all () at library/std/src/io/mod.rs:1556
#4  <std::io::stdio::StdoutRaw as std::io::Write>::write_all () at library/std/src/io/stdio.rs:145
#5  <std::io::buffered::linewritershim::LineWriterShim<W> as std::io::Write>::write_all ()
    at library/std/src/io/buffered/linewritershim.rs:260
#6  <std::io::buffered::linewriter::LineWriter<W> as std::io::Write>::write_all ()
    at library/std/src/io/buffered/linewriter.rs:206
#7  <std::io::stdio::StdoutLock as std::io::Write>::write_all () at library/std/src/io/stdio.rs:875
#8  0x000055555556f437 in <std::io::Write::write_fmt::Adapter<T> as core::fmt::Write>::write_str ()
    at library/std/src/io/mod.rs:1685
#9  0x000055555558b91f in core::fmt::write () at library/core/src/fmt/mod.rs:1187
#10 0x000055555556e24e in std::io::Write::write_fmt () at library/std/src/io/mod.rs:1696
#11 <&std::io::stdio::Stdout as std::io::Write>::write_fmt () at library/std/src/io/stdio.rs:855
#12 0x000055555556e81c in <std::io::stdio::Stdout as std::io::Write>::write_fmt () at library/std/src/io/stdio.rs:829
#13 std::io::stdio::print_to () at library/std/src/io/stdio.rs:1196
#14 std::io::stdio::_print () at library/std/src/io/stdio.rs:1209
#15 0x000055555555c811 in musl_test::d () at test.rs:18
#16 0x000055555555c7d6 in musl_test::c () at test.rs:14
#17 0x000055555555c7c6 in musl_test::b () at test.rs:10
--Type <RET> for more, q to quit, c to continue without paging--
#18 0x000055555555c7b6 in musl_test::a () at test.rs:6
#19 0x000055555555c7a6 in musl_test::main () at test.rs:2

I believe the issue is that we need CFI directives to be included in our musl build. I'm working on resolving this now.

@wesleywiser wesleywiser added A-debuginfo Area: Debugging information in compiled programs (DWARF, PDB, etc.) O-musl Target: The musl libc C-bug Category: This is a bug. labels Oct 20, 2021
@wesleywiser wesleywiser self-assigned this Oct 20, 2021
@wesleywiser
Copy link
Member Author

I believe there are two issues that need to be resolved here:

  1. We need to build musl with debug symbols.
  2. musl's configure script needs to check the correct location for the add-cfi scripts. I've posted a patch for this to the mailing list.

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. O-musl Target: The musl libc
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant