Commit Graph

120781 Commits

Author SHA1 Message Date
Craig Blackmore
c295d55246 gdb: Fix assertion failure when inline frame #0 is duplicated
Modifying inline-frame-cycle-unwind.exp to use `bt -no-filters` produces
the following incorrect backtrace:

  #0  inline_func () at .../gdb/gdb/testsuite/gdb.base/inline-frame-cycle-unwind.c:49
  #1  normal_func () at .../gdb/gdb/testsuite/gdb.base/inline-frame-cycle-unwind.c:32
  #2  0x000055555555517f in inline_func () at .../gdb/gdb/testsuite/gdb.base/inline-frame-cycle-unwind.c:50
  #3  normal_func () at .../gdb/gdb/testsuite/gdb.base/inline-frame-cycle-unwind.c:32
  Backtrace stopped: previous frame identical to this frame (corrupt stack?)
  (gdb) FAIL: gdb.base/inline-frame-cycle-unwind.exp: cycle at level 1: backtrace when the unwind is broken at frame 1

The expected output, which we get with `bt`, is:

  #0  inline_func () at .../gdb/gdb/testsuite/gdb.base/inline-frame-cycle-unwind.c:49
  #1  normal_func () at .../gdb/gdb/testsuite/gdb.base/inline-frame-cycle-unwind.c:32
  Backtrace stopped: previous frame identical to this frame (corrupt stack?)
  (gdb) PASS: gdb.base/inline-frame-cycle-unwind.exp: cycle at level 1: backtrace when the unwind is broken at frame 1

The cycle checking in `get_prev_frame_maybe_check_cycle` relies on newer
frame ids having already been computed and stashed.  Unlike other
frames, frame #0's id does not get computed immediately.

The test passes with `bt` because when applying python frame filters,
the call to `bootstrap_python_frame_filters` happens to compute the id
of frame #0.  When `get_prev_frame_maybe_check_cycle` later tries to
stash frame #2's id, the cycle is detected.

The test fails with `bt -no-filters` because frame #0's id has not been
stashed by the time `get_prev_frame_maybe_check_cycle` tries to stash
frame #2's id which succeeds and the cycle is only detected later when
trying to stash frame #4's id.  Doing `stepi` after the incorrect
backtrace would then trigger an assertion failure when trying to stash
frame #0's id because it is a duplicate of #2's already stashed id.

In `get_prev_frame_always_1`, if this_frame is inline frame 0, then
compute and stash its frame id before returning the previous frame.
This ensures that the id of inline frame 0 has been stashed before
`get_prev_frame_maybe_check_cycle` is called on older frames.

The test case has been updated to run both `bt` and `bt -no-filters`.

Co-authored-by: Andrew Burgess <aburgess@redhat.com>
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32757
2025-03-28 09:57:18 +00:00
GDB Administrator
66150ea536 Automatic date update in version.in 2025-03-28 00:00:37 +00:00
GDB Administrator
0c09aa22ee Automatic date update in version.in 2025-03-27 00:00:33 +00:00
GDB Administrator
b9a7fda110 Automatic date update in version.in 2025-03-26 00:00:51 +00:00
GDB Administrator
21c21807a3 Automatic date update in version.in 2025-03-25 00:00:36 +00:00
GDB Administrator
67e9e439f7 Automatic date update in version.in 2025-03-24 00:01:22 +00:00
GDB Administrator
dcf6d684ce Automatic date update in version.in 2025-03-23 00:01:09 +00:00
GDB Administrator
639b6f1055 Automatic date update in version.in 2025-03-22 00:01:34 +00:00
GDB Administrator
a1bcf87a5f Automatic date update in version.in 2025-03-21 00:01:18 +00:00
GDB Administrator
883f7d18d1 Automatic date update in version.in 2025-03-20 00:00:59 +00:00
GDB Administrator
b4b7d9f112 Automatic date update in version.in 2025-03-19 00:01:50 +00:00
GDB Administrator
f45379953a Automatic date update in version.in 2025-03-18 00:01:12 +00:00
GDB Administrator
d6e18cff1d Automatic date update in version.in 2025-03-17 00:01:53 +00:00
GDB Administrator
3ee680f9eb Automatic date update in version.in 2025-03-16 00:01:13 +00:00
Tom de Vries
5bc76dc8d4 [gdb/tdep] Rewrite i386_canonicalize_syscall
On openSUSE Tumbleweed x86_64, with target board unix/-m32 and test-case
gdb.reverse/recvmsg-reverse.exp, I run into:
...
(gdb) continue^M
Continuing.^M
Process record and replay target doesn't support syscall number 360^M
Process record: failed to record execution log.^M
^M
Program stopped.^M
0xf7fc5575 in __kernel_vsyscall ()^M
(gdb) FAIL: $exp: continue to breakpoint: marker2
...

