From: "Marcin Kościelnicki" <koriakin@0x04.net>
To: palves@redhat.com, qiyaoltc@gmail.com
Cc: gdb-patches@sourceware.org, "Marcin Kościelnicki" <koriakin@0x04.net>
Subject: [PATCH v2 01/13] gdb/linux-record: Add testcases for a few syscalls.
Date: Thu, 22 Oct 2015 13:39:00 -0000 [thread overview]
Message-ID: <1445521166-14492-1-git-send-email-koriakin@0x04.net> (raw)
In-Reply-To: <5628E5D6.5020706@0x04.net>
gdb/testsuite/ChangeLog:
* gdb.reverse/linux-fstatat-reverse.c: New test.
* gdb.reverse/linux-fstatat-reverse.exp: New file.
* gdb.reverse/linux-getresuid-reverse.c: New test.
* gdb.reverse/linux-getresuid-reverse.exp: New file.
* gdb.reverse/linux-pipe-reverse.c: New test.
* gdb.reverse/linux-pipe-reverse.exp: New file.
* gdb.reverse/linux-readv-reverse.c: New test.
* gdb.reverse/linux-readv-reverse.exp: New file.
* gdb.reverse/linux-recvmsg-reverse.c: New test.
* gdb.reverse/linux-recvmsg-reverse.exp: New file.
* gdb.reverse/linux-time-reverse.c: New test.
* gdb.reverse/linux-time-reverse.exp: New file.
* gdb.reverse/linux-waitpid-reverse.c: New test.
* gdb.reverse/linux-waitpid-reverse.exp: New file.
---
gdb/testsuite/ChangeLog | 17 ++++
gdb/testsuite/gdb.reverse/linux-fstatat-reverse.c | 39 ++++++++++
.../gdb.reverse/linux-fstatat-reverse.exp | 63 +++++++++++++++
.../gdb.reverse/linux-getresuid-reverse.c | 38 +++++++++
.../gdb.reverse/linux-getresuid-reverse.exp | 70 +++++++++++++++++
gdb/testsuite/gdb.reverse/linux-pipe-reverse.c | 36 +++++++++
gdb/testsuite/gdb.reverse/linux-pipe-reverse.exp | 63 +++++++++++++++
gdb/testsuite/gdb.reverse/linux-readv-reverse.c | 46 +++++++++++
gdb/testsuite/gdb.reverse/linux-readv-reverse.exp | 66 ++++++++++++++++
gdb/testsuite/gdb.reverse/linux-recvmsg-reverse.c | 90 ++++++++++++++++++++++
.../gdb.reverse/linux-recvmsg-reverse.exp | 73 ++++++++++++++++++
gdb/testsuite/gdb.reverse/linux-time-reverse.c | 38 +++++++++
gdb/testsuite/gdb.reverse/linux-time-reverse.exp | 63 +++++++++++++++
gdb/testsuite/gdb.reverse/linux-waitpid-reverse.c | 41 ++++++++++
.../gdb.reverse/linux-waitpid-reverse.exp | 63 +++++++++++++++
15 files changed, 806 insertions(+)
create mode 100644 gdb/testsuite/gdb.reverse/linux-fstatat-reverse.c
create mode 100644 gdb/testsuite/gdb.reverse/linux-fstatat-reverse.exp
create mode 100644 gdb/testsuite/gdb.reverse/linux-getresuid-reverse.c
create mode 100644 gdb/testsuite/gdb.reverse/linux-getresuid-reverse.exp
create mode 100644 gdb/testsuite/gdb.reverse/linux-pipe-reverse.c
create mode 100644 gdb/testsuite/gdb.reverse/linux-pipe-reverse.exp
create mode 100644 gdb/testsuite/gdb.reverse/linux-readv-reverse.c
create mode 100644 gdb/testsuite/gdb.reverse/linux-readv-reverse.exp
create mode 100644 gdb/testsuite/gdb.reverse/linux-recvmsg-reverse.c
create mode 100644 gdb/testsuite/gdb.reverse/linux-recvmsg-reverse.exp
create mode 100644 gdb/testsuite/gdb.reverse/linux-time-reverse.c
create mode 100644 gdb/testsuite/gdb.reverse/linux-time-reverse.exp
create mode 100644 gdb/testsuite/gdb.reverse/linux-waitpid-reverse.c
create mode 100644 gdb/testsuite/gdb.reverse/linux-waitpid-reverse.exp
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 1313aa2..8e65781 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,20 @@
+2015-10-22 Marcin KoÅcielnicki <koriakin@0x04.net>
+
+ * gdb.reverse/linux-fstatat-reverse.c: New test.
+ * gdb.reverse/linux-fstatat-reverse.exp: New file.
+ * gdb.reverse/linux-getresuid-reverse.c: New test.
+ * gdb.reverse/linux-getresuid-reverse.exp: New file.
+ * gdb.reverse/linux-pipe-reverse.c: New test.
+ * gdb.reverse/linux-pipe-reverse.exp: New file.
+ * gdb.reverse/linux-readv-reverse.c: New test.
+ * gdb.reverse/linux-readv-reverse.exp: New file.
+ * gdb.reverse/linux-recvmsg-reverse.c: New test.
+ * gdb.reverse/linux-recvmsg-reverse.exp: New file.
+ * gdb.reverse/linux-time-reverse.c: New test.
+ * gdb.reverse/linux-time-reverse.exp: New file.
+ * gdb.reverse/linux-waitpid-reverse.c: New test.
+ * gdb.reverse/linux-waitpid-reverse.exp: New file.
+
2015-10-21 Simon Marchi <simon.marchi@polymtl.ca>
PR python/18073
diff --git a/gdb/testsuite/gdb.reverse/linux-fstatat-reverse.c b/gdb/testsuite/gdb.reverse/linux-fstatat-reverse.c
new file mode 100644
index 0000000..21091b5
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-fstatat-reverse.c
@@ -0,0 +1,39 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2008-2015 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/>. */
+
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+void marker1 ()
+{
+}
+
+void marker2 ()
+{
+}
+
+struct stat buf;
+
+int main() {
+ marker1();
+ int fd = open("/", O_PATH);
+ fstatat(fd, ".", &buf, 0);
+ marker2();
+ return 0;
+}
diff --git a/gdb/testsuite/gdb.reverse/linux-fstatat-reverse.exp b/gdb/testsuite/gdb.reverse/linux-fstatat-reverse.exp
new file mode 100644
index 0000000..23652e4
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-fstatat-reverse.exp
@@ -0,0 +1,63 @@
+# Copyright 2015 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 file is part of the gdb testsuite.
+
+#
+# This test tests linux fstatat syscall for reverse execution.
+#
+
+if ![supports_reverse] {
+ return
+}
+
+
+if ![istarget "*linux*"] then {
+ verbose "Skipping linux syscall reverse tests."
+ return
+}
+
+standard_testfile
+
+if { [prepare_for_testing $testfile.exp $testfile $srcfile] } {
+ return -1
+}
+
+runto main
+
+if [supports_process_record] {
+ # Activate process record/replay
+ gdb_test_no_output "record" "Turn on process record"
+}
+
+gdb_test "break marker1" \
+ "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+ "set breakpoint at marker1"
+
+gdb_test "break marker2" \
+ "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+ "set breakpoint at marker2"
+
+gdb_continue_to_breakpoint "marker1" ".*$srcfile:.*"
+
+gdb_continue_to_breakpoint "marker2" ".*$srcfile:.*"
+
+gdb_test "reverse-continue" ".*$srcfile:$decimal.*" "reverse to marker1"
+
+# If the variable was recorded properly on syscall, the old contents (0)
+# will be remembered. If not, new contents (mode of /) will be used,
+# and the test will fail.
+
+gdb_test "print buf.st_mode" ".* = 0" "check fstatat record"
diff --git a/gdb/testsuite/gdb.reverse/linux-getresuid-reverse.c b/gdb/testsuite/gdb.reverse/linux-getresuid-reverse.c
new file mode 100644
index 0000000..7aa2004
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-getresuid-reverse.c
@@ -0,0 +1,38 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2008-2015 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/>. */
+
+#define _GNU_SOURCE
+#include <unistd.h>
+
+void marker1 ()
+{
+}
+
+void marker2 ()
+{
+}
+
+uid_t ruid = -1, euid = -1, suid = -1;
+gid_t rgid = -1, egid = -1, sgid = -1;
+
+int main() {
+ marker1();
+ getresuid(&ruid, &euid, &suid);
+ getresgid(&rgid, &egid, &sgid);
+ marker2();
+ return 0;
+}
diff --git a/gdb/testsuite/gdb.reverse/linux-getresuid-reverse.exp b/gdb/testsuite/gdb.reverse/linux-getresuid-reverse.exp
new file mode 100644
index 0000000..5a45486
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-getresuid-reverse.exp
@@ -0,0 +1,70 @@
+# Copyright 2015 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 file is part of the gdb testsuite.
+
+#
+# This test tests linux getresuid/getresgid syscalls for reverse execution.
+#
+
+if ![supports_reverse] {
+ return
+}
+
+
+if ![istarget "*linux*"] then {
+ verbose "Skipping linux getresuid/getresgid reverse tests."
+ return
+}
+
+standard_testfile
+
+if { [prepare_for_testing $testfile.exp $testfile $srcfile] } {
+ return -1
+}
+
+runto main
+
+if [supports_process_record] {
+ # Activate process record/replay
+ gdb_test_no_output "record" "Turn on process record"
+}
+
+gdb_test "break marker1" \
+ "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+ "set breakpoint at marker1"
+
+gdb_test "break marker2" \
+ "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+ "set breakpoint at marker2"
+
+gdb_continue_to_breakpoint "marker1" ".*$srcfile:.*"
+
+gdb_continue_to_breakpoint "marker2" ".*$srcfile:.*"
+
+gdb_test "reverse-continue" ".*$srcfile:$decimal.*" "reverse to marker1"
+
+# If the variables were recorded properly on syscall, the old contents (-1)
+# will be remembered. If not, new contents (the actual uid/gid) will be used,
+# and the test will fail (we hope the test user doesn't actually have uid of
+# -1). Do it this way instead of printing uid/gid directly, since uid_t/gid_t
+# is likely to be unsigned.
+
+gdb_test "print ruid == (uid_t)-1" ".* = 1" "check ruid record"
+gdb_test "print euid == (uid_t)-1" ".* = 1" "check euid record"
+gdb_test "print suid == (uid_t)-1" ".* = 1" "check suid record"
+gdb_test "print rgid == (gid_t)-1" ".* = 1" "check rgid record"
+gdb_test "print egid == (gid_t)-1" ".* = 1" "check egid record"
+gdb_test "print sgid == (gid_t)-1" ".* = 1" "check sgid record"
diff --git a/gdb/testsuite/gdb.reverse/linux-pipe-reverse.c b/gdb/testsuite/gdb.reverse/linux-pipe-reverse.c
new file mode 100644
index 0000000..56aae3c
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-pipe-reverse.c
@@ -0,0 +1,36 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2008-2015 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/>. */
+
+#define _GNU_SOURCE
+#include <unistd.h>
+
+void marker1 ()
+{
+}
+
+void marker2 ()
+{
+}
+
+int fds[2] = { -1, -1 };
+
+int main() {
+ marker1();
+ pipe(fds);
+ marker2();
+ return 0;
+}
diff --git a/gdb/testsuite/gdb.reverse/linux-pipe-reverse.exp b/gdb/testsuite/gdb.reverse/linux-pipe-reverse.exp
new file mode 100644
index 0000000..5dfbbe7
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-pipe-reverse.exp
@@ -0,0 +1,63 @@
+# Copyright 2015 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 file is part of the gdb testsuite.
+
+#
+# This test tests linux pipe syscall for reverse execution.
+#
+
+if ![supports_reverse] {
+ return
+}
+
+
+if ![istarget "*linux*"] then {
+ verbose "Skipping linux syscall reverse tests."
+ return
+}
+
+standard_testfile
+
+if { [prepare_for_testing $testfile.exp $testfile $srcfile] } {
+ return -1
+}
+
+runto main
+
+if [supports_process_record] {
+ # Activate process record/replay
+ gdb_test_no_output "record" "Turn on process record"
+}
+
+gdb_test "break marker1" \
+ "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+ "set breakpoint at marker1"
+
+gdb_test "break marker2" \
+ "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+ "set breakpoint at marker2"
+
+gdb_continue_to_breakpoint "marker1" ".*$srcfile:.*"
+
+gdb_continue_to_breakpoint "marker2" ".*$srcfile:.*"
+
+gdb_test "reverse-continue" ".*$srcfile:$decimal.*" "reverse to marker1"
+
+# If the variables were recorded properly on syscall, the old contents (-1)
+# will be remembered. If not, new contents (the file fds from pipe) will be
+# used, and the test will fail.
+
+gdb_test "print fds" ".* = {-1, -1}" "check pipe record"
diff --git a/gdb/testsuite/gdb.reverse/linux-readv-reverse.c b/gdb/testsuite/gdb.reverse/linux-readv-reverse.c
new file mode 100644
index 0000000..f62c2a8
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-readv-reverse.c
@@ -0,0 +1,46 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2008-2015 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/>. */
+
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <sys/uio.h>
+
+void marker1 ()
+{
+}
+
+void marker2 ()
+{
+}
+
+int fds[2] = { -1, -1 };
+char buf[5];
+const struct iovec v[4] = {
+ { &buf[1], 1 },
+ { &buf[0], 1 },
+ { &buf[3], 1 },
+ { &buf[2], 1 },
+};
+
+int main() {
+ marker1();
+ pipe(fds);
+ write(fds[1], "UNIX", 4);
+ readv(fds[0], v, 4);
+ marker2();
+ return 0;
+}
diff --git a/gdb/testsuite/gdb.reverse/linux-readv-reverse.exp b/gdb/testsuite/gdb.reverse/linux-readv-reverse.exp
new file mode 100644
index 0000000..5701652
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-readv-reverse.exp
@@ -0,0 +1,66 @@
+# Copyright 2015 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 file is part of the gdb testsuite.
+
+#
+# This test tests linux pipe syscall for reverse execution.
+#
+
+if ![supports_reverse] {
+ return
+}
+
+
+if ![istarget "*linux*"] then {
+ verbose "Skipping linux syscall reverse tests."
+ return
+}
+
+standard_testfile
+
+if { [prepare_for_testing $testfile.exp $testfile $srcfile] } {
+ return -1
+}
+
+runto main
+
+if [supports_process_record] {
+ # Activate process record/replay
+ gdb_test_no_output "record" "Turn on process record"
+}
+
+gdb_test "break marker1" \
+ "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+ "set breakpoint at marker1"
+
+gdb_test "break marker2" \
+ "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+ "set breakpoint at marker2"
+
+gdb_continue_to_breakpoint "marker1" ".*$srcfile:.*"
+
+gdb_continue_to_breakpoint "marker2" ".*$srcfile:.*"
+
+gdb_test "reverse-continue" ".*$srcfile:$decimal.*" "reverse to marker1"
+
+# If the variables were recorded properly on syscall, the old contents ("")
+# will be remembered. If not, new contents ("NUXI") will be
+# used, and the test will fail.
+
+gdb_test "print (int)buf\[0]" ".* = 0" "check readv record"
+gdb_test "print (int)buf\[1]" ".* = 0" "check readv record"
+gdb_test "print (int)buf\[2]" ".* = 0" "check readv record"
+gdb_test "print (int)buf\[3]" ".* = 0" "check readv record"
diff --git a/gdb/testsuite/gdb.reverse/linux-recvmsg-reverse.c b/gdb/testsuite/gdb.reverse/linux-recvmsg-reverse.c
new file mode 100644
index 0000000..d9a9508
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-recvmsg-reverse.c
@@ -0,0 +1,90 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2008-2015 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/>. */
+
+#define _GNU_SOURCE
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <sys/un.h>
+#include <unistd.h>
+
+void marker1 ()
+{
+}
+
+void marker2 ()
+{
+}
+
+char wdata[] = "abcdef";
+
+struct iovec wv[1] = {
+ {wdata, 6},
+};
+
+char wc[CMSG_SPACE(sizeof (struct ucred)) + CMSG_SPACE(sizeof (int))];
+
+struct msghdr wmsg = {
+ 0, 0,
+ wv, 1,
+ wc, sizeof wc,
+ 0,
+};
+
+char rdata[5] = "xxxx";
+
+struct iovec rv[2] = {
+ {&rdata[2], 2},
+ {&rdata[0], 2},
+};
+
+char rc[CMSG_SPACE(sizeof (struct ucred)) + 7];
+
+struct msghdr rmsg = {
+ 0, 0,
+ rv, 2,
+ rc, sizeof rc,
+ 0,
+};
+
+int fds[2];
+
+int main() {
+ int itrue = 1;
+ /* prepare cmsg to send */
+ struct cmsghdr *cm1 = CMSG_FIRSTHDR(&wmsg);
+ cm1->cmsg_len = CMSG_LEN(sizeof (struct ucred));
+ cm1->cmsg_level = AF_UNIX;
+ cm1->cmsg_type = SCM_CREDENTIALS;
+ struct ucred *uc = (void *)CMSG_DATA(cm1);
+ uc->pid = getpid();
+ uc->uid = getuid();
+ uc->gid = getgid();
+ struct cmsghdr *cm2 = CMSG_NXTHDR(&wmsg, cm1);
+ cm2->cmsg_len = CMSG_LEN(sizeof (int));
+ cm2->cmsg_level = AF_UNIX;
+ cm2->cmsg_type = SCM_RIGHTS;
+ int *pfd = (void *)CMSG_DATA(cm2);
+ *pfd = 2;
+ /* do the syscalls */
+ marker1();
+ socketpair(AF_UNIX, SOCK_DGRAM, 0, fds);
+ setsockopt(fds[0], SOL_SOCKET, SO_PASSCRED, &itrue, sizeof itrue);
+ sendmsg(fds[1], &wmsg, 0);
+ recvmsg(fds[0], &rmsg, 0);
+ marker2();
+ return 0;
+}
diff --git a/gdb/testsuite/gdb.reverse/linux-recvmsg-reverse.exp b/gdb/testsuite/gdb.reverse/linux-recvmsg-reverse.exp
new file mode 100644
index 0000000..e4d2370
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-recvmsg-reverse.exp
@@ -0,0 +1,73 @@
+# Copyright 2015 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 file is part of the gdb testsuite.
+
+#
+# This test tests linux socketpair and recvmsg syscalls for reverse execution.
+#
+
+if ![supports_reverse] {
+ return
+}
+
+
+if ![istarget "*linux*"] then {
+ verbose "Skipping linux syscall reverse tests."
+ return
+}
+
+standard_testfile
+
+if { [prepare_for_testing $testfile.exp $testfile $srcfile] } {
+ return -1
+}
+
+runto main
+
+if [supports_process_record] {
+ # Activate process record/replay
+ gdb_test_no_output "record" "Turn on process record"
+}
+
+gdb_test "break marker1" \
+ "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+ "set breakpoint at marker1"
+
+gdb_test "break marker2" \
+ "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+ "set breakpoint at marker2"
+
+gdb_continue_to_breakpoint "marker1" ".*$srcfile:.*"
+
+gdb_continue_to_breakpoint "marker2" ".*$srcfile:.*"
+
+gdb_test "reverse-continue" ".*$srcfile:$decimal.*" "reverse to marker1"
+
+# If the variables were recorded properly on syscall, the old contents will
+# be remembered. If not, new contents will be used, and the test will fail.
+
+# rdata should be "xxxx", not "cdab"
+gdb_test "print rdata" ".* = \"xxxx\"" "check recvmsg record - rdata"
+
+# rmsg.msg_flags should be zeros, not MSG_TRUNC | MSG_CTRUNC
+gdb_test "print rmsg.msg_flags" ".* = 0" "check recvmsg record - rmsg"
+
+# rmsg.msg_controllen should be sizeof rc, not actual size of control data
+# (7 bytes less)
+gdb_test "print rmsg.msg_controllen - sizeof rc" ".* = 0" "check recvmsg record - rmsg"
+
+# rc should be zeros, not received cmsg
+gdb_test "print ((struct cmsghdr *)rc)->cmsg_len" ".* = 0" "check recvmsg record - cmsg"
diff --git a/gdb/testsuite/gdb.reverse/linux-time-reverse.c b/gdb/testsuite/gdb.reverse/linux-time-reverse.c
new file mode 100644
index 0000000..ab6cba8
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-time-reverse.c
@@ -0,0 +1,38 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2008-2015 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/>. */
+
+#define _GNU_SOURCE
+#include <time.h>
+#include <sys/syscall.h>
+#include <unistd.h>
+
+void marker1 ()
+{
+}
+
+void marker2 ()
+{
+}
+
+time_t time_global = -1;
+
+int main() {
+ marker1();
+ syscall(SYS_time, &time_global);
+ marker2();
+ return 0;
+}
diff --git a/gdb/testsuite/gdb.reverse/linux-time-reverse.exp b/gdb/testsuite/gdb.reverse/linux-time-reverse.exp
new file mode 100644
index 0000000..04ffe10
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-time-reverse.exp
@@ -0,0 +1,63 @@
+# Copyright 2015 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 file is part of the gdb testsuite.
+
+#
+# This test tests linux time syscall for reverse execution.
+#
+
+if ![supports_reverse] {
+ return
+}
+
+
+if ![istarget "*linux*"] then {
+ verbose "Skipping linux syscall reverse tests."
+ return
+}
+
+standard_testfile
+
+if { [prepare_for_testing $testfile.exp $testfile $srcfile] } {
+ return -1
+}
+
+runto main
+
+if [supports_process_record] {
+ # Activate process record/replay
+ gdb_test_no_output "record" "Turn on process record"
+}
+
+gdb_test "break marker1" \
+ "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+ "set breakpoint at marker1"
+
+gdb_test "break marker2" \
+ "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+ "set breakpoint at marker2"
+
+gdb_continue_to_breakpoint "marker1" ".*$srcfile:.*"
+
+gdb_continue_to_breakpoint "marker2" ".*$srcfile:.*"
+
+gdb_test "reverse-continue" ".*$srcfile:$decimal.*" "reverse to marker1"
+
+# If the variable was recorded properly on syscall, the old contents (-1)
+# will be remembered. If not, new contents (current time) will be used,
+# and the test will fail.
+
+gdb_test "print time_global" ".* = -1" "check time record"
diff --git a/gdb/testsuite/gdb.reverse/linux-waitpid-reverse.c b/gdb/testsuite/gdb.reverse/linux-waitpid-reverse.c
new file mode 100644
index 0000000..31aaef0
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-waitpid-reverse.c
@@ -0,0 +1,41 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2008-2015 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>
+#include <stdlib.h>
+#include <sys/wait.h>
+
+void marker1 ()
+{
+}
+
+void marker2 ()
+{
+}
+
+int status;
+
+int main() {
+ marker1();
+ if (!fork()) {
+ _exit(123);
+ } else {
+ waitpid(-1, &status, 0);
+ }
+ marker2();
+ return 0;
+}
diff --git a/gdb/testsuite/gdb.reverse/linux-waitpid-reverse.exp b/gdb/testsuite/gdb.reverse/linux-waitpid-reverse.exp
new file mode 100644
index 0000000..9aa85a5
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-waitpid-reverse.exp
@@ -0,0 +1,63 @@
+# Copyright 2015 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 file is part of the gdb testsuite.
+
+#
+# This test tests linux waitpid syscall for reverse execution.
+#
+
+if ![supports_reverse] {
+ return
+}
+
+
+if ![istarget "*linux*"] then {
+ verbose "Skipping linux syscall reverse tests."
+ return
+}
+
+standard_testfile
+
+if { [prepare_for_testing $testfile.exp $testfile $srcfile] } {
+ return -1
+}
+
+runto main
+
+if [supports_process_record] {
+ # Activate process record/replay
+ gdb_test_no_output "record" "Turn on process record"
+}
+
+gdb_test "break marker1" \
+ "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+ "set breakpoint at marker1"
+
+gdb_test "break marker2" \
+ "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+ "set breakpoint at marker2"
+
+gdb_continue_to_breakpoint "marker1" ".*$srcfile:.*"
+
+gdb_continue_to_breakpoint "marker2" ".*$srcfile:.*"
+
+gdb_test "reverse-continue" ".*$srcfile:$decimal.*" "reverse to marker1"
+
+# If the variable was recorded properly on syscall, the old contents (-1)
+# will be remembered. If not, new contents (status) will be # used, and
+# the test will fail.
+
+gdb_test "print status" ".* = -1" "check waitpid record"
--
2.6.1
next prev parent reply other threads:[~2015-10-22 13:39 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-10-17 21:41 gdb/linux-record fixes Marcin Kościelnicki
2015-10-17 21:41 ` [PATCH 06/11] gdb/linux-record: Support time, waitpid, pipe syscalls Marcin Kościelnicki
2015-10-17 21:41 ` [PATCH 03/11] gdb/linux-record: Fix sizes of sigaction and sigset_t Marcin Kościelnicki
2015-10-17 21:41 ` [PATCH 09/11] gdb/linux-record: Fix old_select syscall handling Marcin Kościelnicki
2015-10-17 21:41 ` [PATCH 08/11] gdb/linux-record: Fix newfstatat handling Marcin Kościelnicki
2015-10-17 21:41 ` [PATCH 11/11] gdb/linux-record: Fix struct sizes for x32 + aarch64 Marcin Kościelnicki
2015-10-17 21:41 ` [PATCH 04/11] gdb/linux-record: Fix readdir and getdents handling Marcin Kościelnicki
2015-10-17 21:41 ` [PATCH 01/11] gdb/linux-record: Remove size_siginfo Marcin Kościelnicki
2015-10-17 21:41 ` [PATCH 07/11] gdb/linux-record: Fix [sg]etgroups16 syscall Marcin Kościelnicki
2015-10-17 21:49 ` [PATCH 02/11] gdb/linux-record: Fix size_[ug]id values Marcin Kościelnicki
2015-10-17 21:49 ` [PATCH 05/11] gdb/linux-record: Fix msghdr parsing on 64-bit targets Marcin Kościelnicki
2015-10-17 21:49 ` [PATCH 10/11] gdb/linux-record: TASK_COMM_LEN is 16 on ppc too Marcin Kościelnicki
2015-10-19 15:37 ` gdb/linux-record fixes Pedro Alves
2015-10-19 17:18 ` Marcin Kościelnicki
2015-10-20 11:07 ` Pedro Alves
2015-10-20 11:16 ` Marcin Kościelnicki
2015-10-22 13:39 ` Marcin Kościelnicki
2015-10-22 13:39 ` Marcin Kościelnicki [this message]
2015-10-22 13:43 ` [PATCH v2 11/13] gdb/linux-record: TASK_COMM_LEN is 16 on ppc too Marcin Kościelnicki
2015-10-22 13:45 ` [PATCH v2 12/13] gdb/linux-record: Fix size_termios for x32, amd64, aarch64 Marcin Kościelnicki
2015-10-22 13:45 ` [PATCH v2 13/13] gdb/linux-record: Fix struct sizes for x32 Marcin Kościelnicki
2015-10-22 13:45 ` [PATCH v2 03/13] gdb/linux-record: Fix size_[ug]id values Marcin Kościelnicki
2015-10-22 13:49 ` [PATCH v2 10/13] gdb/linux-record: Fix old_select syscall handling Marcin Kościelnicki
2015-10-22 13:51 ` [PATCH v2 06/13] gdb/linux-record: Fix msghdr parsing on 64-bit targets Marcin Kościelnicki
2015-10-22 13:51 ` [PATCH v2 04/13] gdb/linux-record: Fix sizes of sigaction and sigset_t Marcin Kościelnicki
2015-10-22 13:55 ` [PATCH v2 07/13] gdb/linux-record: Support time, waitpid, pipe syscalls Marcin Kościelnicki
2015-10-22 14:32 ` [PATCH v2 02/13] gdb/linux-record: Remove size_siginfo Marcin Kościelnicki
2015-10-22 15:01 ` [PATCH v2 08/13] gdb/linux-record: Fix [gs]etgroups16 syscall Marcin Kościelnicki
2015-10-22 15:06 ` [PATCH v2 05/13] gdb/linux-record: Fix readdir and getdents handling Marcin Kościelnicki
2015-10-22 15:07 ` [PATCH v2 09/13] gdb/linux-record: Fix newfstatat handling Marcin Kościelnicki
2015-10-29 13:03 ` [PATCH v2 01/13] gdb/linux-record: Add testcases for a few syscalls Pedro Alves
2015-10-29 13:03 ` Marcin Kościelnicki
2015-10-30 14:52 ` Pedro Alves
2015-10-30 10:36 ` Marcin Kościelnicki
2015-10-30 15:05 ` Pedro Alves
2015-11-02 1:34 ` Marcin Kościelnicki
2015-11-02 16:40 ` Pedro Alves
2015-11-02 18:53 ` [PATCH] gdb/reverse: Fix continue_to_breakpoint in syscall testcases Marcin Kościelnicki
2015-11-02 19:17 ` Pedro Alves
2015-11-02 19:58 ` [PATCH 1/2] " Marcin Kościelnicki
2015-11-02 19:58 ` [PATCH 1/2] Obvious typo fix in gdb.reverse/readv-reverse.exp Marcin Kościelnicki
2015-11-02 20:00 ` Pedro Alves
2015-11-02 19:59 ` [PATCH 1/2] gdb/reverse: Fix continue_to_breakpoint in syscall testcases Pedro Alves
2015-10-30 10:37 ` [PATCH 01/13] gdb/record: Add testcases for a few syscalls Marcin Kościelnicki
2015-10-30 15:41 ` Pedro Alves
2015-10-30 15:55 ` [PATCH v4 " Marcin Kościelnicki
2015-10-31 18:59 ` Pedro Alves
2015-10-29 13:03 ` gdb/linux-record fixes Pedro Alves
2015-10-29 13:03 ` Pedro Alves
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1445521166-14492-1-git-send-email-koriakin@0x04.net \
--to=koriakin@0x04.net \
--cc=gdb-patches@sourceware.org \
--cc=palves@redhat.com \
--cc=qiyaoltc@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox