gdb/testsuite: attach to i386 process stopped in vDSO

Message ID 6fea18ab451ed9e04ee7716635e7f0be91058122.1710504782.git.aburgess@redhat.com
State New
Headers
Series gdb/testsuite: attach to i386 process stopped in vDSO |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_gdb_build--master-arm success Testing passed
linaro-tcwg-bot/tcwg_gdb_check--master-arm success Testing passed
linaro-tcwg-bot/tcwg_gdb_check--master-aarch64 success Testing passed

Commit Message

Andrew Burgess March 15, 2024, 12:13 p.m. UTC
  Fedora GDB has carried around a patch for a while which tested
attaching to an i386 process which is stopped within the vDSO library
region.  Apparently, at some point in the distant past there was an
issue finding symbol information for this region in this situation.

I'm struggling to track down the precise details of what the original
bug was, however, acquiring symbol information for the vDSO region is
different than for "normal" shared libraries -- the vDSO information
is synthesised within GDB during the attach / inferior creation
process -- so it's not unreasonable to imagine that there could be a
bug specifically in this area of GDB which wouldn't impact "normal"
shared libraries.

I looked for references to vDSO in our testsuite and couldn't find
any tests that looked like they did the same sort of thing, so I'd
like to propose adding this test to our testsuite.

It's a pretty simple test, and doesn't take long to run, so the cost
of adding this is not huge.
---
 gdb/testsuite/gdb.arch/i386-attach-see-vdso.c | 25 +++++++++
 .../gdb.arch/i386-attach-see-vdso.exp         | 55 +++++++++++++++++++
 2 files changed, 80 insertions(+)
 create mode 100644 gdb/testsuite/gdb.arch/i386-attach-see-vdso.c
 create mode 100644 gdb/testsuite/gdb.arch/i386-attach-see-vdso.exp


base-commit: 9fe07b7f95fbfdaf34d5b69e6d73cae000b43eea
  

Comments

Tom Tromey March 15, 2024, 1:22 p.m. UTC | #1
>>>>> "Andrew" == Andrew Burgess <aburgess@redhat.com> writes:

Andrew> I looked for references to vDSO in our testsuite and couldn't find
Andrew> any tests that looked like they did the same sort of thing, so I'd
Andrew> like to propose adding this test to our testsuite.

Seems fine to me.  Thank you.
Approved-By: Tom Tromey <tom@tromey.com>

Andrew> It's a pretty simple test, and doesn't take long to run, so the cost
Andrew> of adding this is not huge.

I basically never pay attention to this.

I used to sometimes do coverage testing and use that to guide
test-writing, but sadly coverage (specifically lcov) has been broken for
me for the last few Fedora releases.

Tom
  

Patch

diff --git a/gdb/testsuite/gdb.arch/i386-attach-see-vdso.c b/gdb/testsuite/gdb.arch/i386-attach-see-vdso.c
new file mode 100644
index 00000000000..2eee4c4995c
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/i386-attach-see-vdso.c
@@ -0,0 +1,25 @@ 
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2024 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include <unistd.h>
+
+int
+main (void)
+{
+  pause ();
+  return 1;
+}
diff --git a/gdb/testsuite/gdb.arch/i386-attach-see-vdso.exp b/gdb/testsuite/gdb.arch/i386-attach-see-vdso.exp
new file mode 100644
index 00000000000..dc757748332
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/i386-attach-see-vdso.exp
@@ -0,0 +1,55 @@ 
+# Copyright 2024 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Ensure that when we attach to an i386 process, which is stopped in
+# the vDSO, we are able to get symbols for the vDSO region.
+
+require {is_any_target "i?86-*-linux*" "x86_64-*-linux*"}
+require can_spawn_for_attach
+
+standard_testfile
+
+set options {debug}
+if {![istarget "i386-*-*"]} {
+    lappend options "additional_flags=-m32"
+}
+
+# The kernel VDSO is used for the syscalls returns only on i386 (not x86_64).
+if { [build_executable "failed to prepare" $testfile $srcfile $options] } {
+    return -1
+}
+
+# Don't tell GDB which executable we're debugging.
+clean_restart
+
+# Start the test program ready for GDB to attach to it.
+set test_spawn_id [spawn_wait_for_attach $binfile]
+set testpid [spawn_id_get_pid $test_spawn_id]
+
+# Attach GDB to the process.
+gdb_test_multiple "attach $testpid" "attach to test process" {
+    -re -wrap "Attaching to process $testpid.*" {
+	pass $gdb_test_name
+    }
+}
+
+# The inferior will be stopped within the vDSO, check we get symbols
+# for this address.
+gdb_test "bt" "#0 *0x\[0-9a-f\]* in \[^?\]+\r\n#1\\s+.*" \
+    "backtrace decodes VDSO"
+
+# Exit GDB and the spawned process.
+gdb_exit
+kill_wait_spawned_process $test_spawn_id