The syscall number 360 in i386 is for syscall socketpair, as we can see in
arch/x86/entry/syscalls/syscall_32.tbl:
...
<number>  <abi>  <name>      <entry point>
360       i386   socketpair  sys_socketpair
...

Function i386_canonicalize_syscall assumes that any syscall below 500 maps to
an identically valued enum in enum gdb_syscall:
...
static enum gdb_syscall
i386_canonicalize_syscall (int syscall)
{
  enum { i386_syscall_max = 499 };

  if (syscall <= i386_syscall_max)
    return (enum gdb_syscall) syscall;
  else
    return gdb_sys_no_syscall;
}
...

However, that's not the case.  The value of gdb_sys_socketpair is not 360,
but 512:
...
enum gdb_syscall {
  ...
  gdb_sys_getrandom = 355,
  gdb_sys_statx = 383,
  ...
  gdb_sys_socketpair = 512,
...

Consequently, when record_linux_system_call is called with
syscall == i386_canonicalize_syscall (360), we hit the default case here:
....
  switch (syscall)
    {
    ...
    default:
      gdb_printf (gdb_stderr,
                  _("Process record and replay target doesn't "
                    "support syscall number %d\n"), syscall);
      return -1;
      break;
    }
...
rather than hitting the case for gdb_sys_socketpair.

I initially wrote a trivial fix for this, changing the value of
gdb_sys_socketpair to 360.  However, Andreas Schwab pointed out that there are
other functions (ppc_canonicalize_syscall and s390_canonicalize_syscall) that
make assumptions about specific values of enum gdb_syscall, and fixing this
for i386 may break things for ppc or s390.

So instead, I decided to rewrite i386_canonicalize_syscall to match the
approach taken in aarch64_canonicalize_syscall, which allows
gdb_sys_socketpair to keep the same value.

So, fix this by:
- adding a new table file gdb/i386-syscalls.def, using a SYSCALL entry for
  each syscall, generated from arch/x86/entry/syscalls/syscall_32.tbl,
- using gdb/i386-syscalls.def to define enum i386_syscall, and
- using macros SYSCALL_MAP, SYSCALL_MAP_RENAME and UNSUPPORTED_SYSCALL_MAP to
  define the mapping from enum i386_syscall to enum gdb_syscall in
  i386_canonicalize_syscall.

I've created the mapping as follows:
- I used arch/x86/entry/syscalls/syscall_32.tbl to generate an initial mapping
  using SYSCALL_MAP for each syscall,
- I attempted to compile this and used the compilation errors about
  non-existing gdb_sys_ values to change those entries to
  UNSUPPORTED_SYSCALL_MAP, which got me a compiling version,
- I reviewed the UNSUPPORTED_SYSCALL_MAP entries, changing to
  SYSCALL_MAP_RENAME where necessary,
- I then reviewed syscalls below 500 that mapped to a gdb_syscall value below
  500, but not the same, and fixed those using SYSCALL_MAP_RENAME, and
- reviewed the mapping for gdb_syscall entries >= 500.

On the resulting mapping, I was able to do the following sanity check:
...
  for (int i = 0; i < 500; ++i)
    {
      int res = i386_canonicalize_syscall (i);
      if (res == i)
	continue;
      if (res == -1)
	continue;
      if (res >= 500)
	continue;
      gdb_assert_not_reached ("");
    }
}
...
to make sure that any syscall below 500 either:
- maps to the same number,
- is unsupported, or
- maps to a number >= 500.

