* 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.
This commit is contained in:
parent
560ba567a0
commit
02cc9f49ae
3 changed files with 115 additions and 8 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue