mirror of
https://github.com/bminor/binutils-gdb.git
synced 2026-02-05 19:01:30 +00:00
8fa65585b772775e8ffe14bbfa38917c5a804cac
On s390x-linux (SLES 15 SP5), I'm running into: ... FAIL: gdb.base/siginfo.exp: backtrace for nexti (pattern 2) FAIL: gdb.base/siginfo.exp: step out of handler ... The first FAIL is caused by a failure to unwind: ... (gdb) bt^M #0 handler (sig=26, info=0x3ffffffe428, context=0x3ffffffe4a8) at \ gdb.base/siginfo.c:31^M Backtrace stopped: Cannot access memory at address 0x1a00000088^M (gdb) ... In contrast, on x86_64-linux I get instead: ... (gdb) bt^M #0 handler (sig=26, info=0x7fffffffc170, context=0x7fffffffc040) at \ gdb.base/siginfo.c:31^M #1 <signal handler called>^M #2 0x0000000000401201 in main () at gdb.base/siginfo.c:67^M (gdb) ... The memory access error is triggered here in s390_sigtramp_frame_unwind_cache: ... /* Restore the previous frame's SP. */ prev_sp = read_memory_unsigned_integer ( info->saved_regs[S390_SP_REGNUM].addr (), word_size, byte_order); ... while trying to read an "Old-style RT frame" (for syscall sigreturn). The problem is that we actually have a "New-style RT frame" (for syscall rt_sigreturn). [ See linux kernel source file arch/s390/kernel/signal.c for a detailed explanation of the two. ] The choice between the two is made earlier in that same function: ... /* New-style RT frame: retcode + alignment (8 bytes) siginfo (128 bytes) ucontext (contains sigregs at offset 5 words). */ if (next_ra == next_cfa) { ... } /* Old-style RT frame and all non-RT frames: old signal mask (8 bytes) pointer to sigregs. */ else ... I'm not sure why the check gives the wrong result, but I noticed that s390_sigtramp_frame_sniffer is able to distinguish between the two, so fix this by: - factoring out new function s390_sigtramp_p out of s390_sigtramp_frame_sniffer, and - using s390_sigtramp_p in s390_sigtramp_frame_unwind_cache to distinguish between the "Old-style RT frame" and "New-style RT frame". This fixes the backtrace. The second failure is: ... (gdb) step^M 32 } /* handler */^M 1: x/i $pc^M => 0x1000772 <handler+50>: nopr^M (gdb) step^M 0x000003fffdffe490 in __kernel_rt_sigreturn ()^M 1: x/i $pc^M => 0x3fffdffe490 <__kernel_rt_sigreturn>: svc 173^M (gdb) FAIL: gdb.base/siginfo.exp: step out of handler ... There is some code in process_event_stop_test that is supposed to trigger: ... if (ecs->event_thread->control.step_range_end != 1 && (ecs->event_thread->control.step_over_calls == STEP_OVER_UNDEBUGGABLE || ecs->event_thread->control.step_over_calls == STEP_OVER_ALL) && get_frame_type (frame) == SIGTRAMP_FRAME) { infrun_debug_printf ("stepped into signal trampoline"); /* The inferior, while doing a "step" or "next", has ended up in a signal trampoline (either by a signal being delivered or by the signal handler returning). Just single-step until the inferior leaves the trampoline (either by calling the handler or returning). */ keep_going (ecs); return; } ... but it doesn't because frame is a NORMAL_FRAME instead of a SIGTRAMP_FRAME. This is caused by the "dwarf2" unwinder triggering, which has higher priority than the "s390 linux sigtramp" unwinder: ... (gdb) maint info frame-unwinders Name Type Class Enabled dummy DUMMY_FRAME GDB Y dwarf2 tailcall TAILCALL_FRAME DEBUGINFO Y inline INLINE_FRAME GDB Y jit NORMAL_FRAME EXTENSION Y python NORMAL_FRAME EXTENSION Y dwarf2 NORMAL_FRAME DEBUGINFO Y dwarf2 signal SIGTRAMP_FRAME DEBUGINFO Y s390 linux sigtramp SIGTRAMP_FRAME ARCH Y s390 stub NORMAL_FRAME ARCH Y s390 prologue NORMAL_FRAME ARCH Y ... I found some code in dwarf2_frame_sniffer: ... /* On some targets, signal trampolines may have unwind information. We need to recognize them so that we set the frame type correctly. */ if (fde->cie->signal_frame || dwarf2_frame_signal_frame_p (get_frame_arch (this_frame), this_frame)) return self->type () == SIGTRAMP_FRAME; ... and an example implementation i386_linux_dwarf_signal_frame_p, and after copying this approach, indeed the stepping failure was fixed, but the backtrace broken again. Instead, fix this by giving the "s390 linux sigtramp" unwinder a higher priority: ... (gdb) maint info frame-unwinders Name Type Class Enabled dummy DUMMY_FRAME GDB Y dwarf2 tailcall TAILCALL_FRAME DEBUGINFO Y inline INLINE_FRAME GDB Y jit NORMAL_FRAME EXTENSION Y python NORMAL_FRAME EXTENSION Y s390 linux sigtramp SIGTRAMP_FRAME ARCH Y dwarf2 NORMAL_FRAME DEBUGINFO Y dwarf2 signal SIGTRAMP_FRAME DEBUGINFO Y s390 stub NORMAL_FRAME ARCH Y s390 prologue NORMAL_FRAME ARCH Y ... Also fixes test-case gdb.base/sigaltstack.exp and gdb.base/sigbpt.exp. Tested on s390x-linux. Reviewed-By: Keith Seitz <keiths@redhat.com> PR tdep/33708 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33708
…
…
…
…
…
…
…
…
…
…
README for GNU development tools This directory contains various GNU compilers, assemblers, linkers, debuggers, etc., plus their support routines, definitions, and documentation. If you are receiving this as part of a GDB release, see the file gdb/README. If with a binutils release, see binutils/README, and so on. That'll give you info about this package -- supported targets, how to use it, how to report bugs, etc. It is now possible to automatically configure and build a variety of tools with one command. To build all of the tools contained herein, run the ``configure'' script here, e.g.: ./configure make To install them (by default in /usr/local/bin, /usr/local/lib, etc), then do: make install (If the configure script can't determine your type of computer, give it the name as an argument, for instance ``./configure sun4''. You can use the script ``config.sub'' to test whether a name is recognized; if it is, config.sub translates it to a triplet specifying CPU, vendor, and OS.) If you have more than one compiler on your system, it is often best to explicitly set CC in the environment before running configure, and to also set CC when running make. For example (assuming sh/bash/ksh): CC=gcc ./configure make A similar example using csh: setenv CC gcc ./configure make Much of the code and documentation enclosed is copyright by the Free Software Foundation, Inc. See the file COPYING or COPYING.LIB in the various directories, for a description of the GNU General Public License terms under which you can copy the files. REPORTING BUGS: Again, see gdb/README, binutils/README, etc., for info on where and how to report problems.
Description
Languages
C
50.4%
Makefile
22.7%
Assembly
13.2%
C++
5.9%
Roff
1.5%
Other
5.7%