* [PATCH 4/4] catch syscall -- try 3 -- Build system, documentation and testcase
@ 2008-11-18 20:44 Sérgio Durigan Júnior
2008-11-19 0:44 ` Eli Zaretskii
0 siblings, 1 reply; 6+ messages in thread
From: Sérgio Durigan Júnior @ 2008-11-18 20:44 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 825 bytes --]
The final part, responsible for the build system update, documentation
and testcase.
--
Sérgio Durigan Júnior
Linux on Power Toolchain - Software Engineer
Linux Technology Center - LTC
IBM Brazil
gdb/ChangeLog:
2008-11-18 Sergio Durigan Junior <sergiodj@linux.vnet.ibm.com>
* configure, config.in: Regenerate.
* Makefile.in: Support for relocatable GDB datadir and XML
syscall.
* configure.ac: Support for relocatable GDB datadir.
gdb/doc/ChangeLog:
2008-11-18 Sergio Durigan Junior <sergiodj@linux.vnet.ibm.com>
* gdb.texinfo (catch syscall): Documentation about the new
feature.
gdb/testsuite/ChangeLog:
2008-11-18 Sergio Durigan Junior <sergiodj@linux.vnet.ibm.com>
* Makefile.in: Inclusion of catch-syscall object.
* gdb.base/catch-syscall.c: New file.
* gdb.base/catch-syscall.exp: New file.
[-- Attachment #2: catch-syscall-build-doc-testcase.patch --]
[-- Type: text/x-patch, Size: 28385 bytes --]
diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index 5432c88..24be153 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -172,6 +172,9 @@ LIBICONV = @LIBICONV@
TARGET_SYSTEM_ROOT = @TARGET_SYSTEM_ROOT@
TARGET_SYSTEM_ROOT_DEFINE = @TARGET_SYSTEM_ROOT_DEFINE@
+# Did the user give us a --with-gdb-datadir option?
+GDB_DATADIR_PATH = @GDB_DATADIR_PATH@
+
# Helper code from gnulib.
LIBGNU = gnulib/libgnu.a
INCGNU = -I$(srcdir)/gnulib -Ignulib
@@ -457,6 +460,7 @@ TARGET_OBS = @TARGET_OBS@
# All target-dependent objects files that require 64-bit CORE_ADDR
# (used with --enable-targets=all --enable-64-bit-bfd).
ALL_64_TARGET_OBS = \
+ linux-tdep.o \
alphabsd-tdep.o alphafbsd-tdep.o alpha-linux-tdep.o alpha-mdebug-tdep.o \
alphanbsd-tdep.o alphaobsd-tdep.o alpha-osf1-tdep.o alpha-tdep.o \
amd64fbsd-tdep.o amd64-linux-tdep.o amd64nbsd-tdep.o amd64obsd-tdep.o \
@@ -468,6 +472,7 @@ ALL_64_TARGET_OBS = \
# All other target-dependent objects files (used with --enable-targets=all).
ALL_TARGET_OBS = \
+ linux-tdep.o \
armbsd-tdep.o arm-linux-tdep.o armnbsd-tdep.o armobsd-tdep.o \
arm-tdep.o arm-wince-tdep.o \
avr-tdep.o \
@@ -657,6 +662,8 @@ SFILES = ada-exp.y ada-lang.c ada-typeprint.c ada-valprint.c ada-tasks.c \
valarith.c valops.c valprint.c value.c varobj.c vec.c \
wrapper.c \
xml-tdesc.c xml-support.c \
+ linux-tdep.c \
+ xml-syscall.c \
inferior.c
LINTFILES = $(SFILES) $(YYFILES) $(CONFIG_SRCS) init.c
@@ -667,7 +674,7 @@ LINTFILES = $(SFILES) $(YYFILES) $(CONFIG_SRCS) init.c
# wrong if TAGS has files twice). Because this is tricky to get
# right, it is probably easiest just to list .h files here directly.
-HFILES_NO_SRCDIR = osf-share/cma_debug_client.h \
+HFILES_NO_SRCDIR = osf-share/cma_debug_client.h linux-tdep.h \
osf-share/HP800/cma_thread_io.h osf-share/cma_sequence.h \
osf-share/cma_mutex.h osf-share/cma_semaphore_defs.h \
osf-share/cma_list.h osf-share/cma_handle.h osf-share/cma_stack.h \
@@ -727,7 +734,7 @@ config/sparc/nm-sol2.h config/nm-linux.h config/mips/nm-irix5.h \
config/rs6000/nm-rs6000.h top.h bsd-kvm.h gdb-stabs.h reggroups.h \
annotate.h sim-regno.h dictionary.h dfp.h main.h frame-unwind.h \
remote-fileio.h i386-linux-tdep.h vax-tdep.h objc-lang.h \
-sentinel-frame.h bcache.h symfile.h
+sentinel-frame.h bcache.h symfile.h xml-syscall.h
# Header files that already have srcdir in them, or which are in objdir.
@@ -806,10 +813,16 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \
trad-frame.o \
tramp-frame.o \
solib.o solib-null.o \
- prologue-value.o memory-map.o xml-support.o \
+ prologue-value.o memory-map.o xml-support.o xml-syscall.o \
target-descriptions.o target-memory.o xml-tdesc.o xml-builtin.o \
inferior.o
+# Definitions for the syscall's XML files and dir
+XML_SYSCALLS_DIR = syscalls/
+XML_SYSCALLS_FILES = gdb-syscalls.dtd \
+ ppc-linux.xml ppc64-linux.xml \
+ i386-linux.xml amd64-linux.xml
+
TSOBS = inflow.o
SUBDIRS = @subdirs@
@@ -843,11 +856,38 @@ generated_files = config.h observer.h observer.inc ada-lex.c \
$(COMPILE) $<
$(POSTCOMPILE)
-all: gdb$(EXEEXT) $(CONFIG_ALL)
+all: gdb$(EXEEXT) $(CONFIG_ALL) xml-syscall-copy
@$(MAKE) $(FLAGS_TO_PASS) DO=all "DODIRS=`echo $(SUBDIRS) | sed 's/testsuite//'`" subdir_do
.PHONY: all-tui
all-tui: $(TUI)$(EXEEXT)
+xml-syscall-copy:
+ if [ "`cd $(srcdir) && pwd`" != "`pwd`" ] ; then \
+ mkdir -p ./$(XML_SYSCALLS_DIR) ; \
+ list='$(XML_SYSCALLS_FILES)' ; \
+ for file in $$list ; do \
+ f=$(srcdir)/$(XML_SYSCALLS_DIR)/$$file ; \
+ if test -f $$f ; then \
+ $(INSTALL_DATA) $$f \
+ ./$(XML_SYSCALLS_DIR) ; \
+ fi ; \
+ done ; \
+ fi ;
+
+# This target is responsible for properly installing the syscalls'
+# XML files in the system.
+xml-syscall-install:
+ $(SHELL) $(srcdir)/../mkinstalldirs \
+ $(DESTDIR)$(GDB_DATADIR_PATH)/$(XML_SYSCALLS_DIR) ; \
+ list='$(XML_SYSCALLS_FILES)' ; \
+ for file in $$list ; do \
+ f=$(srcdir)/$(XML_SYSCALLS_DIR)/$$file ; \
+ if test -f $$f ; then \
+ $(INSTALL_DATA) $$f \
+ $(DESTDIR)$(GDB_DATADIR_PATH)/$(XML_SYSCALLS_DIR) ; \
+ fi ; \
+ done ;
+
installcheck:
# The check target can not use subdir_do, because subdir_do does not
@@ -901,8 +941,11 @@ gdb.z:gdb.1
# source file and doesn't care about rebuilding or just wants to save the
# time it takes for make to check that all is up to date.
# install-only is intended to address that need.
-install: all install-only
-install-only: $(CONFIG_INSTALL)
+install: all install-only
+
+# The "install-only" target also installs the syscalls' XML files in
+# the system.
+install-only: $(CONFIG_INSTALL) xml-syscall-install
transformed_name=`t='$(program_transform_name)'; \
echo gdb | sed -e "$$t"` ; \
if test "x$$transformed_name" = x; then \
@@ -1258,6 +1301,7 @@ force_update:
MAKEOVERRIDES=
ALLDEPFILES = \
+ linux-tdep.c \
aix-thread.c \
alpha-nat.c alphabsd-nat.c alpha-linux-nat.c \
alpha-tdep.c alpha-mdebug-tdep.c \
diff --git a/gdb/configure.ac b/gdb/configure.ac
index 054d5c2..77e2f6c 100644
--- a/gdb/configure.ac
+++ b/gdb/configure.ac
@@ -118,6 +118,36 @@ case ${debugdir} in
;;
esac
+# GDB's datadir relocation
+
+gdbdatadir=${datadir}/gdb
+
+AC_ARG_WITH([gdb-datadir],
+ [AS_HELP_STRING([--with-gdb-datadir],
+ [look for global separate data files in this path [DATADIR/gdb]])], [gdbdatadir="${withval}"])
+
+AC_DEFINE_DIR(GDB_DATADIR, gdbdatadir,
+ [Global directory for GDB data files. ])
+
+if test "x$exec_prefix" = xNONE || test "x$exec_prefix" = 'x${prefix}'; then
+ if test "x$prefix" = xNONE; then
+ test_prefix=/usr/local
+ else
+ test_prefix=$prefix
+ fi
+else
+ test_prefix=$exec_prefix
+fi
+
+case ${gdbdatadir} in
+ "${test_prefix}"|"${test_prefix}/"*|\
+ '${exec_prefix}'|'${exec_prefix}/'*)
+ AC_DEFINE(GDB_DATADIR_RELOCATABLE, 1, [Define if GDB datadir should be relocated when GDB is moved.])
+ ;;
+esac
+GDB_DATADIR_PATH=${gdbdatadir}
+AC_SUBST(GDB_DATADIR_PATH)
+
AC_CONFIG_SUBDIRS(doc testsuite)
# Check whether to support alternative target configurations
diff --git a/gdb/configure.tgt b/gdb/configure.tgt
index 95556f8..cea6d88 100644
--- a/gdb/configure.tgt
+++ b/gdb/configure.tgt
@@ -36,7 +36,7 @@ alpha*-*-osf*)
alpha*-*-linux*)
# Target: Little-endian Alpha running Linux
gdb_target_obs="alpha-tdep.o alpha-mdebug-tdep.o alpha-linux-tdep.o \
- solib.o solib-svr4.o"
+ solib.o solib-svr4.o linux-tdep.o"
;;
alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu)
# Target: FreeBSD/alpha
@@ -63,7 +63,7 @@ alpha*-*-*)
am33_2.0*-*-linux*)
# Target: Matsushita mn10300 (AM33) running Linux
gdb_target_obs="mn10300-tdep.o mn10300-linux-tdep.o corelow.o \
- solib.o solib-svr4.o"
+ solib.o solib-svr4.o linux-tdep.o"
;;
arm*-wince-pe | arm*-*-mingw32ce*)
@@ -75,7 +75,8 @@ arm*-wince-pe | arm*-*-mingw32ce*)
arm*-*-linux*)
# Target: ARM based machine running GNU/Linux
gdb_target_obs="arm-tdep.o arm-linux-tdep.o glibc-tdep.o \
- solib.o solib-svr4.o symfile-mem.o corelow.o"
+ solib.o solib-svr4.o symfile-mem.o corelow.o \
+ linux-tdep.o"
build_gdbserver=yes
;;
arm*-*-netbsd* | arm*-*-knetbsd*-gnu)
@@ -128,7 +129,7 @@ hppa*-*-hpux*)
hppa*-*-linux*)
# Target: HP PA-RISC running Linux
gdb_target_obs="hppa-tdep.o hppa-linux-tdep.o glibc-tdep.o \
- solib.o solib-svr4.o symfile-mem.o"
+ solib.o solib-svr4.o symfile-mem.o linux-tdep.o"
;;
hppa*-*-netbsd*)
# Target: NetBSD/hppa
@@ -185,7 +186,7 @@ i[34567]86-*-solaris*)
i[34567]86-*-linux*)
# Target: Intel 386 running GNU/Linux
gdb_target_obs="i386-tdep.o i386-linux-tdep.o glibc-tdep.o i387-tdep.o \
- solib.o solib-svr4.o symfile-mem.o corelow.o"
+ solib.o solib-svr4.o symfile-mem.o corelow.o linux-tdep.o"
build_gdbserver=yes
;;
i[34567]86-*-gnu*)
@@ -213,7 +214,7 @@ i[34567]86-*-*)
ia64-*-linux*)
# Target: Intel IA-64 running GNU/Linux
gdb_target_obs="ia64-tdep.o ia64-linux-tdep.o \
- solib.o solib-svr4.o symfile-mem.o"
+ solib.o solib-svr4.o symfile-mem.o linux-tdep.o"
build_gdbserver=yes
;;
ia64*-*-*)
@@ -237,7 +238,8 @@ m32c-*-*)
m32r*-*-linux*)
# Target: Renesas M32R running GNU/Linux
gdb_target_obs="m32r-tdep.o m32r-linux-tdep.o remote-m32r-sdi.o \
- glibc-tdep.o solib.o solib-svr4.o symfile-mem.o"
+ glibc-tdep.o solib.o solib-svr4.o symfile-mem.o \
+ linux-tdep.o"
gdb_sim=../sim/m32r/libsim.a
build_gdbserver=yes
;;
@@ -262,7 +264,7 @@ fido-*-elf*)
m68*-*-linux*)
# Target: Motorola m68k with a.out and ELF
gdb_target_obs="m68k-tdep.o m68klinux-tdep.o solib.o solib-svr4.o \
- glibc-tdep.o symfile-mem.o"
+ glibc-tdep.o symfile-mem.o linux-tdep.o"
build_gdbserver=yes
;;
m68*-*-netbsd* | m68*-*-knetbsd*-gnu)
@@ -298,7 +300,8 @@ mips*-sgi-irix6*)
mips*-*-linux*)
# Target: Linux/MIPS
gdb_target_obs="mips-tdep.o mips-linux-tdep.o glibc-tdep.o \
- corelow.o solib.o solib-svr4.o symfile-mem.o"
+ corelow.o solib.o solib-svr4.o symfile-mem.o \
+ linux-tdep.o"
gdb_sim=../sim/mips/libsim.a
build_gdbserver=yes
;;
@@ -349,7 +352,8 @@ powerpc-*-aix* | rs6000-*-*)
powerpc-*-linux* | powerpc64-*-linux*)
# Target: PowerPC running Linux
gdb_target_obs="rs6000-tdep.o ppc-linux-tdep.o ppc-sysv-tdep.o \
- solib.o solib-svr4.o corelow.o symfile-mem.o"
+ solib.o solib-svr4.o corelow.o symfile-mem.o \
+ linux-tdep.o"
gdb_sim=../sim/ppc/libsim.a
build_gdbserver=yes
;;
@@ -376,7 +380,8 @@ score-*-*)
sh*-*-linux*)
# Target: GNU/Linux Super-H
gdb_target_obs="sh-tdep.o sh64-tdep.o sh-linux-tdep.o monitor.o \
- dsrec.o solib.o solib-svr4.o symfile-mem.o glibc-tdep.o"
+ dsrec.o solib.o solib-svr4.o symfile-mem.o glibc-tdep.o \
+ linux-tdep.o"
gdb_sim=../sim/sh/libsim.a
build_gdbserver=yes
;;
@@ -404,13 +409,14 @@ sh*)
sparc-*-linux*)
# Target: GNU/Linux SPARC
gdb_target_obs="sparc-tdep.o sparc-sol2-tdep.o sol2-tdep.o \
- sparc-linux-tdep.o solib.o solib-svr4.o symfile-mem.o"
+ sparc-linux-tdep.o solib.o solib-svr4.o symfile-mem.o \
+ linux-tdep.o"
;;
sparc64-*-linux*)
# Target: GNU/Linux UltraSPARC
gdb_target_obs="sparc64-tdep.o sparc64-sol2-tdep.o sol2-tdep.o \
sparc64-linux-tdep.o sparc-tdep.o sparc-sol2-tdep.o \
- sparc-linux-tdep.o solib.o solib-svr4.o"
+ sparc-linux-tdep.o solib.o solib-svr4.o linux-tdep.o"
build_gdbserver=yes
;;
sparc*-*-freebsd* | sparc*-*-kfreebsd*-gnu)
@@ -508,7 +514,8 @@ x86_64-*-linux*)
# Target: GNU/Linux x86-64
gdb_target_obs="amd64-tdep.o amd64-linux-tdep.o i386-tdep.o \
i387-tdep.o i386-linux-tdep.o glibc-tdep.o \
- solib.o solib-svr4.o corelow.o symfile-mem.o"
+ solib.o solib-svr4.o corelow.o symfile-mem.o \
+ linux-tdep.o"
build_gdbserver=yes
;;
x86_64-*-freebsd* | x86_64-*-kfreebsd*-gnu)
@@ -531,7 +538,8 @@ x86_64-*-openbsd*)
xtensa*-*-linux*) gdb_target=linux
# Target: GNU/Linux Xtensa
gdb_target_obs="xtensa-tdep.o xtensa-config.o xtensa-linux-tdep.o \
- solib.o solib-svr4.o corelow.o symfile-mem.o"
+ solib.o solib-svr4.o corelow.o symfile-mem.o \
+ linux-tdep.o"
build_gdbserver=yes
;;
xtensa*)
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 26cf4b6..f4d45f3 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -3635,6 +3635,88 @@ A failed Ada assertion.
A call to @code{exec}. This is currently only available for HP-UX
and @sc{gnu}/Linux.
+@item syscall
+@itemx syscall @r{[}@var{name} @r{|} @var{number}@r{]} @r{...}
+@cindex break on a system call.
+A call to or return from a @code{syscall}. If no argument is specified,
+then it catches a call to or return from any system call.
+
+@var{name} can be any valid system call name in the system. You can
+use the @value{GDBN} command-line completion facilities to list the
+available choices. @xref{Completion,, Command Completion}, for
+details on how to do this.
+
+You may also specify the system call numerically. This may be useful
+if @var{GDBN} does not fully support your system's list of system
+calls.
+
+The example below illustrates how this command works if you don't provide
+arguments to it:
+
+@smallexample
+(gdb) catch syscall
+Catchpoint 1 (syscall)
+(gdb) r
+Starting program: /tmp/catch-syscall
+
+Catchpoint 1 (calling syscall 'close'), 0xffffe424 in __kernel_vsyscall ()
+(gdb) c
+Continuing.
+
+Catchpoint 1 (returned from syscall 'close'), 0xffffe424 in __kernel_vsyscall ()
+(gdb)
+@end smallexample
+
+Here is an example of catching a system call by name:
+
+@smallexample
+(gdb) catch syscall chroot
+Catchpoint 1 (syscalls 'chroot')
+(gdb) r
+Starting program: /tmp/catch-syscall
+
+Catchpoint 1 (calling syscall 'chroot'), 0xffffe424 in __kernel_vsyscall ()
+(gdb) c
+Continuing.
+
+Catchpoint 1 (returned from syscall 'chroot'), 0xffffe424 in __kernel_vsyscall ()
+(gdb)
+@end smallexample
+
+And last but not least, an example of specifying a system call
+numerically:
+
+@smallexample
+(gdb) catch syscall 252
+Catchpoint 1 (syscalls 'exit_group')
+(gdb) r
+Starting program: /tmp/catch-syscall
+
+Catchpoint 1 (calling syscall 'exit_group'), 0xffffe424 in __kernel_vsyscall ()
+(gdb) c
+Continuing.
+
+Program exited normally.
+(gdb)
+@end smallexample
+
+If you configure @value{GDBN} using the @samp{--without-expat} option,
+it will not be able to display syscall names. Also, if your
+architecture does not have an XML file describing its system calls,
+you will not be able to see the syscall names. In either case, you
+will see a warning like this:
+
+@smallexample
+(gdb) catch syscall
+warning: Could not open "syscalls/i386-linux.xml"
+warning: Could not load the syscall XML file 'syscalls/i386-linux.xml'.
+GDB will not be able to display syscall names.
+Catchpoint 1 (syscall)
+(gdb)
+@end smallexample
+
+Of course, the file name will change depending on your architecture and system.
+
@item fork
A call to @code{fork}. This is currently only available for HP-UX
and @sc{gnu}/Linux.
diff --git a/gdb/testsuite/gdb.base/Makefile.in b/gdb/testsuite/gdb.base/Makefile.in
index 9f382db..12db521 100644
--- a/gdb/testsuite/gdb.base/Makefile.in
+++ b/gdb/testsuite/gdb.base/Makefile.in
@@ -12,7 +12,7 @@ EXECUTABLES = all-types annota1 bitfields break \
scope section_command setshow setvar shmain sigall signals \
solib solib_sl so-impl-ld so-indr-cl \
step-line step-test structs structs2 \
- twice-tmp varargs vforked-prog watchpoint whatis
+ twice-tmp varargs vforked-prog watchpoint whatis catch-syscall
MISCELLANEOUS = coremmap.data ../foobar.baz \
shr1.sl shr2.sl solib_sl.sl solib1.sl solib2.sl
diff --git a/gdb/testsuite/gdb.base/catch-syscall.c b/gdb/testsuite/gdb.base/catch-syscall.c
new file mode 100644
index 0000000..64850de
--- /dev/null
+++ b/gdb/testsuite/gdb.base/catch-syscall.c
@@ -0,0 +1,25 @@
+/* This file is used to test the 'catch syscall' feature on GDB.
+
+ Please, if you are going to edit this file DO NOT change the syscalls
+ being called (nor the order of them). If you really must do this, then
+ take a look at catch-syscall.exp and modify there too.
+
+ Written by Sergio Durigan Junior <sergiodj@linux.vnet.ibm.com>
+ September, 2008 */
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+int
+main (void)
+{
+ /* A close() with a wrong argument. We are only
+ interested in the syscall. */
+ close (-1);
+
+ chroot (".");
+
+ /* The last syscall. Do not change this. */
+ _exit (0);
+}
diff --git a/gdb/testsuite/gdb.base/catch-syscall.exp b/gdb/testsuite/gdb.base/catch-syscall.exp
new file mode 100644
index 0000000..5c71b1c
--- /dev/null
+++ b/gdb/testsuite/gdb.base/catch-syscall.exp
@@ -0,0 +1,386 @@
+# Copyright 1997, 1999, 2007, 2008 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/>.
+
+
+# This program tests the 'catch syscall' functionality.
+#
+# It was written by Sergio Durigan Junior <sergiodj@linux.vnet.ibm.com>
+# on September/2008.
+
+if { [is_remote target] || ![isnative] } then {
+ continue
+}
+
+set prms_id 0
+set bug_id 0
+
+global srcfile
+set testfile "catch-syscall"
+set srcfile ${testfile}.c
+set binfile ${objdir}/${subdir}/${testfile}
+
+# All (but the last) syscalls from the example code
+# They are ordered according to the file, so do not change this.
+set all_syscalls { "close" "chroot" }
+# The last syscall (exit()) does not return, so
+# we cannot expect the catchpoint to be triggered
+# twice. It is a special case.
+set last_syscall "exit_group"
+
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
+ untested catch-syscall.exp
+ return -1
+}
+
+# Until "catch syscall" is implemented on other targets...
+if {![istarget "hppa*-hp-hpux*"] && ![istarget "*-linux*"]} then {
+ continue
+}
+
+# This shall be updated whenever 'catch syscall' is implemented
+# on some architecture.
+#if { ![istarget "x86_64-*-linux*"] && ![istarget "i\[34567\]86-*-linux*"]
+if { ![istarget "i\[34567\]86-*-linux*"]
+ && ![istarget "powerpc-*-linux*"] && ![istarget "powerpc64-*-linux*"] } {
+ continue
+}
+
+# Internal procedure used to check if, before any syscall is caught,
+# the command 'info breakpoints' correctly lists the catchpoints AND
+# says that nothing was caught yet.
+proc check_init_info_breakpoints {} {
+ global gdb_prompt
+
+ # Verifying that the catchpoint appears in the 'info breakpoints'
+ # command, but with "<any syscall>".
+ set thistest "catch syscall appears in 'info breakpoints'"
+ gdb_test "info breakpoints" ".*catchpoint.*keep y.*syscall \"<any syscall>\".*" $thistest
+}
+
+# This procedure checks if, after a syscall catchpoint is hit, the
+# command 'info breakpoints' correctly lists the syscall name.
+proc check_info_breakpoints { syscall } {
+ global gdb_prompt
+
+ set thistest "syscall $syscall appears in 'info breakpoints'"
+ gdb_test "info breakpoints" ".*catchpoint.*keep y.*syscall (.)?${syscall}(.)?.*" $thistest
+}
+
+# This procedure checks if there was a call to a syscall.
+proc check_call_to_syscall { syscall } {
+ global gdb_prompt
+
+ set thistest "program has called $syscall"
+ gdb_test "continue" "Catchpoint .*(calling syscall .?${syscall}.?).*" $thistest
+
+ # Checking if the syscall is reported to be caught in
+ # 'info breakpoints'.
+ check_info_breakpoints "$syscall"
+}
+
+# This procedure checks if the syscall returned.
+proc check_return_from_syscall { syscall } {
+ global gdb_prompt
+
+ set thistest "syscall $syscall has returned"
+ gdb_test "continue" "Catchpoint .*(returned from syscall (.)?${syscall}(.)?).*" $thistest
+
+ # Checking if the syscall is reported to be caught in
+ # 'info breakpoints'.
+ check_info_breakpoints "$syscall"
+}
+
+# Internal procedure that performs two 'continue' commands and checks if
+# a syscall call AND return occur.
+proc check_continue { syscall } {
+ global gdb_prompt
+
+ # Testing if the 'continue' stops at the
+ # specified syscall_name. If it does, then it should
+ # first print that the infeior has called the syscall,
+ # and after print that the syscall has returned.
+
+ # Testing if the inferiorr has called the syscall.
+ check_call_to_syscall $syscall
+ # And now, that the syscall has returned.
+ check_return_from_syscall $syscall
+}
+
+# Inserts a syscall catchpoint with an argument.
+proc insert_catch_syscall_with_arg { syscall } {
+ global gdb_prompt
+
+ # Trying to set the syscall
+ set thistest "catch syscall with arguments ($syscall)"
+ gdb_test "catch syscall $syscall" "Catchpoint .*(syscalls (.)?${syscall}(.)?).*" $thistest
+}
+
+proc check_for_program_end {} {
+ global gdb_prompt
+
+ # Deleting the catchpoints
+ delete_breakpoints
+
+ set thistest "successful program end"
+ gdb_test "continue" "Program exited normally.*" $thistest
+
+}
+
+proc test_catch_syscall_without_args {} {
+ global gdb_prompt all_syscalls last_syscall
+
+ # Trying to set the syscall
+ set thistest "setting catch syscall without arguments"
+ gdb_test "catch syscall" "Catchpoint .*(syscall).*" $thistest
+
+ check_init_info_breakpoints
+
+ # We have to check every syscall
+ foreach name $all_syscalls {
+ check_continue $name
+ }
+
+ # At last but not least, we check if the inferior
+ # has called the last (exit) syscall.
+ check_call_to_syscall $last_syscall
+
+ # Now let's see if the inferior correctly finishes.
+ check_for_program_end
+}
+
+proc test_catch_syscall_with_args {} {
+ global gdb_prompt
+ set syscall_name "close"
+
+ insert_catch_syscall_with_arg $syscall_name
+ check_init_info_breakpoints
+
+ # Can we continue until we catch the syscall?
+ check_continue $syscall_name
+
+ # Now let's see if the inferior correctly finishes.
+ check_for_program_end
+}
+
+proc test_catch_syscall_with_wrong_args {} {
+ global gdb_prompt
+ # mlock is not called from the source
+ set syscall_name "mlock"
+
+ insert_catch_syscall_with_arg $syscall_name
+ check_init_info_breakpoints
+
+ # Now, we must verify if the program stops with a continue.
+ # If it doesn't, everything is right (since we don't have
+ # a syscall named "mlock" in it). Otherwise, this is a failure.
+ set thistest "catch syscall with unused syscall ($syscall_name)"
+ gdb_test "continue" "Program exited normally.*" $thistest
+}
+
+proc test_catch_syscall_restarting_inferior {} {
+ global gdb_prompt
+ set syscall_name "chroot"
+
+ insert_catch_syscall_with_arg $syscall_name
+ check_init_info_breakpoints
+
+ # Let's first reach the call of the syscall.
+ check_call_to_syscall $syscall_name
+
+ # Now, restart the program
+ rerun_to_main
+
+ # And check for call/return
+ check_continue $syscall_name
+
+ # Can we finish?
+ check_for_program_end
+}
+
+proc do_syscall_tests {} {
+ global gdb_prompt srcdir
+
+ # First, we need to set GDB datadir.
+ send_gdb "maintenance set gdb_datadir $srcdir/..\n"
+ gdb_expect 10 {
+ -re "$gdb_prompt $" {
+ verbose "Setting GDB datadir to $srcdir/..." 2
+ }
+ timeout {
+ error "Couldn't set GDB datadir."
+ }
+ }
+
+ # Verify that the 'catch syscall' help is available
+ set thistest "help catch syscall"
+ gdb_test "help catch syscall" "Catch system calls.*" $thistest
+
+ # Try to set a catchpoint to a nonsense syscall
+ set thistest "catch syscall to a nonsense syscall is prohibited"
+ gdb_test "catch syscall nonsense_syscall" "Unknown syscall name .*" $thistest
+
+ # Testing the 'catch syscall' command without arguments.
+ # This test should catch any syscalls.
+ if [runto_main] then { test_catch_syscall_without_args }
+
+ # Testing the 'catch syscall' command with arguments.
+ # This test should only catch the specified syscall.
+ if [runto_main] then { test_catch_syscall_with_args }
+
+ # Testing the 'catch syscall' command with WRONG arguments.
+ # This test should not trigger any catchpoints.
+ if [runto_main] then { test_catch_syscall_with_wrong_args }
+
+ # Testing the 'catch' syscall command during a restart of
+ # the inferior.
+ if [runto_main] then { test_catch_syscall_restarting_inferior }
+}
+
+proc test_catch_syscall_fail_noxml {} {
+ global gdb_prompt
+
+ # Sanitizing.
+ delete_breakpoints
+
+ # Testing to see if we receive a warning when calling "catch syscall"
+ # without XML support.
+ set thistest "Catch syscall displays a warning when there is no XML support"
+ gdb_test "catch syscall" "warning: Could not open .*warning: Could not load the syscall XML file .*GDB will not be able to display syscall names.*Catchpoint .*(syscall).*" $thistest
+
+ # Since the catchpoint was set, we must check if it's present at
+ # "info breakpoints"
+ check_init_info_breakpoints
+
+ # Sanitizing.
+ delete_breakpoints
+}
+
+proc test_catch_syscall_without_args_noxml {} {
+ # We will need the syscall names even not using it
+ # because we need to know know many syscalls are in
+ # the example file.
+ global gdb_prompt all_syscalls last_syscall
+
+ delete_breakpoints
+
+ set thistest "Catch syscall without arguments and without XML support"
+ gdb_test "catch syscall" "Catchpoint .*(syscall).*"
+
+ # Now, we should be able to set a catchpoint,
+ # and GDB shall not display the warning anymore.
+ foreach name $all_syscalls {
+ # Unfortunately, we don't know the syscall number
+ # that will be caught because this information is
+ # arch-dependent. Thus, we try to catch anything
+ # similar to a number.
+ check_continue "\[0-9\]*"
+ }
+
+ # At last but not least, we check if the inferior
+ # has called the last (exit) syscall.
+ check_call_to_syscall "\[0-9\]*"
+
+ delete_breakpoints
+}
+
+proc test_catch_syscall_with_args_noxml {} {
+ global gdb_prompt
+
+ # The number of the "close" syscall. This is our
+ # options for a "long-estabilished" syscall in all
+ # Linux architectures, but unfortunately x86_64 and
+ # a few other platforms don't "follow the convention".
+ # Because of this, we need this ugly check :-(.
+ set close_number ""
+ if { [istarget "x86_64-*-linux*"] } {
+ set close_number "3"
+ } else {
+ set close_number "6"
+ }
+
+ delete_breakpoints
+
+ insert_catch_syscall_with_arg $close_number
+ check_init_info_breakpoints
+
+ check_continue $close_number
+
+ delete_breakpoints
+}
+
+proc test_catch_syscall_with_wrong_args_noxml {} {
+ global gdb_prompt
+
+ delete_breakpoints
+
+ # Even without XML support, GDB should not accept unknown
+ # syscall names for the catchpoint.
+ set thistest "Catch a nonsense syscall without XML support"
+ gdb_test "catch syscall nonsense_syscall" "Unknown syscall name .nonsense_syscall.*" $thistest
+
+ delete_breakpoints
+}
+
+proc do_syscall_tests_without_xml {} {
+ global gdb_prompt srcdir
+
+ # In this case, we don't need to set GDB's datadir because
+ # we want GDB to display only numbers, not names. So, let's
+ # begin with the tests.
+
+ # The first test is to see if GDB displays a warning when we
+ # try to catch syscalls without the XML support.
+ test_catch_syscall_fail_noxml
+
+ # Now, let's test if we can catch syscalls without XML support.
+ # We should succeed, but GDB is not supposed to print syscall names.
+ if [runto_main] then { test_catch_syscall_without_args_noxml }
+
+ # The only valid argument "catch syscall" should accept is the
+ # syscall number, and not the name (since it can't translate a
+ # name to a number).
+ #
+ # It's worth mentioning that we only try to catch the syscall
+ # close(). This is because the syscall number is an arch-dependent
+ # information, so we can't assume that we know every syscall number
+ # in this system. Therefore, we have decided to use a "long-estabilished"
+ # system call, and close() just sounded the right choice :-).
+ if [runto_main] then { test_catch_syscall_with_args_noxml }
+
+ # Now, we'll try to provide a syscall name (valid or not) to the command,
+ # and expect it to fail.
+ if [runto_main] then { test_catch_syscall_with_wrong_args_noxml }
+}
+
+# Start with a fresh gdb
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+
+# Execute the tests, using XML support
+do_syscall_tests
+
+# Restart gdb
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+
+# Execute the tests, without XML support. In this case, GDB will
+# only display syscall numbers, and not syscall names.
+do_syscall_tests_without_xml
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH 4/4] catch syscall -- try 3 -- Build system, documentation and testcase
2008-11-18 20:44 [PATCH 4/4] catch syscall -- try 3 -- Build system, documentation and testcase Sérgio Durigan Júnior
@ 2008-11-19 0:44 ` Eli Zaretskii
2008-11-19 12:49 ` Sérgio Durigan Júnior
0 siblings, 1 reply; 6+ messages in thread
From: Eli Zaretskii @ 2008-11-19 0:44 UTC (permalink / raw)
To: Sérgio Durigan Júnior; +Cc: gdb-patches
> From: =?ISO-8859-1?Q?S=E9rgio?= Durigan =?ISO-8859-1?Q?J=FAnior?= <sergiodj@linux.vnet.ibm.com>
> Date: Tue, 18 Nov 2008 03:45:34 -0200
>
> +if @var{GDBN} does not fully support your system's list of system
^^^^^^^^^^
@value{GDBN}
> +(gdb) catch syscall
> +Catchpoint 1 (syscall)
That's a strange wording. Wouldn't it be better to say
Catchpoint 1 (any syscall)
?
Also, please use (@value{GDBP}) (P, not N) instead of a literal (gdb),
when you show a prompt.
> +Catchpoint 1 (calling syscall 'close'), 0xffffe424 in __kernel_vsyscall ()
I'd prefer
Catchpoint 1 (call to syscall 'close')
> +(gdb) catch syscall chroot
> +Catchpoint 1 (syscalls 'chroot')
"syscalls 'chroot'" (in plural) or "syscall 'chroot'" (single)?
> +(gdb) catch syscall 252
> +Catchpoint 1 (syscalls 'exit_group')
The translation to a mnemonic name will only happen if the XML file
does know about the syscall, right? What if it doesn't?
Otherwise, the doco patch is approved.
Thanks.
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH 4/4] catch syscall -- try 3 -- Build system, documentation and testcase
2008-11-19 0:44 ` Eli Zaretskii
@ 2008-11-19 12:49 ` Sérgio Durigan Júnior
2008-11-19 14:06 ` Eli Zaretskii
0 siblings, 1 reply; 6+ messages in thread
From: Sérgio Durigan Júnior @ 2008-11-19 12:49 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: gdb-patches
Hi Eli,
On Tue, 2008-11-18 at 22:02 +0200, Eli Zaretskii wrote:
> > From: =?ISO-8859-1?Q?S=E9rgio?= Durigan =?ISO-8859-1?Q?J=FAnior?= <sergiodj@linux.vnet.ibm.com>
> > Date: Tue, 18 Nov 2008 03:45:34 -0200
> >
> > +if @var{GDBN} does not fully support your system's list of system
> ^^^^^^^^^^
> @value{GDBN}
Sorry, I'll have that fixed.
>
> > +(gdb) catch syscall
> > +Catchpoint 1 (syscall)
>
> That's a strange wording. Wouldn't it be better to say
>
> Catchpoint 1 (any syscall)
>
> ?
Yeah, I think you're right.
> Also, please use (@value{GDBP}) (P, not N) instead of a literal (gdb),
> when you show a prompt.
OK.
> > +Catchpoint 1 (calling syscall 'close'), 0xffffe424 in __kernel_vsyscall ()
>
> I'd prefer
>
> Catchpoint 1 (call to syscall 'close')
Right, but can I ask you why? :-)
> > +(gdb) catch syscall chroot
> > +Catchpoint 1 (syscalls 'chroot')
>
> "syscalls 'chroot'" (in plural) or "syscall 'chroot'" (single)?
Yes, it's single. I'll fix. :-)
> > +(gdb) catch syscall 252
> > +Catchpoint 1 (syscalls 'exit_group')
>
> The translation to a mnemonic name will only happen if the XML file
> does know about the syscall, right? What if it doesn't?
You mean that I should mention what would happen in this case? I think
that's already mentioned, am I wrong?
> Otherwise, the doco patch is approved.
Thank you very much.
--
Sérgio Durigan Júnior
Linux on Power Toolchain - Software Engineer
Linux Technology Center - LTC
IBM Brazil
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH 4/4] catch syscall -- try 3 -- Build system, documentation and testcase
2008-11-19 12:49 ` Sérgio Durigan Júnior
@ 2008-11-19 14:06 ` Eli Zaretskii
2008-11-19 14:47 ` Sérgio Durigan Júnior
0 siblings, 1 reply; 6+ messages in thread
From: Eli Zaretskii @ 2008-11-19 14:06 UTC (permalink / raw)
To: Sérgio Durigan Júnior; +Cc: gdb-patches
> From: =?ISO-8859-1?Q?S=E9rgio?= Durigan =?ISO-8859-1?Q?J=FAnior?= <sergiodj@linux.vnet.ibm.com>
> Cc: gdb-patches@sourceware.org
> Date: Tue, 18 Nov 2008 19:43:15 -0200
>
> > > +Catchpoint 1 (calling syscall 'close'), 0xffffe424 in __kernel_vsyscall ()
> >
> > I'd prefer
> >
> > Catchpoint 1 (call to syscall 'close')
>
> Right, but can I ask you why? :-)
Because "call to" goes better with "return from". "calling" would go
with "returning".
> > > +(gdb) catch syscall 252
> > > +Catchpoint 1 (syscalls 'exit_group')
> >
> > The translation to a mnemonic name will only happen if the XML file
> > does know about the syscall, right? What if it doesn't?
>
> You mean that I should mention what would happen in this case? I think
> that's already mentioned, am I wrong?
You did, but since the text says that 252 is for the case of unknown
mnemonics, it would be better if the example reflected that case as
well, don't you think?
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 4/4] catch syscall -- try 3 -- Build system, documentation and testcase
2008-11-19 14:06 ` Eli Zaretskii
@ 2008-11-19 14:47 ` Sérgio Durigan Júnior
2008-11-19 19:23 ` Eli Zaretskii
0 siblings, 1 reply; 6+ messages in thread
From: Sérgio Durigan Júnior @ 2008-11-19 14:47 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 426 bytes --]
Hi Eli,
On Wed, 2008-11-19 at 00:37 +0200, Eli Zaretskii wrote:
> You did, but since the text says that 252 is for the case of unknown
> mnemonics, it would be better if the example reflected that case as
> well, don't you think?
Right. Here's the new version of the patch. Please take a look :-).
Regards,
--
Sérgio Durigan Júnior
Linux on Power Toolchain - Software Engineer
Linux Technology Center - LTC
IBM Brazil
[-- Attachment #2: catch-syscall-build-doc-testcase.patch --]
[-- Type: text/x-patch, Size: 28841 bytes --]
diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index 5432c88..24be153 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -172,6 +172,9 @@ LIBICONV = @LIBICONV@
TARGET_SYSTEM_ROOT = @TARGET_SYSTEM_ROOT@
TARGET_SYSTEM_ROOT_DEFINE = @TARGET_SYSTEM_ROOT_DEFINE@
+# Did the user give us a --with-gdb-datadir option?
+GDB_DATADIR_PATH = @GDB_DATADIR_PATH@
+
# Helper code from gnulib.
LIBGNU = gnulib/libgnu.a
INCGNU = -I$(srcdir)/gnulib -Ignulib
@@ -457,6 +460,7 @@ TARGET_OBS = @TARGET_OBS@
# All target-dependent objects files that require 64-bit CORE_ADDR
# (used with --enable-targets=all --enable-64-bit-bfd).
ALL_64_TARGET_OBS = \
+ linux-tdep.o \
alphabsd-tdep.o alphafbsd-tdep.o alpha-linux-tdep.o alpha-mdebug-tdep.o \
alphanbsd-tdep.o alphaobsd-tdep.o alpha-osf1-tdep.o alpha-tdep.o \
amd64fbsd-tdep.o amd64-linux-tdep.o amd64nbsd-tdep.o amd64obsd-tdep.o \
@@ -468,6 +472,7 @@ ALL_64_TARGET_OBS = \
# All other target-dependent objects files (used with --enable-targets=all).
ALL_TARGET_OBS = \
+ linux-tdep.o \
armbsd-tdep.o arm-linux-tdep.o armnbsd-tdep.o armobsd-tdep.o \
arm-tdep.o arm-wince-tdep.o \
avr-tdep.o \
@@ -657,6 +662,8 @@ SFILES = ada-exp.y ada-lang.c ada-typeprint.c ada-valprint.c ada-tasks.c \
valarith.c valops.c valprint.c value.c varobj.c vec.c \
wrapper.c \
xml-tdesc.c xml-support.c \
+ linux-tdep.c \
+ xml-syscall.c \
inferior.c
LINTFILES = $(SFILES) $(YYFILES) $(CONFIG_SRCS) init.c
@@ -667,7 +674,7 @@ LINTFILES = $(SFILES) $(YYFILES) $(CONFIG_SRCS) init.c
# wrong if TAGS has files twice). Because this is tricky to get
# right, it is probably easiest just to list .h files here directly.
-HFILES_NO_SRCDIR = osf-share/cma_debug_client.h \
+HFILES_NO_SRCDIR = osf-share/cma_debug_client.h linux-tdep.h \
osf-share/HP800/cma_thread_io.h osf-share/cma_sequence.h \
osf-share/cma_mutex.h osf-share/cma_semaphore_defs.h \
osf-share/cma_list.h osf-share/cma_handle.h osf-share/cma_stack.h \
@@ -727,7 +734,7 @@ config/sparc/nm-sol2.h config/nm-linux.h config/mips/nm-irix5.h \
config/rs6000/nm-rs6000.h top.h bsd-kvm.h gdb-stabs.h reggroups.h \
annotate.h sim-regno.h dictionary.h dfp.h main.h frame-unwind.h \
remote-fileio.h i386-linux-tdep.h vax-tdep.h objc-lang.h \
-sentinel-frame.h bcache.h symfile.h
+sentinel-frame.h bcache.h symfile.h xml-syscall.h
# Header files that already have srcdir in them, or which are in objdir.
@@ -806,10 +813,16 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \
trad-frame.o \
tramp-frame.o \
solib.o solib-null.o \
- prologue-value.o memory-map.o xml-support.o \
+ prologue-value.o memory-map.o xml-support.o xml-syscall.o \
target-descriptions.o target-memory.o xml-tdesc.o xml-builtin.o \
inferior.o
+# Definitions for the syscall's XML files and dir
+XML_SYSCALLS_DIR = syscalls/
+XML_SYSCALLS_FILES = gdb-syscalls.dtd \
+ ppc-linux.xml ppc64-linux.xml \
+ i386-linux.xml amd64-linux.xml
+
TSOBS = inflow.o
SUBDIRS = @subdirs@
@@ -843,11 +856,38 @@ generated_files = config.h observer.h observer.inc ada-lex.c \
$(COMPILE) $<
$(POSTCOMPILE)
-all: gdb$(EXEEXT) $(CONFIG_ALL)
+all: gdb$(EXEEXT) $(CONFIG_ALL) xml-syscall-copy
@$(MAKE) $(FLAGS_TO_PASS) DO=all "DODIRS=`echo $(SUBDIRS) | sed 's/testsuite//'`" subdir_do
.PHONY: all-tui
all-tui: $(TUI)$(EXEEXT)
+xml-syscall-copy:
+ if [ "`cd $(srcdir) && pwd`" != "`pwd`" ] ; then \
+ mkdir -p ./$(XML_SYSCALLS_DIR) ; \
+ list='$(XML_SYSCALLS_FILES)' ; \
+ for file in $$list ; do \
+ f=$(srcdir)/$(XML_SYSCALLS_DIR)/$$file ; \
+ if test -f $$f ; then \
+ $(INSTALL_DATA) $$f \
+ ./$(XML_SYSCALLS_DIR) ; \
+ fi ; \
+ done ; \
+ fi ;
+
+# This target is responsible for properly installing the syscalls'
+# XML files in the system.
+xml-syscall-install:
+ $(SHELL) $(srcdir)/../mkinstalldirs \
+ $(DESTDIR)$(GDB_DATADIR_PATH)/$(XML_SYSCALLS_DIR) ; \
+ list='$(XML_SYSCALLS_FILES)' ; \
+ for file in $$list ; do \
+ f=$(srcdir)/$(XML_SYSCALLS_DIR)/$$file ; \
+ if test -f $$f ; then \
+ $(INSTALL_DATA) $$f \
+ $(DESTDIR)$(GDB_DATADIR_PATH)/$(XML_SYSCALLS_DIR) ; \
+ fi ; \
+ done ;
+
installcheck:
# The check target can not use subdir_do, because subdir_do does not
@@ -901,8 +941,11 @@ gdb.z:gdb.1
# source file and doesn't care about rebuilding or just wants to save the
# time it takes for make to check that all is up to date.
# install-only is intended to address that need.
-install: all install-only
-install-only: $(CONFIG_INSTALL)
+install: all install-only
+
+# The "install-only" target also installs the syscalls' XML files in
+# the system.
+install-only: $(CONFIG_INSTALL) xml-syscall-install
transformed_name=`t='$(program_transform_name)'; \
echo gdb | sed -e "$$t"` ; \
if test "x$$transformed_name" = x; then \
@@ -1258,6 +1301,7 @@ force_update:
MAKEOVERRIDES=
ALLDEPFILES = \
+ linux-tdep.c \
aix-thread.c \
alpha-nat.c alphabsd-nat.c alpha-linux-nat.c \
alpha-tdep.c alpha-mdebug-tdep.c \
diff --git a/gdb/configure.ac b/gdb/configure.ac
index 054d5c2..77e2f6c 100644
--- a/gdb/configure.ac
+++ b/gdb/configure.ac
@@ -118,6 +118,36 @@ case ${debugdir} in
;;
esac
+# GDB's datadir relocation
+
+gdbdatadir=${datadir}/gdb
+
+AC_ARG_WITH([gdb-datadir],
+ [AS_HELP_STRING([--with-gdb-datadir],
+ [look for global separate data files in this path [DATADIR/gdb]])], [gdbdatadir="${withval}"])
+
+AC_DEFINE_DIR(GDB_DATADIR, gdbdatadir,
+ [Global directory for GDB data files. ])
+
+if test "x$exec_prefix" = xNONE || test "x$exec_prefix" = 'x${prefix}'; then
+ if test "x$prefix" = xNONE; then
+ test_prefix=/usr/local
+ else
+ test_prefix=$prefix
+ fi
+else
+ test_prefix=$exec_prefix
+fi
+
+case ${gdbdatadir} in
+ "${test_prefix}"|"${test_prefix}/"*|\
+ '${exec_prefix}'|'${exec_prefix}/'*)
+ AC_DEFINE(GDB_DATADIR_RELOCATABLE, 1, [Define if GDB datadir should be relocated when GDB is moved.])
+ ;;
+esac
+GDB_DATADIR_PATH=${gdbdatadir}
+AC_SUBST(GDB_DATADIR_PATH)
+
AC_CONFIG_SUBDIRS(doc testsuite)
# Check whether to support alternative target configurations
diff --git a/gdb/configure.tgt b/gdb/configure.tgt
index 95556f8..cea6d88 100644
--- a/gdb/configure.tgt
+++ b/gdb/configure.tgt
@@ -36,7 +36,7 @@ alpha*-*-osf*)
alpha*-*-linux*)
# Target: Little-endian Alpha running Linux
gdb_target_obs="alpha-tdep.o alpha-mdebug-tdep.o alpha-linux-tdep.o \
- solib.o solib-svr4.o"
+ solib.o solib-svr4.o linux-tdep.o"
;;
alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu)
# Target: FreeBSD/alpha
@@ -63,7 +63,7 @@ alpha*-*-*)
am33_2.0*-*-linux*)
# Target: Matsushita mn10300 (AM33) running Linux
gdb_target_obs="mn10300-tdep.o mn10300-linux-tdep.o corelow.o \
- solib.o solib-svr4.o"
+ solib.o solib-svr4.o linux-tdep.o"
;;
arm*-wince-pe | arm*-*-mingw32ce*)
@@ -75,7 +75,8 @@ arm*-wince-pe | arm*-*-mingw32ce*)
arm*-*-linux*)
# Target: ARM based machine running GNU/Linux
gdb_target_obs="arm-tdep.o arm-linux-tdep.o glibc-tdep.o \
- solib.o solib-svr4.o symfile-mem.o corelow.o"
+ solib.o solib-svr4.o symfile-mem.o corelow.o \
+ linux-tdep.o"
build_gdbserver=yes
;;
arm*-*-netbsd* | arm*-*-knetbsd*-gnu)
@@ -128,7 +129,7 @@ hppa*-*-hpux*)
hppa*-*-linux*)
# Target: HP PA-RISC running Linux
gdb_target_obs="hppa-tdep.o hppa-linux-tdep.o glibc-tdep.o \
- solib.o solib-svr4.o symfile-mem.o"
+ solib.o solib-svr4.o symfile-mem.o linux-tdep.o"
;;
hppa*-*-netbsd*)
# Target: NetBSD/hppa
@@ -185,7 +186,7 @@ i[34567]86-*-solaris*)
i[34567]86-*-linux*)
# Target: Intel 386 running GNU/Linux
gdb_target_obs="i386-tdep.o i386-linux-tdep.o glibc-tdep.o i387-tdep.o \
- solib.o solib-svr4.o symfile-mem.o corelow.o"
+ solib.o solib-svr4.o symfile-mem.o corelow.o linux-tdep.o"
build_gdbserver=yes
;;
i[34567]86-*-gnu*)
@@ -213,7 +214,7 @@ i[34567]86-*-*)
ia64-*-linux*)
# Target: Intel IA-64 running GNU/Linux
gdb_target_obs="ia64-tdep.o ia64-linux-tdep.o \
- solib.o solib-svr4.o symfile-mem.o"
+ solib.o solib-svr4.o symfile-mem.o linux-tdep.o"
build_gdbserver=yes
;;
ia64*-*-*)
@@ -237,7 +238,8 @@ m32c-*-*)
m32r*-*-linux*)
# Target: Renesas M32R running GNU/Linux
gdb_target_obs="m32r-tdep.o m32r-linux-tdep.o remote-m32r-sdi.o \
- glibc-tdep.o solib.o solib-svr4.o symfile-mem.o"
+ glibc-tdep.o solib.o solib-svr4.o symfile-mem.o \
+ linux-tdep.o"
gdb_sim=../sim/m32r/libsim.a
build_gdbserver=yes
;;
@@ -262,7 +264,7 @@ fido-*-elf*)
m68*-*-linux*)
# Target: Motorola m68k with a.out and ELF
gdb_target_obs="m68k-tdep.o m68klinux-tdep.o solib.o solib-svr4.o \
- glibc-tdep.o symfile-mem.o"
+ glibc-tdep.o symfile-mem.o linux-tdep.o"
build_gdbserver=yes
;;
m68*-*-netbsd* | m68*-*-knetbsd*-gnu)
@@ -298,7 +300,8 @@ mips*-sgi-irix6*)
mips*-*-linux*)
# Target: Linux/MIPS
gdb_target_obs="mips-tdep.o mips-linux-tdep.o glibc-tdep.o \
- corelow.o solib.o solib-svr4.o symfile-mem.o"
+ corelow.o solib.o solib-svr4.o symfile-mem.o \
+ linux-tdep.o"
gdb_sim=../sim/mips/libsim.a
build_gdbserver=yes
;;
@@ -349,7 +352,8 @@ powerpc-*-aix* | rs6000-*-*)
powerpc-*-linux* | powerpc64-*-linux*)
# Target: PowerPC running Linux
gdb_target_obs="rs6000-tdep.o ppc-linux-tdep.o ppc-sysv-tdep.o \
- solib.o solib-svr4.o corelow.o symfile-mem.o"
+ solib.o solib-svr4.o corelow.o symfile-mem.o \
+ linux-tdep.o"
gdb_sim=../sim/ppc/libsim.a
build_gdbserver=yes
;;
@@ -376,7 +380,8 @@ score-*-*)
sh*-*-linux*)
# Target: GNU/Linux Super-H
gdb_target_obs="sh-tdep.o sh64-tdep.o sh-linux-tdep.o monitor.o \
- dsrec.o solib.o solib-svr4.o symfile-mem.o glibc-tdep.o"
+ dsrec.o solib.o solib-svr4.o symfile-mem.o glibc-tdep.o \
+ linux-tdep.o"
gdb_sim=../sim/sh/libsim.a
build_gdbserver=yes
;;
@@ -404,13 +409,14 @@ sh*)
sparc-*-linux*)
# Target: GNU/Linux SPARC
gdb_target_obs="sparc-tdep.o sparc-sol2-tdep.o sol2-tdep.o \
- sparc-linux-tdep.o solib.o solib-svr4.o symfile-mem.o"
+ sparc-linux-tdep.o solib.o solib-svr4.o symfile-mem.o \
+ linux-tdep.o"
;;
sparc64-*-linux*)
# Target: GNU/Linux UltraSPARC
gdb_target_obs="sparc64-tdep.o sparc64-sol2-tdep.o sol2-tdep.o \
sparc64-linux-tdep.o sparc-tdep.o sparc-sol2-tdep.o \
- sparc-linux-tdep.o solib.o solib-svr4.o"
+ sparc-linux-tdep.o solib.o solib-svr4.o linux-tdep.o"
build_gdbserver=yes
;;
sparc*-*-freebsd* | sparc*-*-kfreebsd*-gnu)
@@ -508,7 +514,8 @@ x86_64-*-linux*)
# Target: GNU/Linux x86-64
gdb_target_obs="amd64-tdep.o amd64-linux-tdep.o i386-tdep.o \
i387-tdep.o i386-linux-tdep.o glibc-tdep.o \
- solib.o solib-svr4.o corelow.o symfile-mem.o"
+ solib.o solib-svr4.o corelow.o symfile-mem.o \
+ linux-tdep.o"
build_gdbserver=yes
;;
x86_64-*-freebsd* | x86_64-*-kfreebsd*-gnu)
@@ -531,7 +538,8 @@ x86_64-*-openbsd*)
xtensa*-*-linux*) gdb_target=linux
# Target: GNU/Linux Xtensa
gdb_target_obs="xtensa-tdep.o xtensa-config.o xtensa-linux-tdep.o \
- solib.o solib-svr4.o corelow.o symfile-mem.o"
+ solib.o solib-svr4.o corelow.o symfile-mem.o \
+ linux-tdep.o"
build_gdbserver=yes
;;
xtensa*)
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index aef5308..ebcddd9 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -3635,6 +3635,98 @@ A failed Ada assertion.
A call to @code{exec}. This is currently only available for HP-UX
and @sc{gnu}/Linux.
+@item syscall
+@itemx syscall @r{[}@var{name} @r{|} @var{number}@r{]} @r{...}
+@cindex break on a system call.
+A call to or return from a @code{syscall}. If no argument is specified,
+then it catches a call to or return from any system call.
+
+@var{name} can be any valid system call name in the system. You can
+use the @value{GDBN} command-line completion facilities to list the
+available choices. @xref{Completion,, Command Completion}, for
+details on how to do this.
+
+You may also specify the system call numerically. This may be useful
+if @value{GDBN} does not fully support your system's list of system
+calls.
+
+The example below illustrates how this command works if you don't provide
+arguments to it:
+
+@smallexample
+(@value{GDBP}) catch syscall
+Catchpoint 1 (syscall)
+(@value{GDBP}) r
+Starting program: /tmp/catch-syscall
+
+Catchpoint 1 (call to syscall 'close'), 0xffffe424 in __kernel_vsyscall ()
+(@value{GDBP}) c
+Continuing.
+
+Catchpoint 1 (returned from syscall 'close'), 0xffffe424 in __kernel_vsyscall ()
+(@value{GDBP})
+@end smallexample
+
+Here is an example of catching a system call by name:
+
+@smallexample
+(@value{GDBP}) catch syscall chroot
+Catchpoint 1 (syscall(s) 'chroot')
+(@value{GDBP}) r
+Starting program: /tmp/catch-syscall
+
+Catchpoint 1 (call to syscall 'chroot'), 0xffffe424 in __kernel_vsyscall ()
+(@value{GDBP}) c
+Continuing.
+
+Catchpoint 1 (returned from syscall 'chroot'), 0xffffe424 in __kernel_vsyscall ()
+(@value{GDBP})
+@end smallexample
+
+And last but not least, an example of specifying a system call
+numerically:
+
+@smallexample
+(@value{GDBP}) catch syscall 252
+Catchpoint 1 (syscall(s) 'exit_group')
+(@value{GDBP}) r
+Starting program: /tmp/catch-syscall
+
+Catchpoint 1 (call to syscall 'exit_group'), 0xffffe424 in __kernel_vsyscall ()
+(@value{GDBP}) c
+Continuing.
+
+Program exited normally.
+(@value{GDBP})
+@end smallexample
+
+If you configure @value{GDBN} using the @samp{--without-expat} option,
+it will not be able to display syscall names. Also, if your
+architecture does not have an XML file describing its system calls,
+you will not be able to see the syscall names. In either case, you
+will see a warning like this:
+
+@smallexample
+(@value{GDBP}) catch syscall
+warning: Could not open "syscalls/i386-linux.xml"
+warning: Could not load the syscall XML file 'syscalls/i386-linux.xml'.
+GDB will not be able to display syscall names.
+Catchpoint 1 (syscall)
+(@value{GDBP})
+@end smallexample
+
+Of course, the file name will change depending on your architecture and system.
+
+Still using the example above, you can also try to catch a syscall by its
+number. In this case, you would see something like:
+
+@smallexample
+(@value{GDBP}) catch syscall 252
+Catchpoint 1 (syscall(s) 252)
+@end smallexample
+
+Again, in this case @value{GDBN} would not be able to display syscall's names.
+
@item fork
A call to @code{fork}. This is currently only available for HP-UX
and @sc{gnu}/Linux.
diff --git a/gdb/testsuite/gdb.base/Makefile.in b/gdb/testsuite/gdb.base/Makefile.in
index 9f382db..12db521 100644
--- a/gdb/testsuite/gdb.base/Makefile.in
+++ b/gdb/testsuite/gdb.base/Makefile.in
@@ -12,7 +12,7 @@ EXECUTABLES = all-types annota1 bitfields break \
scope section_command setshow setvar shmain sigall signals \
solib solib_sl so-impl-ld so-indr-cl \
step-line step-test structs structs2 \
- twice-tmp varargs vforked-prog watchpoint whatis
+ twice-tmp varargs vforked-prog watchpoint whatis catch-syscall
MISCELLANEOUS = coremmap.data ../foobar.baz \
shr1.sl shr2.sl solib_sl.sl solib1.sl solib2.sl
diff --git a/gdb/testsuite/gdb.base/catch-syscall.c b/gdb/testsuite/gdb.base/catch-syscall.c
new file mode 100644
index 0000000..64850de
--- /dev/null
+++ b/gdb/testsuite/gdb.base/catch-syscall.c
@@ -0,0 +1,25 @@
+/* This file is used to test the 'catch syscall' feature on GDB.
+
+ Please, if you are going to edit this file DO NOT change the syscalls
+ being called (nor the order of them). If you really must do this, then
+ take a look at catch-syscall.exp and modify there too.
+
+ Written by Sergio Durigan Junior <sergiodj@linux.vnet.ibm.com>
+ September, 2008 */
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+int
+main (void)
+{
+ /* A close() with a wrong argument. We are only
+ interested in the syscall. */
+ close (-1);
+
+ chroot (".");
+
+ /* The last syscall. Do not change this. */
+ _exit (0);
+}
diff --git a/gdb/testsuite/gdb.base/catch-syscall.exp b/gdb/testsuite/gdb.base/catch-syscall.exp
new file mode 100644
index 0000000..a9f6937
--- /dev/null
+++ b/gdb/testsuite/gdb.base/catch-syscall.exp
@@ -0,0 +1,386 @@
+# Copyright 1997, 1999, 2007, 2008 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/>.
+
+
+# This program tests the 'catch syscall' functionality.
+#
+# It was written by Sergio Durigan Junior <sergiodj@linux.vnet.ibm.com>
+# on September/2008.
+
+if { [is_remote target] || ![isnative] } then {
+ continue
+}
+
+set prms_id 0
+set bug_id 0
+
+global srcfile
+set testfile "catch-syscall"
+set srcfile ${testfile}.c
+set binfile ${objdir}/${subdir}/${testfile}
+
+# All (but the last) syscalls from the example code
+# They are ordered according to the file, so do not change this.
+set all_syscalls { "close" "chroot" }
+# The last syscall (exit()) does not return, so
+# we cannot expect the catchpoint to be triggered
+# twice. It is a special case.
+set last_syscall "exit_group"
+
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
+ untested catch-syscall.exp
+ return -1
+}
+
+# Until "catch syscall" is implemented on other targets...
+if {![istarget "hppa*-hp-hpux*"] && ![istarget "*-linux*"]} then {
+ continue
+}
+
+# This shall be updated whenever 'catch syscall' is implemented
+# on some architecture.
+#if { ![istarget "x86_64-*-linux*"] && ![istarget "i\[34567\]86-*-linux*"]
+if { ![istarget "i\[34567\]86-*-linux*"]
+ && ![istarget "powerpc-*-linux*"] && ![istarget "powerpc64-*-linux*"] } {
+ continue
+}
+
+# Internal procedure used to check if, before any syscall is caught,
+# the command 'info breakpoints' correctly lists the catchpoints AND
+# says that nothing was caught yet.
+proc check_init_info_breakpoints {} {
+ global gdb_prompt
+
+ # Verifying that the catchpoint appears in the 'info breakpoints'
+ # command, but with "<any syscall>".
+ set thistest "catch syscall appears in 'info breakpoints'"
+ gdb_test "info breakpoints" ".*catchpoint.*keep y.*syscall \"<any syscall>\".*" $thistest
+}
+
+# This procedure checks if, after a syscall catchpoint is hit, the
+# command 'info breakpoints' correctly lists the syscall name.
+proc check_info_breakpoints { syscall } {
+ global gdb_prompt
+
+ set thistest "syscall $syscall appears in 'info breakpoints'"
+ gdb_test "info breakpoints" ".*catchpoint.*keep y.*syscall (.)?${syscall}(.)?.*" $thistest
+}
+
+# This procedure checks if there was a call to a syscall.
+proc check_call_to_syscall { syscall } {
+ global gdb_prompt
+
+ set thistest "program has called $syscall"
+ gdb_test "continue" "Catchpoint .*(call to syscall .?${syscall}.?).*" $thistest
+
+ # Checking if the syscall is reported to be caught in
+ # 'info breakpoints'.
+ check_info_breakpoints "$syscall"
+}
+
+# This procedure checks if the syscall returned.
+proc check_return_from_syscall { syscall } {
+ global gdb_prompt
+
+ set thistest "syscall $syscall has returned"
+ gdb_test "continue" "Catchpoint .*(returned from syscall (.)?${syscall}(.)?).*" $thistest
+
+ # Checking if the syscall is reported to be caught in
+ # 'info breakpoints'.
+ check_info_breakpoints "$syscall"
+}
+
+# Internal procedure that performs two 'continue' commands and checks if
+# a syscall call AND return occur.
+proc check_continue { syscall } {
+ global gdb_prompt
+
+ # Testing if the 'continue' stops at the
+ # specified syscall_name. If it does, then it should
+ # first print that the infeior has called the syscall,
+ # and after print that the syscall has returned.
+
+ # Testing if the inferiorr has called the syscall.
+ check_call_to_syscall $syscall
+ # And now, that the syscall has returned.
+ check_return_from_syscall $syscall
+}
+
+# Inserts a syscall catchpoint with an argument.
+proc insert_catch_syscall_with_arg { syscall } {
+ global gdb_prompt
+
+ # Trying to set the syscall
+ set thistest "catch syscall with arguments ($syscall)"
+ gdb_test "catch syscall $syscall" "Catchpoint .*(syscall\[(\]s\[)\] (.)?${syscall}(.)?).*" $thistest
+}
+
+proc check_for_program_end {} {
+ global gdb_prompt
+
+ # Deleting the catchpoints
+ delete_breakpoints
+
+ set thistest "successful program end"
+ gdb_test "continue" "Program exited normally.*" $thistest
+
+}
+
+proc test_catch_syscall_without_args {} {
+ global gdb_prompt all_syscalls last_syscall
+
+ # Trying to set the syscall
+ set thistest "setting catch syscall without arguments"
+ gdb_test "catch syscall" "Catchpoint .*(syscall).*" $thistest
+
+ check_init_info_breakpoints
+
+ # We have to check every syscall
+ foreach name $all_syscalls {
+ check_continue $name
+ }
+
+ # At last but not least, we check if the inferior
+ # has called the last (exit) syscall.
+ check_call_to_syscall $last_syscall
+
+ # Now let's see if the inferior correctly finishes.
+ check_for_program_end
+}
+
+proc test_catch_syscall_with_args {} {
+ global gdb_prompt
+ set syscall_name "close"
+
+ insert_catch_syscall_with_arg $syscall_name
+ check_init_info_breakpoints
+
+ # Can we continue until we catch the syscall?
+ check_continue $syscall_name
+
+ # Now let's see if the inferior correctly finishes.
+ check_for_program_end
+}
+
+proc test_catch_syscall_with_wrong_args {} {
+ global gdb_prompt
+ # mlock is not called from the source
+ set syscall_name "mlock"
+
+ insert_catch_syscall_with_arg $syscall_name
+ check_init_info_breakpoints
+
+ # Now, we must verify if the program stops with a continue.
+ # If it doesn't, everything is right (since we don't have
+ # a syscall named "mlock" in it). Otherwise, this is a failure.
+ set thistest "catch syscall with unused syscall ($syscall_name)"
+ gdb_test "continue" "Program exited normally.*" $thistest
+}
+
+proc test_catch_syscall_restarting_inferior {} {
+ global gdb_prompt
+ set syscall_name "chroot"
+
+ insert_catch_syscall_with_arg $syscall_name
+ check_init_info_breakpoints
+
+ # Let's first reach the call of the syscall.
+ check_call_to_syscall $syscall_name
+
+ # Now, restart the program
+ rerun_to_main
+
+ # And check for call/return
+ check_continue $syscall_name
+
+ # Can we finish?
+ check_for_program_end
+}
+
+proc do_syscall_tests {} {
+ global gdb_prompt srcdir
+
+ # First, we need to set GDB datadir.
+ send_gdb "maintenance set gdb_datadir $srcdir/..\n"
+ gdb_expect 10 {
+ -re "$gdb_prompt $" {
+ verbose "Setting GDB datadir to $srcdir/..." 2
+ }
+ timeout {
+ error "Couldn't set GDB datadir."
+ }
+ }
+
+ # Verify that the 'catch syscall' help is available
+ set thistest "help catch syscall"
+ gdb_test "help catch syscall" "Catch system calls.*" $thistest
+
+ # Try to set a catchpoint to a nonsense syscall
+ set thistest "catch syscall to a nonsense syscall is prohibited"
+ gdb_test "catch syscall nonsense_syscall" "Unknown syscall name .*" $thistest
+
+ # Testing the 'catch syscall' command without arguments.
+ # This test should catch any syscalls.
+ if [runto_main] then { test_catch_syscall_without_args }
+
+ # Testing the 'catch syscall' command with arguments.
+ # This test should only catch the specified syscall.
+ if [runto_main] then { test_catch_syscall_with_args }
+
+ # Testing the 'catch syscall' command with WRONG arguments.
+ # This test should not trigger any catchpoints.
+ if [runto_main] then { test_catch_syscall_with_wrong_args }
+
+ # Testing the 'catch' syscall command during a restart of
+ # the inferior.
+ if [runto_main] then { test_catch_syscall_restarting_inferior }
+}
+
+proc test_catch_syscall_fail_noxml {} {
+ global gdb_prompt
+
+ # Sanitizing.
+ delete_breakpoints
+
+ # Testing to see if we receive a warning when calling "catch syscall"
+ # without XML support.
+ set thistest "Catch syscall displays a warning when there is no XML support"
+ gdb_test "catch syscall" "warning: Could not open .*warning: Could not load the syscall XML file .*GDB will not be able to display syscall names.*Catchpoint .*(syscall).*" $thistest
+
+ # Since the catchpoint was set, we must check if it's present at
+ # "info breakpoints"
+ check_init_info_breakpoints
+
+ # Sanitizing.
+ delete_breakpoints
+}
+
+proc test_catch_syscall_without_args_noxml {} {
+ # We will need the syscall names even not using it
+ # because we need to know know many syscalls are in
+ # the example file.
+ global gdb_prompt all_syscalls last_syscall
+
+ delete_breakpoints
+
+ set thistest "Catch syscall without arguments and without XML support"
+ gdb_test "catch syscall" "Catchpoint .*(syscall).*"
+
+ # Now, we should be able to set a catchpoint,
+ # and GDB shall not display the warning anymore.
+ foreach name $all_syscalls {
+ # Unfortunately, we don't know the syscall number
+ # that will be caught because this information is
+ # arch-dependent. Thus, we try to catch anything
+ # similar to a number.
+ check_continue "\[0-9\]*"
+ }
+
+ # At last but not least, we check if the inferior
+ # has called the last (exit) syscall.
+ check_call_to_syscall "\[0-9\]*"
+
+ delete_breakpoints
+}
+
+proc test_catch_syscall_with_args_noxml {} {
+ global gdb_prompt
+
+ # The number of the "close" syscall. This is our
+ # options for a "long-estabilished" syscall in all
+ # Linux architectures, but unfortunately x86_64 and
+ # a few other platforms don't "follow the convention".
+ # Because of this, we need this ugly check :-(.
+ set close_number ""
+ if { [istarget "x86_64-*-linux*"] } {
+ set close_number "3"
+ } else {
+ set close_number "6"
+ }
+
+ delete_breakpoints
+
+ insert_catch_syscall_with_arg $close_number
+ check_init_info_breakpoints
+
+ check_continue $close_number
+
+ delete_breakpoints
+}
+
+proc test_catch_syscall_with_wrong_args_noxml {} {
+ global gdb_prompt
+
+ delete_breakpoints
+
+ # Even without XML support, GDB should not accept unknown
+ # syscall names for the catchpoint.
+ set thistest "Catch a nonsense syscall without XML support"
+ gdb_test "catch syscall nonsense_syscall" "Unknown syscall name .nonsense_syscall.*" $thistest
+
+ delete_breakpoints
+}
+
+proc do_syscall_tests_without_xml {} {
+ global gdb_prompt srcdir
+
+ # In this case, we don't need to set GDB's datadir because
+ # we want GDB to display only numbers, not names. So, let's
+ # begin with the tests.
+
+ # The first test is to see if GDB displays a warning when we
+ # try to catch syscalls without the XML support.
+ test_catch_syscall_fail_noxml
+
+ # Now, let's test if we can catch syscalls without XML support.
+ # We should succeed, but GDB is not supposed to print syscall names.
+ if [runto_main] then { test_catch_syscall_without_args_noxml }
+
+ # The only valid argument "catch syscall" should accept is the
+ # syscall number, and not the name (since it can't translate a
+ # name to a number).
+ #
+ # It's worth mentioning that we only try to catch the syscall
+ # close(). This is because the syscall number is an arch-dependent
+ # information, so we can't assume that we know every syscall number
+ # in this system. Therefore, we have decided to use a "long-estabilished"
+ # system call, and close() just sounded the right choice :-).
+ if [runto_main] then { test_catch_syscall_with_args_noxml }
+
+ # Now, we'll try to provide a syscall name (valid or not) to the command,
+ # and expect it to fail.
+ if [runto_main] then { test_catch_syscall_with_wrong_args_noxml }
+}
+
+# Start with a fresh gdb
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+
+# Execute the tests, using XML support
+do_syscall_tests
+
+# Restart gdb
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+
+# Execute the tests, without XML support. In this case, GDB will
+# only display syscall numbers, and not syscall names.
+do_syscall_tests_without_xml
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2008-11-19 4:20 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-11-18 20:44 [PATCH 4/4] catch syscall -- try 3 -- Build system, documentation and testcase Sérgio Durigan Júnior
2008-11-19 0:44 ` Eli Zaretskii
2008-11-19 12:49 ` Sérgio Durigan Júnior
2008-11-19 14:06 ` Eli Zaretskii
2008-11-19 14:47 ` Sérgio Durigan Júnior
2008-11-19 19:23 ` Eli Zaretskii
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox