Add test for following fork on position-independent executables

Message ID 1523460523-19370-1-git-send-email-simon.marchi@ericsson.com
State New, archived
Headers

Commit Message

Simon Marchi April 11, 2018, 3:28 p.m. UTC
  Commit

  b2e586e ("Defer breakpoint reset when cloning progspace for fork
  child")

fixed following fork childs when the executable is position-independent.
This patch adds a little test for it.

gdb/testsuite/ChangeLog:

	* gdb.base/pie-fork.c: New file.
	* gdb.base/pie-fork.exp: New file.
---
 gdb/testsuite/gdb.base/pie-fork.c   | 34 ++++++++++++++++++
 gdb/testsuite/gdb.base/pie-fork.exp | 69 +++++++++++++++++++++++++++++++++++++
 2 files changed, 103 insertions(+)
 create mode 100644 gdb/testsuite/gdb.base/pie-fork.c
 create mode 100644 gdb/testsuite/gdb.base/pie-fork.exp
  

Comments

Pedro Alves April 11, 2018, 6:24 p.m. UTC | #1
On 04/11/2018 04:28 PM, Simon Marchi wrote:

> +static void
> +break_here ()

This is C, so "(void)" is better here.

> +{
> +   int i;
> +   for (i = 0; i < 30; i++)
> +     sleep (1);
> +}
> +
> +int
> +main ()
> +{
> +  fork ();
> +  break_here();

Missing space before parens.

> +if [use_gdb_stub] {
> +    return
> +}
> +
I guess this is why you were asking about following forks and
"target remote".  AFAICT, this should just work in that case
too.  Did you find out it doesn't?

Otherwise looks fine.  Thanks for adding this.

Thanks,
Pedro Alves
  
Simon Marchi April 11, 2018, 6:53 p.m. UTC | #2
On 2018-04-11 14:24, Pedro Alves wrote:
> On 04/11/2018 04:28 PM, Simon Marchi wrote:
> 
>> +static void
>> +break_here ()
> 
> This is C, so "(void)" is better here.

Fixed.

>> +{
>> +   int i;
>> +   for (i = 0; i < 30; i++)
>> +     sleep (1);
>> +}
>> +
>> +int
>> +main ()
>> +{
>> +  fork ();
>> +  break_here();
> 
> Missing space before parens.

Fixed.

>> +if [use_gdb_stub] {
>> +    return
>> +}
>> +
> I guess this is why you were asking about following forks and
> "target remote".  AFAICT, this should just work in that case
> too.  Did you find out it doesn't?

No it works actually, and I was suprised :).  I'll remove that "if".

> Otherwise looks fine.  Thanks for adding this.

Thanks, I'll push with those things fixed.

Simon
  

Patch

diff --git a/gdb/testsuite/gdb.base/pie-fork.c b/gdb/testsuite/gdb.base/pie-fork.c
new file mode 100644
index 0000000..a613228
--- /dev/null
+++ b/gdb/testsuite/gdb.base/pie-fork.c
@@ -0,0 +1,34 @@ 
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2018 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>
+
+static void
+break_here ()
+{
+   int i;
+   for (i = 0; i < 30; i++)
+     sleep (1);
+}
+
+int
+main ()
+{
+  fork ();
+  break_here();
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.base/pie-fork.exp b/gdb/testsuite/gdb.base/pie-fork.exp
new file mode 100644
index 0000000..e58c960
--- /dev/null
+++ b/gdb/testsuite/gdb.base/pie-fork.exp
@@ -0,0 +1,69 @@ 
+# Copyright 2018 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/>.
+
+# Test that we can follow forks properly when the executable is
+# position-independent.
+
+standard_testfile
+
+set opts [list debug additional_flags=-fPIE ldflags=-pie]
+
+if [prepare_for_testing "failed to prepare" $testfile $srcfile $opts] {
+    return
+}
+
+if [use_gdb_stub] {
+    return
+}
+
+proc setup_test {detach_on_fork {follow_fork_mode "parent"}} {
+    global binfile
+
+    clean_restart ${binfile}
+
+    if ![runto_main] {
+	fail "can't run to main"
+	return
+    }
+
+    gdb_test_no_output "set detach-on-fork ${detach_on_fork}"
+    gdb_test_no_output "set follow-fork-mode ${follow_fork_mode}"
+
+    gdb_breakpoint "break_here"
+}
+
+proc_with_prefix test_detach_on_fork_follow_parent {} {
+    setup_test "on" "parent"
+
+    gdb_test "continue" "\r\nBreakpoint 2, break_here.*"
+}
+
+proc_with_prefix test_detach_on_fork_follow_child {} {
+    setup_test "on" "child"
+
+    gdb_test "continue" "\r\nThread 2.1 .* hit Breakpoint 2, break_here.*"
+}
+
+proc_with_prefix test_no_detach_on_fork {} {
+    setup_test "off"
+
+    gdb_test "continue" "\r\nThread 1.1 .* hit Breakpoint 2, break_here.*"
+    gdb_test "thread 2.1"
+    gdb_test "continue" "\r\nThread 2.1 .* hit Breakpoint 2, break_here.*"
+}
+
+test_detach_on_fork_follow_parent
+test_detach_on_fork_follow_child
+test_no_detach_on_fork