Coming back to our original problem, the socket pair syscall is addressed by
an entry:
...
      SYSCALL_MAP (socketpair);
...
which maps i386_sys_socketpair (360) to gdb_sys_socketpair (512).

Tested on x86_64-linux with target board unix/-m32.

Approved-By: Guinevere Larsen <guinevere@redhat.com>

PR tdep/32770
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32770

(cherry picked from commit fbfb29b304)
2025-03-15 13:17:36 +01:00
GDB Administrator
0230950c6e Automatic date update in version.in 2025-03-15 00:01:04 +00:00
GDB Administrator
7a6ff0051f Automatic date update in version.in 2025-03-14 00:01:23 +00:00
Tom de Vries
55b7a56b1f [gdb/record] Fix out-of-bounds write in aarch64_record_asimd_load_store
After compiling gdb with -fstack-protector-all, and running test-case
gdb.reverse/getrandom.exp on aarch64-linux, we run into
"Stack smashing detected" in function aarch64_record_asimd_load_store.

This is reported in PR record/32784.

This happens due to an out-of-bounds write to local array record_buf_mem:
...
  uint64_t record_buf_mem[24];
...
when recording insn:
...
B+>0xfffff7ff4d10  st1     {v0.16b-v3.16b}, [x0]
...

We can fix this by increasing the array size to 128, but rather than again
hardcoding a size, reimplement record_buf_mem as std::vector.

Tested on aarch64-linux.

Approved-By: Guinevere Larsen <guinevere@redhat.com>

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32784
(cherry picked from commit 51729ea090)
2025-03-13 11:15:05 +01:00
GDB Administrator
465465ce9c Automatic date update in version.in 2025-03-13 00:00:41 +00:00
GDB Administrator
b4d832ef2b Automatic date update in version.in 2025-03-12 00:01:24 +00:00
GDB Administrator
5f2f9d4dcc Automatic date update in version.in 2025-03-11 00:01:15 +00:00
Simon Marchi
4996027dbf gdb/dwarf: save DWARF version in dwarf2_loclist_baton, remove it from dwarf2_per_cu
When running:

    $ make check TESTS="gdb.cp/cpexprs-debug-types.exp" RUNTESTFLAGS="--target_board=fission"

