* win32-nat.c (DebugSetProcessKillOnExit): New static function
authorCorinna Vinschen <corinna@vinschen.de>
Fri, 26 Oct 2001 09:29:31 +0000 (09:29 +0000)
committerCorinna Vinschen <corinna@vinschen.de>
Fri, 26 Oct 2001 09:29:31 +0000 (09:29 +0000)
        pointer to Windows' DebugSetProcessKillOnExit() function.
        (DebugActiveProcessStop): Ditto for DebugActiveProcessStop().
        (has_detach_ability): New function.
        (child_attach): If system has detach ability, enable it.
        (child_detach): If system has detach ability, actually
        detach from process.
        Change tty output to Linux format.

gdb/ChangeLog
gdb/win32-nat.c
gdb/windows-nat.c

index 66dc87a0ba42a82393a71a9d54f65ae842869b34..068fd0b60f42a78264c3490b72971ff6b9a9307b 100644 (file)
@@ -1,3 +1,14 @@
+2001-10-24  Corinna Vinschen  <vinschen@redhat.com>
+
+       * win32-nat.c (DebugSetProcessKillOnExit): New static function
+       pointer to Windows' DebugSetProcessKillOnExit() function.
+       (DebugActiveProcessStop): Ditto for DebugActiveProcessStop().
+       (has_detach_ability): New function.
+       (child_attach): If system has detach ability, enable it.
+       (child_detach): If system has detach ability, actually  
+       detach from process.
+       Change tty output to Linux format.
+
 2001-10-23  Jim Blandy  <jimb@redhat.com>
 
        Isolate STABS readers' use of the `textlow' and `texthigh' fields
index fab5d03c6d11f761c61b5376ecf57a88585f3ef1..0e2fb5dc3e1bd24ff0b24c0b33f01dd86e39b4dc 100644 (file)
@@ -1022,8 +1022,36 @@ do_initial_child_stuff (DWORD pid)
   return;
 }
 
-/* Attach to process PID, then initialize for debugging it.  */
+/* Since Windows XP, detaching from a process is supported by Windows.
+   The following code tries loading the appropriate functions dynamically.
+   If loading these functions succeeds use them to actually detach from
+   the inferior process, otherwise behave as usual, pretending that
+   detach has worked. */
+static BOOL WINAPI (*DebugSetProcessKillOnExit)(BOOL);
+static BOOL WINAPI (*DebugActiveProcessStop)(DWORD);
+
+static int
+has_detach_ability ()
+{
+  static HMODULE kernel32 = NULL;
+
+  if (!kernel32)
+    kernel32 = LoadLibrary ("kernel32.dll");
+  if (kernel32)
+    {
+      if (!DebugSetProcessKillOnExit)
+       DebugSetProcessKillOnExit = GetProcAddress (kernel32,
+                                                "DebugSetProcessKillOnExit");
+      if (!DebugActiveProcessStop)
+       DebugActiveProcessStop = GetProcAddress (kernel32,
+                                                "DebugActiveProcessStop");
+      if (DebugSetProcessKillOnExit && DebugActiveProcessStop)
+       return 1;
+    }
+  return 0;
+}
 
+/* Attach to process PID, then initialize for debugging it.  */
 static void
 child_attach (char *args, int from_tty)
 {
@@ -1039,6 +1067,12 @@ child_attach (char *args, int from_tty)
   if (!ok)
     error ("Can't attach to process.");
 
+  if (has_detach_ability ())
+    {
+      attach_flag = 1;
+      DebugSetProcessKillOnExit (FALSE);
+    }
+
   if (from_tty)
     {
       char *exec_file = (char *) get_exec_file (0);
@@ -1060,13 +1094,27 @@ child_attach (char *args, int from_tty)
 static void
 child_detach (char *args ATTRIBUTE_UNUSED, int from_tty)
 {
-  if (from_tty)
+  int detached = 1;
+
+  if (has_detach_ability ())
+    {
+      delete_command (NULL, 0);
+      child_continue (DBG_CONTINUE, -1);
+      if (!DebugActiveProcessStop (current_event.dwProcessId))
+        {
+         error ("Can't detach process %lu (error %lu)",
+                current_event.dwProcessId, GetLastError ());
+         detached = 0;
+        }
+      DebugSetProcessKillOnExit (FALSE);
+    }
+  if (detached && from_tty)
     {
       char *exec_file = get_exec_file (0);
       if (exec_file == 0)
        exec_file = "";
-      printf_unfiltered ("Detaching from program: %s %s\n", exec_file,
-                        target_pid_to_str (inferior_ptid));
+      printf_unfiltered ("Detaching from program: %s, Pid %lu\n", exec_file,
+                        current_event.dwProcessId);
       gdb_flush (gdb_stdout);
     }
   inferior_ptid = null_ptid;
index fab5d03c6d11f761c61b5376ecf57a88585f3ef1..0e2fb5dc3e1bd24ff0b24c0b33f01dd86e39b4dc 100644 (file)
@@ -1022,8 +1022,36 @@ do_initial_child_stuff (DWORD pid)
   return;
 }
 
-/* Attach to process PID, then initialize for debugging it.  */
+/* Since Windows XP, detaching from a process is supported by Windows.
+   The following code tries loading the appropriate functions dynamically.
+   If loading these functions succeeds use them to actually detach from
+   the inferior process, otherwise behave as usual, pretending that
+   detach has worked. */
+static BOOL WINAPI (*DebugSetProcessKillOnExit)(BOOL);
+static BOOL WINAPI (*DebugActiveProcessStop)(DWORD);
+
+static int
+has_detach_ability ()
+{
+  static HMODULE kernel32 = NULL;
+
+  if (!kernel32)
+    kernel32 = LoadLibrary ("kernel32.dll");
+  if (kernel32)
+    {
+      if (!DebugSetProcessKillOnExit)
+       DebugSetProcessKillOnExit = GetProcAddress (kernel32,
+                                                "DebugSetProcessKillOnExit");
+      if (!DebugActiveProcessStop)
+       DebugActiveProcessStop = GetProcAddress (kernel32,
+                                                "DebugActiveProcessStop");
+      if (DebugSetProcessKillOnExit && DebugActiveProcessStop)
+       return 1;
+    }
+  return 0;
+}
 
+/* Attach to process PID, then initialize for debugging it.  */
 static void
 child_attach (char *args, int from_tty)
 {
@@ -1039,6 +1067,12 @@ child_attach (char *args, int from_tty)
   if (!ok)
     error ("Can't attach to process.");
 
+  if (has_detach_ability ())
+    {
+      attach_flag = 1;
+      DebugSetProcessKillOnExit (FALSE);
+    }
+
   if (from_tty)
     {
       char *exec_file = (char *) get_exec_file (0);
@@ -1060,13 +1094,27 @@ child_attach (char *args, int from_tty)
 static void
 child_detach (char *args ATTRIBUTE_UNUSED, int from_tty)
 {
-  if (from_tty)
+  int detached = 1;
+
+  if (has_detach_ability ())
+    {
+      delete_command (NULL, 0);
+      child_continue (DBG_CONTINUE, -1);
+      if (!DebugActiveProcessStop (current_event.dwProcessId))
+        {
+         error ("Can't detach process %lu (error %lu)",
+                current_event.dwProcessId, GetLastError ());
+         detached = 0;
+        }
+      DebugSetProcessKillOnExit (FALSE);
+    }
+  if (detached && from_tty)
     {
       char *exec_file = get_exec_file (0);
       if (exec_file == 0)
        exec_file = "";
-      printf_unfiltered ("Detaching from program: %s %s\n", exec_file,
-                        target_pid_to_str (inferior_ptid));
+      printf_unfiltered ("Detaching from program: %s, Pid %lu\n", exec_file,
+                        current_event.dwProcessId);
       gdb_flush (gdb_stdout);
     }
   inferior_ptid = null_ptid;