summaryrefslogtreecommitdiff
path: root/addr2line.c
AgeCommit message (Collapse)Author
2024-02-08Move an embedded directive outside macro argumentsNobuyoshi Nakada
Suppress warnings/errors by -Wembedded-directive with `-std=c99` on macOS.
2023-09-26Fix build on FreeBSDNobuyoshi Nakada
2023-09-25Dump backtraces to an arbitrary streamNobuyoshi Nakada
2023-09-08Continue even if addr or rnglists headers not foundNobuyoshi Nakada
Fix up commit 31d1226, "Avoid aborting inside addr2line.c". Source code informations did not appear in C level backtrace since that change.
2023-08-25empty initializer is a C++ ism卜部昌平
C99 does not allow this syntax. Notes: Merged: https://github.com/ruby/ruby/pull/8274
2023-08-03Check if reader members are setNobuyoshi Nakada
2023-08-02Remove `kprintf` in addr2line.cNobuyoshi Nakada
According to @naruse, this `kprintf` was to avoid some segfaults, but turned out it seemed another issue after all. Notes: Merged: https://github.com/ruby/ruby/pull/8148
2023-08-02Avoid aborting inside addr2line.cNobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/8148
2023-07-31addr2line.c: fix `DW_FORM_ref_addr` parsing for DWARF 2 (#8146)Yuta Saito
addr2line.c: fix DW_FORM_ref_addr parsing for DWARF 2 This fixes a crash when retrieving backtrace info with YJIT enabled on macOS with Rust 1.71.0. Since Rust 1.71.0, the DWARF info generated by the Rust compiler uses DW_FORM_ref_addr instead of DW_FORM_ref4 for pointers to other DIEs. DW_FORM_ref_addr representation in DWARF 2 is different from DWARF 3+, so we need to handle it separately. This patch fixes the parsing of DW_FORM_ref_addr for DWARF 2, which is the default DWARF version Rustc uses on macOS. See the DWARF 2.0.0 spec, section 7.5.4 Attribute Encodings https://dwarfstd.org/doc/dwarf-2.0.0.pdf https://bugs.ruby-lang.org/issues/19789 Notes: Merged-By: maximecb <maximecb@ruby-lang.org>
2023-06-24Ignore only warnings known by clangNobuyoshi Nakada
Clang 17 does not know warning group '-Wgnu-empty-initializer'.
2023-04-27Skip DW_FORM_GNU_* forms in addr2line.cKJ Tsanaktsidis
DW_FORM_GNU_ref_alt and DW_FORM_GNU_strp_alt refer to data stored in an external ELF file specified by a .gnu_debugaltlink attribute. These attributes are generated by dwz(1), which extracts DWARF data common amongst several files and stores it in a single, new file. It leaves behind these two forms in the original file to point at the new, common data. We don't support actually reading the .gnu_debugaltlink file in addr2line.c (and maybe we don't really need to), but we do need to know how to read the actual value of these forms so we can skip over the right number of bytes and not lose track of where we are in the CU. Notes: Merged: https://github.com/ruby/ruby/pull/7731
2023-01-16addr2line.c: Silence GCC 11 false -Wmaybe-uninitialized warningAlan Wu
No warnings from GCC 12.
2023-01-16addr2line.c: Don't special-case DWARF 5 parsing with GCCAlan Wu
While trying to fix YJIT's symbol hygiene issue over at GH-7115, I found that addr2line.c's DWARF 5 parsing is half-disabled when building with GCC. Rust's output contains some DW_AT_rnglists_base records, which the disabled code reads. Without DW_AT_rnglists_base, it crashes when generating a backtrace. In common Ruby build configurations, GCC opts to only use DW_FORM_sec_offset for the range lists, and so it doesn't generate DW_AT_rnglists_base records, so consuming GCC's DWARF 5 while building with GCC was not a problem. However, even when building with GCC, we might need to parse DWARF 5 generated by other compilers at runtime. They could come from C extensions built by Clang, or come from Rust extensions. This can happen even when building without YJIT. Notes: Merged: https://github.com/ruby/ruby/pull/7123 Merged-By: XrXr
2022-12-24Fix backtrace beyond _singtramp on macOS arm64 (#7015)NARUSE, Yui
* move ptrauth_strip logic into vm_dump.c * don't use _sigtramp special logic on arm64 Notes: Merged-By: nurse <naruse@airemix.jp>
2022-12-23addr2line.c: Strip pointer authenticationYusuke Endoh
We need to manually strip pointer authentication bits on M1 mac because libunwind leaks them out. Co-Authored-By: NARUSE, Yui <naruse@airemix.jp> Co-Authored-By: Yuta Saito <kateinoigakukun@gmail.com> Notes: Merged: https://github.com/ruby/ruby/pull/7011
2022-12-23addr2line.c: Support DW_FORM_rnglistxYusuke Endoh
Notes: Merged: https://github.com/ruby/ruby/pull/6993
2022-12-23addr2line.c: Implement DW_AT_*_baseYusuke Endoh
... and add code to parse the sections of .debug_addr_base and .debug_rnglists_base. Notes: Merged: https://github.com/ruby/ruby/pull/6993
2022-12-23addr2line.c: Support DW_FORM_strx* formsYusuke Endoh
Notes: Merged: https://github.com/ruby/ruby/pull/6993
2022-12-23addr2line.c: Support DW_FORM_addrx* formsYusuke Endoh
... and add VAL_addr value type Notes: Merged: https://github.com/ruby/ruby/pull/6993
2022-12-23addr2line.c: Keep .debug_str_offsets and .debug_addr sections as wellYusuke Endoh
clang generates DWARF with the sections Notes: Merged: https://github.com/ruby/ruby/pull/6993
2022-12-22addr2line.c: Fix another indexing bugYusuke Endoh
2022-12-22addr2line.c: Fix indexing bugYusuke Endoh
2022-12-22addr2info.c: Make it work with --enable-yjitYusuke Endoh
Background: GCC 12 generates DWARF 5 with .debug_rnglists, while rustc generates DWARF 4 with .debug_ranges. The previous logic always used .debug_rnglists if there is the section. However, we need to refer .debug_ranges for DWARF 4. This change keeps DWARF version of the current compilation unit and use a proper section depending on the version. Notes: Merged: https://github.com/ruby/ruby/pull/6980
2022-12-22addr2line.c: Support "Line Number Program Header" in DWARF 5Yusuke Endoh
Notes: Merged: https://github.com/ruby/ruby/pull/6980
2022-12-22addr2line.c: Keep .debug_line_str section as wellYusuke Endoh
... and properly support DW_FORM_line_strp. This is a prepartion to support DWARF 5. Notes: Merged: https://github.com/ruby/ruby/pull/6980
2022-10-19Fix and improve coroutines for Darwin (macOS) ppc/ppc64. (#5975)Sergey Fedorov
Notes: Merged-By: ioquatix <samuel@codeotaku.com>
2022-06-23Fix warnings by old gccNobuyoshi Nakada
* Use PRIxSIZE instead of "z" * Fix sign-compare warning * Suppress unused-but-set-variable warning
2022-06-09Skip `NULL` values from `dladdr(3)`xtkoba
Fixes [Bug #17810] Notes: Merged: https://github.com/ruby/ruby/pull/4438
2022-05-13Print function name in backtrace when availablePeter Zhu
If we don't have `saddr` but have `sname` we should output `sname`. Notes: Merged: https://github.com/ruby/ruby/pull/5906
2021-10-20Cast to void pointer for `%p` in commented out code [ci skip]Nobuyoshi Nakada
2021-09-23Use the correct address sizextkoba
Notes: Merged: https://github.com/ruby/ruby/pull/4439
2021-09-23Interpret `DW_RLE_start_length`xtkoba
Fixes [Bug #17823] Notes: Merged: https://github.com/ruby/ruby/pull/4439
2021-09-23Fix return value when `base != 0`xtkoba
Notes: Merged: https://github.com/ruby/ruby/pull/4439
2021-08-31addr2line: DragonFlyBSD build update.David CARLIER
same code path as FreeBSD's. Notes: Merged: https://github.com/ruby/ruby/pull/4309
2021-08-14Ignore `DW_FORM_ref_addr` [Bug #17052]xtkoba+ruby@gmail.com
Ignore `DW_FORM_ref_addr` form and other forms that are not supposed to be used currently.
2021-08-14Constified addr2line.cNobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/4740
2021-06-28Avoid `free(3)`ing invalid pointerxtkoba
Fixes [Bug #17794] Notes: Merged: https://github.com/ruby/ruby/pull/4611
2021-03-22solaris/illumos build fix.David Carlier
Notes: Merged: https://github.com/ruby/ruby/pull/4301
2021-03-15Support GCC's DWARF 5 [Bug #17585] (#4240)Yusuke Endoh
Co-Authored-By: xtkoba (Tee KOBAYASHI) <xtkoba+ruby@gmail.com> Notes: Merged-By: mame <mame@ruby-lang.org>
2021-02-04addr2line.c: DW_LNS_fixed_advance_pc takes a single uhalf operandYusuke Endoh
Fixes [Bug #17609] Co-Authored-By: xtkoba (Tee KOBAYASHI) <xtkoba+ruby@gmail.com>
2021-02-02NetBSD build update. (#4079)David CARLIER
Notes: Merged-By: nurse <naruse@airemix.jp>
2020-12-11addr2line.c: support debuglink by build_idYusuke Endoh
Currently, addr2line.c supports only one path format of debuglink: "/usr/lib/debug/usr/bin/ruby.debug". However, recent debian packages seem to use another format by build_id: "/usr/lib/debug/.build-id/ab/cdef1234.debug". https://github.com/Debian/debhelper/blob/5d1bb29841043d8e47ebbdd043e6cd086cad508e/dh_strip#L292 https://github.com/Debian/debhelper/blob/5d1bb29841043d8e47ebbdd043e6cd086cad508e/dh_strip#L353 This changeset makes ruby backtrace support the second format. Notes: Merged: https://github.com/ruby/ruby/pull/3627
2020-12-11Show C backtrace appropriately at core dump for GCC 8 or laterYusuke Endoh
When ruby is compiled by GCC 8 or later, some frames of C level backtrace information lacks. ``` $ ./miniruby -e '1.times { Process.kill(:SEGV, $$) }' ... -- C level backtrace information ------------------------------------------- /home/mame/work/ruby-gcc-9/miniruby(rb_vm_bugreport+0x611) [0x558a5fdcbc21] ../ruby/vm_dump.c:758 [0x558a5fbc789a] /home/mame/work/ruby-gcc-9/miniruby(sigsegv+0x4d) [0x558a5fd1eaed] ../ruby/signal.c:959 /lib/x86_64-linux-gnu/libpthread.so.0(__restore_rt+0x0) [0x7f687e6713c0] /lib/x86_64-linux-gnu/libc.so.6(kill+0xb) [0x7f687e31355b] ../sysdeps/unix/syscall-template.S:78 /home/mame/work/ruby-gcc-9/miniruby(rb_f_kill+0x350) [0x558a5fd1fe60] ../ruby/signal.c:480 [0x558a5fda50d3] [0x558a5fdb085c] [0x558a5fdb0fe7] [0x558a5fdbae1a] [0x558a5fdaf484] /home/mame/work/ruby-gcc-9/miniruby(rb_yield_1+0x29f) [0x558a5fdb2fbf] ../ruby/vm.c:1265 /home/mame/work/ruby-gcc-9/miniruby(int_dotimes+0x5c) [0x558a5fc72f2c] ../ruby/numeric.c:5198 [0x558a5fda50d3] [0x558a5fdb085c] [0x558a5fdb0fe7] [0x558a5fdbaf21] [0x558a5fdaf484] /home/mame/work/ruby-gcc-9/miniruby(rb_ec_exec_node+0xed) [0x558a5fbcc4fd] ../ruby/eval.c:317 /home/mame/work/ruby-gcc-9/miniruby(ruby_run_node+0x4f) [0x558a5fbd110f] ../ruby/eval.c:375 /home/mame/work/ruby-gcc-9/miniruby(main+0x73) [0x558a5fb2c083] ../ruby/main.c:50 ``` By this one-line change, it shows all locations. ``` $ ./miniruby -e '1.times { Process.kill(:SEGV, $$) }' ... -- C level backtrace information ------------------------------------------- /home/mame/work/ruby-gcc-9/miniruby(rb_print_backtrace+0x11) [0x558247adec21] ../ruby/vm_dump.c:758 /home/mame/work/ruby-gcc-9/miniruby(rb_vm_bugreport) ../ruby/vm_dump.c:956 /home/mame/work/ruby-gcc-9/miniruby(rb_bug_for_fatal_signal+0x15a) [0x5582478da89a] ../ruby/error.c:773 /home/mame/work/ruby-gcc-9/miniruby(sigsegv+0x4d) [0x558247a31aed] ../ruby/signal.c:959 /lib/x86_64-linux-gnu/libpthread.so.0(__restore_rt+0x0) [0x7f82202f73c0] /lib/x86_64-linux-gnu/libc.so.6(kill+0xb) [0x7f821ff9955b] ../sysdeps/unix/syscall-template.S:78 /home/mame/work/ruby-gcc-9/miniruby(rb_f_kill+0x350) [0x558247a32e60] ../ruby/signal.c:480 /home/mame/work/ruby-gcc-9/miniruby(vm_call_cfunc_with_frame+0x123) [0x558247ab80d3] ../ruby/vm_insnhelper.c:2821 /home/mame/work/ruby-gcc-9/miniruby(vm_call_method_each_type+0x7c) [0x558247ac385c] ../ruby/vm_insnhelper.c:3324 /home/mame/work/ruby-gcc-9/miniruby(vm_call_method+0xc7) [0x558247ac3fe7] ../ruby/vm_insnhelper.c:3428 /home/mame/work/ruby-gcc-9/miniruby(vm_sendish+0x14) [0x558247acde1a] ../ruby/vm_insnhelper.c:4412 /home/mame/work/ruby-gcc-9/miniruby(vm_exec_core) ../ruby/insns.def:789 /home/mame/work/ruby-gcc-9/miniruby(rb_vm_exec+0x1a4) [0x558247ac2484] ../ruby/vm.c:2165 /home/mame/work/ruby-gcc-9/miniruby(rb_yield_1+0x29f) [0x558247ac5fbf] ../ruby/vm.c:1265 /home/mame/work/ruby-gcc-9/miniruby(int_dotimes+0x5c) [0x558247985f2c] ../ruby/numeric.c:5198 /home/mame/work/ruby-gcc-9/miniruby(vm_call_cfunc_with_frame+0x123) [0x558247ab80d3] ../ruby/vm_insnhelper.c:2821 /home/mame/work/ruby-gcc-9/miniruby(vm_call_method_each_type+0x7c) [0x558247ac385c] ../ruby/vm_insnhelper.c:3324 /home/mame/work/ruby-gcc-9/miniruby(vm_call_method+0xc7) [0x558247ac3fe7] ../ruby/vm_insnhelper.c:3428 /home/mame/work/ruby-gcc-9/miniruby(vm_sendish+0x14) [0x558247acdf21] ../ruby/vm_insnhelper.c:4412 /home/mame/work/ruby-gcc-9/miniruby(vm_exec_core) ../ruby/insns.def:770 /home/mame/work/ruby-gcc-9/miniruby(rb_vm_exec+0x1a4) [0x558247ac2484] ../ruby/vm.c:2165 /home/mame/work/ruby-gcc-9/miniruby(rb_ec_exec_node+0xed) [0x5582478df4fd] ../ruby/eval.c:317 /home/mame/work/ruby-gcc-9/miniruby(ruby_run_node+0x4f) [0x5582478e410f] ../ruby/eval.c:375 /home/mame/work/ruby-gcc-9/miniruby(main+0x73) [0x55824783f083] ../ruby/main.c:50 ``` Details: In short, it is an uninitialized variable bug. Until GCC 7, all function locations are represented by a pair of DW_AT_low_pc and DW_AT_high_pc in DWARF information. But since GCC 8, some functions are split to multiple chunks, which are represented by DW_AT_ranges. DW_AT_ranges are represented as offsets from a base address. According to DWARF specification, it is the base address of the compilation unit, but GCC seems to use zero as default. The function "di_read_cu" in addr2line.c had a comment about the fact. However, the base address wasn't initialized as zero. Notes: Merged: https://github.com/ruby/ruby/pull/3881
2020-05-11sed -i 's|ruby/impl|ruby/internal|'卜部昌平
To fix build failures. Notes: Merged: https://github.com/ruby/ruby/pull/3079
2020-05-11sed -i s|ruby/3|ruby/impl|g卜部昌平
This shall fix compile errors. Notes: Merged: https://github.com/ruby/ruby/pull/3079
2020-04-08Merge pull request #2991 from shyouhei/ruby.h卜部昌平
Split ruby.h Notes: Merged-By: shyouhei <shyouhei@ruby-lang.org>
2019-12-26internal/stdbool.h rework卜部昌平
Noticed that internal/stdbool.h and addr2line.c are the only two place where missing/stdbool.h is included. Why not delete the file so that we can merge internal/stdbool.h and missing/stdbool.h into one. Notes: Merged: https://github.com/ruby/ruby/pull/2711
2019-08-20retrieve current path on macOSDavid Carlier
Notes: Merged: https://github.com/ruby/ruby/pull/2390
2019-07-15addr2line.c: clarify the type of integer expressionYusuke Endoh
to suppress Coverity Scan warning. This expression converted uint8_t to int, and then int to unsigned long. Now it directly converts uint8_t to unsigned long.
2019-07-14addr2line.c (binary_filename): extend the buffer for NUL terminatorYusuke Endoh