Add test for following fork on position-independent executables
Commit Message
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
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
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
new file mode 100644
@@ -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;
+}
new file mode 100644
@@ -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