Darwin/detach: Do not resume inferior after ptrace detach
authorJoel Brobecker <brobecker@gnat.com>
Fri, 1 Jul 2011 18:36:12 +0000 (18:36 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Fri, 1 Jul 2011 18:36:12 +0000 (18:36 +0000)
When trying to detach from an inferior that we start from the debugger,
GDB prints the following warning:

    (gdb) detach
    Detaching from program: /[...]/foo, process 74593
    warning: Mach error at "/[...]/darwin-nat.c:445" in function "darwin_resume_inferior": (os/kern) failure (0x5)

The warning comes from the following code in darwin_detach:

     darwin_resume_inferior (inf);

This is because the process has already been resumed by the
PT_DETACH ptrace operation that has just been performed.

On the other hand, when trying to detach from an inferior that
was started outside of debugger control (thus after having attached
the debugger to that inferior), things go smoothly.  That's because
we don't use ptrace to control the process in that case, and so
the resume is perfectly justified.

This patch makes sure that we resume the inferior during the detach
only when we're NOT using ptrace.

gdb/ChangeLog:

        * darwin-nat.c (darwin_detach): Call darwin_resume_inferior
        only when inf->private->no_ptrace.

gdb/ChangeLog
gdb/darwin-nat.c

index eacb247bf614f82ef5f6947e7a4ec218a4c055fb..423ada3d0f5f1d35e54c713a966d775f7ce422c7 100644 (file)
@@ -1,3 +1,8 @@
+2011-07-01  Joel Brobecker  <brobecker@adacore.com>
+
+       * darwin-nat.c (darwin_detach): Call darwin_resume_inferior
+       only when inf->private->no_ptrace.
+
 2011-07-01  Joel Brobecker  <brobecker@adacore.com>
 
        * ada-lang.c (print_it_exception): Print temporary catchpoints
index 7be85d5870136dcb1b76968447c2defb9db9d66e..fc5263a5c077d44113a782632e57bd6d408a7dbb 100644 (file)
@@ -1601,7 +1601,11 @@ darwin_detach (struct target_ops *ops, char *args, int from_tty)
 
   darwin_reply_to_all_pending_messages (inf);
 
-  darwin_resume_inferior (inf);
+  /* When using ptrace, we have just performed a PT_DETACH, which
+     resumes the inferior.  On the other hand, when we are not using
+     ptrace, we need to resume its execution ourselves.  */
+  if (inf->private->no_ptrace)
+    darwin_resume_inferior (inf);
 
   darwin_mourn_inferior (ops);
 }