diff options
author | Pedro Alves <palves@redhat.com> | 2012-11-05 18:56:45 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2012-11-05 18:56:45 +0000 |
commit | 68c9da300bc7b0d1245111a0e29471f721fa490d (patch) | |
tree | f73679406d60c6af9d722b665a2baf7c5b43ccfc | |
parent | a7c8c9312a88f65ecb43c28c5fba6f26aa87ba5b (diff) | |
download | gdb-68c9da300bc7b0d1245111a0e29471f721fa490d.zip gdb-68c9da300bc7b0d1245111a0e29471f721fa490d.tar.gz gdb-68c9da300bc7b0d1245111a0e29471f721fa490d.tar.bz2 |
gdb/
2012-11-05 Pedro Alves <palves@redhat.com>
* inferior.c (exit_inferior_1): Clear 'vfork_parent' in the vfork
child. Clear 'pending_detach'.
* infrun.c (handle_vfork_child_exec_or_exit): Clear
'pending_detach' in the vfork parent.
gdb/testsuite/
2012-11-05 Pedro Alves <palves@redhat.com>
* gdb.base/foll-vfork.exp (vfork_relations_in_info_inferiors): New
procedure.
(do_vfork_and_follow_child_tests_exec)
(do_vfork_and_follow_child_tests_exit): Call it.
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/inferior.c | 6 | ||||
-rw-r--r-- | gdb/infrun.c | 2 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/foll-vfork.exp | 66 |
5 files changed, 88 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ecf6239..baf3e71 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2012-11-05 Pedro Alves <palves@redhat.com> + + * inferior.c (exit_inferior_1): Clear 'vfork_parent' in the vfork + child. Clear 'pending_detach'. + * infrun.c (handle_vfork_child_exec_or_exit): Clear + 'pending_detach' in the vfork parent. + 2012-11-05 Doug Evans <dje@google.com> Add support for DWP files. http://gcc.gnu.org/wiki/DebugFissionDWP diff --git a/gdb/inferior.c b/gdb/inferior.c index f45058a..f46e1e3 100644 --- a/gdb/inferior.c +++ b/gdb/inferior.c @@ -266,9 +266,15 @@ exit_inferior_1 (struct inferior *inftoex, int silent) inf->vfork_parent->vfork_child = NULL; inf->vfork_parent = NULL; } + if (inf->vfork_child != NULL) + { + inf->vfork_child->vfork_parent = NULL; + inf->vfork_child = NULL; + } inf->has_exit_code = 0; inf->exit_code = 0; + inf->pending_detach = 0; } void diff --git a/gdb/infrun.c b/gdb/infrun.c index ab5aacf..3d6eccd 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -663,6 +663,8 @@ handle_vfork_child_exec_or_exit (int exec) /* follow-fork child, detach-on-fork on. */ + inf->vfork_parent->pending_detach = 0; + if (!exec) { /* If we're handling a child exit, then inferior_ptid diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 227b24f..80aac5b 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,12 @@ 2012-11-05 Pedro Alves <palves@redhat.com> + * gdb.base/foll-vfork.exp (vfork_relations_in_info_inferiors): New + procedure. + (do_vfork_and_follow_child_tests_exec) + (do_vfork_and_follow_child_tests_exit): Call it. + +2012-11-05 Pedro Alves <palves@redhat.com> + * gdb.base/foll-vfork.c (main): Call perror and _exit if execlp() fails. diff --git a/gdb/testsuite/gdb.base/foll-vfork.exp b/gdb/testsuite/gdb.base/foll-vfork.exp index 0b2eee6..58e92c4 100644 --- a/gdb/testsuite/gdb.base/foll-vfork.exp +++ b/gdb/testsuite/gdb.base/foll-vfork.exp @@ -388,6 +388,58 @@ proc tcatch_vfork_then_child_follow_exit {} { exec sleep 1 }} +proc vfork_relations_in_info_inferiors { variant } { + with_test_prefix "vfork relations in info inferiors" { + global gdb_prompt + + setup_gdb + + gdb_test_no_output "set follow-fork child" + + set test "step over vfork" + gdb_test_multiple "next" $test { + -re "Attaching after .* vfork to child.*if \\(pid == 0\\).*$gdb_prompt " { + pass "$test" + } + } + + gdb_test "info inferiors" \ + ".*is vfork child of inferior 1.*is vfork parent of inferior 2" \ + "info inferiors shows vfork parent/child relation" + + if { $variant == "exec" } { + global srcfile2 + + set linenum [gdb_get_line_number "printf(\"Hello from vforked-prog" ${srcfile2}] + set test "continue to bp" + gdb_test_multiple "continue" $test { + -re ".*xecuting new program.*Breakpoint.*vforked-prog.c:${linenum}.*$gdb_prompt " { + pass $test + } + } + } else { + set test "continue to child exit" + gdb_test_multiple "continue" $test { + -re "exited normally.*$gdb_prompt " { + pass $test + } + } + } + + set test "vfork relation no longer appears in info inferiors" + gdb_test_multiple "info inferiors" $test { + -re "is vfork child of inferior 1.*$gdb_prompt $" { + fail $test + } + -re "is vfork parent of inferior 2.*$gdb_prompt $" { + fail $test + } + -re "$gdb_prompt $" { + pass $test + } + } +}} + proc do_vfork_and_follow_parent_tests {} { global gdb_prompt @@ -435,6 +487,13 @@ proc do_vfork_and_follow_child_tests_exec {} { # catchpoints. # ??rehrauer: NYI. Will add testpoints here when implemented. # + + # Step over a vfork in the child, do "info inferiors" and check the + # parent/child relation is displayed. Run the child over the exec, + # and confirm the relation is no longer displayed in "info + # inferiors". + # + vfork_relations_in_info_inferiors "exec" } proc do_vfork_and_follow_child_tests_exit {} { @@ -446,6 +505,13 @@ proc do_vfork_and_follow_child_tests_exit {} { # Try catching a vfork, and stepping out to the child. # tcatch_vfork_then_child_follow_exit + + # Step over a vfork in the child, do "info inferiors" and check the + # parent/child relation is displayed. Run the child to completion, + # and confirm the relation is no longer displayed in "info + # inferiors". + # + vfork_relations_in_info_inferiors "exit" } with_test_prefix "check vfork support" { |