I get:

    (gdb) break -qualified main
    /home/smarchi/src/binutils-gdb/gdb/dwarf2/read.h:295: internal-error: version: Assertion `m_dwarf_version != 0' failed.

The problem is that dwarf2_per_cu objects created in the
read_cutu_die_from_dwo code path never have their DWARF version set.  A
seemingly obvious solution would be to add a call to
dwarf2_per_cu::set_version in there (there's a patch in the referenced
PR that does that).  However, this comment in
read_comp_units_from_section is a bit scary:

      /* Init this asap, to avoid a data race in the set_version in
	 cutu_reader::cutu_reader (which may be run in parallel for the cooked
	 index case).  */
      this_cu->set_version (cu_header.version);

I don't know if a DWO file can be read while the cooked indexer runs, so
if it would be a problem here, but I prefer to be safe than sorry.  This
patch side-steps the problem by deleting the DWARF version from
dwarf2_per_cu.

The only users of dwarf2_per_cu::version are the loclists callbacks in
`loc.c`.  Add the DWARF version to dwarf2_loclist_baton and modify those
callbacks to get the version from there instead.  Initialize that new
field in fill_in_loclist_baton.

I like this approach because there is no version field that is possibly
unset now.

I wasn't keen on doing this at first because I thought it would waste
space, but the dwarf2_loclist_baton has 7 bytes of padding at the end
anyway, so we might as well use that.

Cc: Ricky Zhou <ricky@rzhou.org>
Cc: Tom de Vries <tdevries@suse.de>
Cc: Tom Tromey <tom@tromey.com>
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32309
Change-Id: I30d4ede7d67da5d80ff65c6122f5868e1098ec52
Approved-By: Tom Tromey <tom@tromey.com>
(cherry picked from commit f62cf22157)
2025-03-10 16:24:47 -04:00
GDB Administrator
fbc36742f7 Automatic date update in version.in 2025-03-10 00:00:42 +00:00
Brandon Belew
ebb9d77f35 Fix segfault if target_fileio_read_alloc fails
Check for target_fileio_read_alloc failure in linux_fill_prpsinfo
before dereferencing buffer. This fixes a segfault in the 'gcore'
command when attached to certain remote targets.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32441
Approved-By: Andrew Burgess <aburgess@redhat.com>
(cherry picked from commit cbc6950a66)
2025-03-09 08:17:55 +04:00
GDB Administrator
94f97a3cdd Automatic date update in version.in 2025-03-09 00:01:12 +00:00
GDB Administrator
96f3f01d9d Automatic date update in version.in 2025-03-08 00:00:36 +00:00
GDB Administrator
8bdaecde02 Automatic date update in version.in 2025-03-07 00:00:49 +00:00
GDB Administrator
fa315f8c30 Automatic date update in version.in 2025-03-06 00:01:03 +00:00
GDB Administrator
a5bfad18c4 Automatic date update in version.in 2025-03-05 00:01:28 +00:00
GDB Administrator
de2c17ad1d Automatic date update in version.in 2025-03-04 00:01:35 +00:00
GDB Administrator
fdf8666844 Automatic date update in version.in 2025-03-03 00:01:14 +00:00
GDB Administrator
7aef96f044 Automatic date update in version.in 2025-03-02 00:00:57 +00:00
GDB Administrator
26f7f82058 Automatic date update in version.in 2025-03-01 00:00:41 +00:00
GDB Administrator
56e453742e Automatic date update in version.in 2025-02-28 00:00:28 +00:00
GDB Administrator
0674100e37 Automatic date update in version.in 2025-02-27 00:01:38 +00:00
GDB Administrator
636e85837a Automatic date update in version.in 2025-02-26 00:00:45 +00:00
GDB Administrator
09774db4f0 Automatic date update in version.in 2025-02-25 00:00:45 +00:00
GDB Administrator
7ea5b42758 Automatic date update in version.in 2025-02-24 00:00:42 +00:00
GDB Administrator
db69753580 Automatic date update in version.in 2025-02-23 00:01:45 +00:00
GDB Administrator
15672434ec Automatic date update in version.in 2025-02-22 00:01:08 +00:00
GDB Administrator
de09906181 Automatic date update in version.in 2025-02-21 00:01:32 +00:00
GDB Administrator
397f62b9d9 Automatic date update in version.in 2025-02-20 00:01:26 +00:00
GDB Administrator
e4ec026513 Automatic date update in version.in 2025-02-19 00:00:48 +00:00
GDB Administrator
bd6f05164f Automatic date update in version.in 2025-02-18 00:01:32 +00:00
GDB Administrator
6d52d7b146 Automatic date update in version.in 2025-02-17 00:00:34 +00:00
GDB Administrator
398b42317e Automatic date update in version.in 2025-02-16 00:01:03 +00:00
GDB Administrator
5429f87550 Automatic date update in version.in 2025-02-15 00:00:40 +00:00
GDB Administrator
944e553674 Automatic date update in version.in 2025-02-14 00:00:47 +00:00
GDB Administrator
d6762792f7 Automatic date update in version.in 2025-02-13 00:01:19 +00:00
GDB Administrator
5baddddfbe Automatic date update in version.in 2025-02-12 00:00:36 +00:00