From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 108442 invoked by alias); 22 Oct 2015 13:39:42 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 108423 invoked by uid 89); 22 Oct 2015 13:39:41 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.6 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD,SPF_PASS autolearn=ham version=3.3.2 X-HELO: xyzzy.0x04.net Received: from xyzzy.0x04.net (HELO xyzzy.0x04.net) (109.74.193.254) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 22 Oct 2015 13:39:37 +0000 Received: from hogfather.0x04.net (89-65-84-110.dynamic.chello.pl [89.65.84.110]) by xyzzy.0x04.net (Postfix) with ESMTPS id 802F94012F; Thu, 22 Oct 2015 15:39:48 +0200 (CEST) Received: by hogfather.0x04.net (Postfix, from userid 1000) id 5EF6B5800AC; Thu, 22 Oct 2015 15:39:34 +0200 (CEST) From: =?UTF-8?q?Marcin=20Ko=C5=9Bcielnicki?= To: palves@redhat.com, qiyaoltc@gmail.com Cc: gdb-patches@sourceware.org, =?UTF-8?q?Marcin=20Ko=C5=9Bcielnicki?= Subject: [PATCH v2 01/13] gdb/linux-record: Add testcases for a few syscalls. Date: Thu, 22 Oct 2015 13:39:00 -0000 Message-Id: <1445521166-14492-1-git-send-email-koriakin@0x04.net> In-Reply-To: <5628E5D6.5020706@0x04.net> References: <5628E5D6.5020706@0x04.net> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-SW-Source: 2015-10/txt/msg00453.txt.bz2 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 + + * 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 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 . */ + +#define _GNU_SOURCE +#include +#include +#include + +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 . + +# 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 . */ + +#define _GNU_SOURCE +#include + +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 . + +# 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 . */ + +#define _GNU_SOURCE +#include + +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 . + +# 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 . */ + +#define _GNU_SOURCE +#include +#include + +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 . + +# 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 . */ + +#define _GNU_SOURCE +#include +#include +#include +#include + +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 . + +# 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 . */ + +#define _GNU_SOURCE +#include +#include +#include + +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 . + +# 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 . */ + +#include +#include +#include + +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 . + +# 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