summaryrefslogtreecommitdiff
path: root/gdb/win32-nat.c
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2001-10-26 09:29:31 +0000
committerCorinna Vinschen <corinna@vinschen.de>2001-10-26 09:29:31 +0000
commit02cc9f49aed3ba8b9dc21450e567f16c5f9981fe (patch)
tree3a40c65e0ce21e9cea355c2cbe8b7f94a750c3e7 /gdb/win32-nat.c
parent560ba567a08f995fe5e2d24f47b504e3aca28fa6 (diff)
downloadbinutils-gdb-02cc9f49aed3ba8b9dc21450e567f16c5f9981fe.tar.gz
* 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.
Diffstat (limited to 'gdb/win32-nat.c')
-rw-r--r--gdb/win32-nat.c56
1 files changed, 52 insertions, 4 deletions
diff --git a/gdb/win32-nat.c b/gdb/win32-nat.c
index fab5d03c6d1..0e2fb5dc3e1 100644
--- a/gdb/win32-nat.c
+++ b/gdb/win32-nat.c
@@ -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;