* win32-nat.c: Perform various gcc warning cleanups.
(safe_symbol_file_add_cleanup): Reset stdout to saved stdout, not stderr. (dll_symbol_command): Pass OBJF_USERLOADED to safe_symbol_file_add. (get_child_debug_event): Always reset last_sig. Always reset inferior pid appropriately. (do_initial_child_stuff): New function. Called when attaching or starting a new inferior process. (child_attach): Use do_initial_child_stuff. (child_create_inferior): Ditto. * config/i386/cygwin.mh (NAT_FILE): Set to modern location. * config/i386/tm-cygwin.h: Define ATTACH_NO_WAIT.
This commit is contained in:
parent
463f102c0a
commit
9d3789f7f1
5 changed files with 155 additions and 129 deletions
|
@ -1,3 +1,18 @@
|
|||
2000-08-06 Christopher Faylor <cgf@cygnus.com>
|
||||
|
||||
* win32-nat.c: Perform various gcc warning cleanups.
|
||||
(safe_symbol_file_add_cleanup): Reset stdout to saved stdout, not
|
||||
stderr.
|
||||
(dll_symbol_command): Pass OBJF_USERLOADED to safe_symbol_file_add.
|
||||
(get_child_debug_event): Always reset last_sig. Always reset inferior
|
||||
pid appropriately.
|
||||
(do_initial_child_stuff): New function. Called when attaching or starting
|
||||
a new inferior process.
|
||||
(child_attach): Use do_initial_child_stuff.
|
||||
(child_create_inferior): Ditto.
|
||||
* config/i386/cygwin.mh (NAT_FILE): Set to modern location.
|
||||
* config/i386/tm-cygwin.h: Define ATTACH_NO_WAIT.
|
||||
|
||||
2000-08-05 Eli Zaretskii <eliz@is.elta.co.il>
|
||||
|
||||
* go32-nat.c: (go32_wait): If child_cwd[] is empty, initialize
|
||||
|
|
|
@ -2,5 +2,5 @@ MH_CFLAGS=
|
|||
XM_FILE=xm-cygwin.h
|
||||
XDEPFILES=
|
||||
NATDEPFILES= win32-nat.o
|
||||
NAT_FILE=../nm-empty.h
|
||||
NAT_FILE=../none/nm-none.h
|
||||
XM_CLIBS=
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
extern CORE_ADDR skip_trampoline_code (CORE_ADDR pc, char *name);
|
||||
#endif
|
||||
|
||||
#define ATTACH_NO_WAIT
|
||||
#define SOLIB_ADD(filename, from_tty, targ) child_solib_add(filename, from_tty, targ)
|
||||
#define SOLIB_LOADED_LIBRARY_PATHNAME(pid) child_solib_loaded_library_pathname(pid)
|
||||
#define CLEAR_SOLIB child_clear_solib
|
||||
|
|
133
gdb/win32-nat.c
133
gdb/win32-nat.c
|
@ -54,8 +54,11 @@ extern int (*ui_loop_hook) (int signo);
|
|||
following which never should have been in the generic Win32 API
|
||||
headers in the first place since they were our own invention... */
|
||||
#ifndef _GNU_H_WINDOWS_H
|
||||
#define FLAG_TRACE_BIT 0x100
|
||||
#define CONTEXT_DEBUGGER (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
|
||||
enum
|
||||
{
|
||||
FLAG_TRACE_BIT = 0x100,
|
||||
CONTEXT_DEBUGGER = (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
|
||||
};
|
||||
#endif
|
||||
|
||||
/* The string sent by cygwin when it processes a signal.
|
||||
|
@ -441,13 +444,14 @@ safe_symbol_file_add_stub (void *argv)
|
|||
static void
|
||||
safe_symbol_file_add_cleanup (void *p)
|
||||
{
|
||||
#define sp ((struct safe_symbol_file_add_args *)p)
|
||||
# define sp ((struct safe_symbol_file_add_args *)p)
|
||||
gdb_flush (gdb_stderr);
|
||||
gdb_flush (gdb_stdout);
|
||||
ui_file_delete (gdb_stderr);
|
||||
ui_file_delete (gdb_stdout);
|
||||
gdb_stderr = sp->err;
|
||||
gdb_stdout = sp->err;
|
||||
gdb_stdout = sp->out;
|
||||
# undef sp
|
||||
}
|
||||
|
||||
/* symbol_file_add wrapper that prevents errors from being displayed. */
|
||||
|
@ -499,9 +503,8 @@ handle_load_dll (PTR dummy ATTRIBUTE_UNUSED)
|
|||
DWORD dll_name_ptr;
|
||||
DWORD done;
|
||||
char dll_buf[MAX_PATH + 1];
|
||||
struct so_stuff *so, *solast;
|
||||
struct so_stuff *so;
|
||||
char *dll_name = NULL;
|
||||
DWORD dll_base = 0;
|
||||
int len;
|
||||
char *p;
|
||||
|
||||
|
@ -593,7 +596,7 @@ handle_load_dll (PTR dummy ATTRIBUTE_UNUSED)
|
|||
|
||||
/* Return name of last loaded DLL. */
|
||||
char *
|
||||
child_solib_loaded_library_pathname (int pid)
|
||||
child_solib_loaded_library_pathname (int pid ATTRIBUTE_UNUSED)
|
||||
{
|
||||
return !solib_end || !solib_end->name[0]? NULL : solib_end->name;
|
||||
}
|
||||
|
@ -617,7 +620,7 @@ child_clear_solibs (void)
|
|||
|
||||
/* Add DLL symbol information. */
|
||||
void
|
||||
child_solib_add (char *filename, int from_tty, struct target_ops *t)
|
||||
child_solib_add (char *filename ATTRIBUTE_UNUSED, int from_tty ATTRIBUTE_UNUSED, struct target_ops *t ATTRIBUTE_UNUSED)
|
||||
{
|
||||
struct section_addr_info section_addrs;
|
||||
|
||||
|
@ -638,21 +641,19 @@ child_solib_add (char *filename, int from_tty, struct target_ops *t)
|
|||
|
||||
/* Load DLL symbol info. */
|
||||
void
|
||||
dll_symbol_command (char *args, int from_tty)
|
||||
dll_symbol_command (char *args, int from_tty ATTRIBUTE_UNUSED)
|
||||
{
|
||||
struct section_addr_info section_addrs;
|
||||
|
||||
dont_repeat ();
|
||||
|
||||
if (args == NULL)
|
||||
error ("dll-symbols requires a file name");
|
||||
|
||||
safe_symbol_file_add (args, 0, NULL, 0, OBJF_SHARED);
|
||||
safe_symbol_file_add (args, 0, NULL, 0, OBJF_SHARED | OBJF_USERLOADED);
|
||||
}
|
||||
|
||||
/* List currently loaded DLLs. */
|
||||
void
|
||||
info_dll_command (char *ignore, int from_tty)
|
||||
info_dll_command (char *ignore ATTRIBUTE_UNUSED, int from_tty ATTRIBUTE_UNUSED)
|
||||
{
|
||||
struct so_stuff *so = &solib_start;
|
||||
|
||||
|
@ -710,8 +711,6 @@ handle_exception (struct target_waitstatus *ourstatus)
|
|||
/* Record the context of the current thread */
|
||||
th = thread_rec (current_event.dwThreadId, -1);
|
||||
|
||||
last_sig = 0;
|
||||
|
||||
switch (code)
|
||||
{
|
||||
case EXCEPTION_ACCESS_VIOLATION:
|
||||
|
@ -800,13 +799,14 @@ child_continue (DWORD continue_status, int id)
|
|||
static int
|
||||
get_child_debug_event (int pid ATTRIBUTE_UNUSED, struct target_waitstatus *ourstatus)
|
||||
{
|
||||
int breakout = 0;
|
||||
BOOL debug_event;
|
||||
DWORD continue_status, event_code;
|
||||
thread_info *th = NULL;
|
||||
static thread_info dummy_thread_info;
|
||||
int retval = 0;
|
||||
|
||||
last_sig = 0;
|
||||
|
||||
if (!(debug_event = WaitForDebugEvent (¤t_event, 1000)))
|
||||
goto out;
|
||||
|
||||
|
@ -848,13 +848,15 @@ get_child_debug_event (int pid ATTRIBUTE_UNUSED, struct target_waitstatus *ourst
|
|||
"CREATE_PROCESS_DEBUG_EVENT"));
|
||||
current_process_handle = current_event.u.CreateProcessInfo.hProcess;
|
||||
|
||||
main_thread_id = inferior_pid = current_event.dwThreadId;
|
||||
main_thread_id = current_event.dwThreadId;
|
||||
/* Add the main thread */
|
||||
#if 0
|
||||
th = child_add_thread (current_event.dwProcessId,
|
||||
current_event.u.CreateProcessInfo.hProcess);
|
||||
th = child_add_thread (inferior_pid,
|
||||
#endif
|
||||
th = child_add_thread (main_thread_id,
|
||||
current_event.u.CreateProcessInfo.hThread);
|
||||
retval = ourstatus->value.related_pid = current_event.dwProcessId;
|
||||
retval = ourstatus->value.related_pid = current_event.dwThreadId;
|
||||
break;
|
||||
|
||||
case EXIT_PROCESS_DEBUG_EVENT:
|
||||
|
@ -865,7 +867,7 @@ get_child_debug_event (int pid ATTRIBUTE_UNUSED, struct target_waitstatus *ourst
|
|||
ourstatus->kind = TARGET_WAITKIND_EXITED;
|
||||
ourstatus->value.integer = current_event.u.ExitProcess.dwExitCode;
|
||||
CloseHandle (current_process_handle);
|
||||
retval = current_event.dwProcessId;
|
||||
retval = main_thread_id;
|
||||
break;
|
||||
|
||||
case LOAD_DLL_DEBUG_EVENT:
|
||||
|
@ -877,7 +879,7 @@ get_child_debug_event (int pid ATTRIBUTE_UNUSED, struct target_waitstatus *ourst
|
|||
registers_changed (); /* mark all regs invalid */
|
||||
ourstatus->kind = TARGET_WAITKIND_LOADED;
|
||||
ourstatus->value.integer = 0;
|
||||
retval = current_event.dwProcessId;
|
||||
retval = main_thread_id;
|
||||
break;
|
||||
|
||||
case UNLOAD_DLL_DEBUG_EVENT:
|
||||
|
@ -902,8 +904,9 @@ get_child_debug_event (int pid ATTRIBUTE_UNUSED, struct target_waitstatus *ourst
|
|||
(unsigned) current_event.dwThreadId,
|
||||
"OUTPUT_DEBUG_STRING_EVENT"));
|
||||
if (handle_output_debug_string ( ourstatus))
|
||||
retval = current_event.dwProcessId;
|
||||
retval = main_thread_id;
|
||||
break;
|
||||
|
||||
default:
|
||||
printf_unfiltered ("gdb: kernel event for pid=%ld tid=%ld\n",
|
||||
(DWORD) current_event.dwProcessId,
|
||||
|
@ -916,7 +919,10 @@ get_child_debug_event (int pid ATTRIBUTE_UNUSED, struct target_waitstatus *ourst
|
|||
if (!retval)
|
||||
CHECK (child_continue (continue_status, -1));
|
||||
else
|
||||
current_thread = th ?: thread_rec (current_event.dwThreadId, TRUE);
|
||||
{
|
||||
current_thread = th ?: thread_rec (current_event.dwThreadId, TRUE);
|
||||
inferior_pid = retval;
|
||||
}
|
||||
|
||||
out:
|
||||
return retval;
|
||||
|
@ -950,44 +956,70 @@ child_wait (int pid, struct target_waitstatus *ourstatus)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
do_initial_child_stuff (DWORD pid)
|
||||
{
|
||||
extern int stop_after_trap;
|
||||
|
||||
last_sig = 0;
|
||||
event_count = 0;
|
||||
exception_count = 0;
|
||||
current_event.dwProcessId = pid;
|
||||
memset (¤t_event, 0, sizeof (current_event));
|
||||
push_target (&child_ops);
|
||||
child_init_thread_list ();
|
||||
child_clear_solibs ();
|
||||
clear_proceed_status ();
|
||||
init_wait_for_inferior ();
|
||||
|
||||
target_terminal_init ();
|
||||
target_terminal_inferior ();
|
||||
|
||||
while (1)
|
||||
{
|
||||
stop_after_trap = 1;
|
||||
wait_for_inferior ();
|
||||
if (stop_signal != TARGET_SIGNAL_TRAP)
|
||||
resume (0, stop_signal);
|
||||
else
|
||||
break;
|
||||
}
|
||||
stop_after_trap = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Attach to process PID, then initialize for debugging it. */
|
||||
|
||||
static void
|
||||
child_attach (char *args, int from_tty)
|
||||
{
|
||||
BOOL ok;
|
||||
DWORD pid = strtoul (args, 0, 0);
|
||||
|
||||
if (!args)
|
||||
error_no_arg ("process-id to attach");
|
||||
|
||||
current_event.dwProcessId = strtoul (args, 0, 0);
|
||||
|
||||
ok = DebugActiveProcess (current_event.dwProcessId);
|
||||
ok = DebugActiveProcess (pid);
|
||||
|
||||
if (!ok)
|
||||
error ("Can't attach to process.");
|
||||
|
||||
exception_count = 0;
|
||||
event_count = 0;
|
||||
|
||||
child_init_thread_list ();
|
||||
child_clear_solibs ();
|
||||
|
||||
if (from_tty)
|
||||
{
|
||||
char *exec_file = (char *) get_exec_file (0);
|
||||
|
||||
if (exec_file)
|
||||
printf_unfiltered ("Attaching to program `%s', %s\n", exec_file,
|
||||
target_pid_to_str (current_event.dwProcessId));
|
||||
target_pid_to_str (pid));
|
||||
else
|
||||
printf_unfiltered ("Attaching to %s\n",
|
||||
target_pid_to_str (current_event.dwProcessId));
|
||||
target_pid_to_str (pid));
|
||||
|
||||
gdb_flush (gdb_stdout);
|
||||
}
|
||||
|
||||
push_target (&child_ops);
|
||||
do_initial_child_stuff (pid);
|
||||
target_terminal_ours ();
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1037,11 +1069,9 @@ child_create_inferior (char *exec_file, char *allargs, char **env)
|
|||
int i;
|
||||
STARTUPINFO si;
|
||||
PROCESS_INFORMATION pi;
|
||||
struct target_waitstatus dummy;
|
||||
BOOL ret;
|
||||
DWORD flags;
|
||||
char *args;
|
||||
extern int stop_after_trap;
|
||||
|
||||
if (!exec_file)
|
||||
error ("No executable specified, use `target exec'.\n");
|
||||
|
@ -1152,32 +1182,7 @@ child_create_inferior (char *exec_file, char *allargs, char **env)
|
|||
if (!ret)
|
||||
error ("Error creating process %s, (error %d)\n", exec_file, GetLastError ());
|
||||
|
||||
exception_count = 0;
|
||||
event_count = 0;
|
||||
|
||||
current_process_handle = pi.hProcess;
|
||||
current_event.dwProcessId = pi.dwProcessId;
|
||||
memset (¤t_event, 0, sizeof (current_event));
|
||||
inferior_pid = current_event.dwThreadId = pi.dwThreadId;
|
||||
push_target (&child_ops);
|
||||
child_init_thread_list ();
|
||||
child_clear_solibs ();
|
||||
clear_proceed_status ();
|
||||
init_wait_for_inferior ();
|
||||
target_terminal_init ();
|
||||
target_terminal_inferior ();
|
||||
last_sig = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
stop_after_trap = 1;
|
||||
wait_for_inferior ();
|
||||
if (stop_signal != TARGET_SIGNAL_TRAP)
|
||||
resume (0, stop_signal);
|
||||
else
|
||||
break;
|
||||
}
|
||||
stop_after_trap = 0;
|
||||
do_initial_child_stuff (pi.dwProcessId);
|
||||
|
||||
/* child_continue (DBG_CONTINUE, -1);*/
|
||||
proceed ((CORE_ADDR) - 1, TARGET_SIGNAL_0, 0);
|
||||
|
@ -1296,7 +1301,7 @@ child_can_run (void)
|
|||
}
|
||||
|
||||
static void
|
||||
child_close (void)
|
||||
child_close (int x ATTRIBUTE_UNUSED)
|
||||
{
|
||||
DEBUG_EVENTS (("gdb: child_close, inferior_pid=%d\n", inferior_pid));
|
||||
}
|
||||
|
|
|
@ -54,8 +54,11 @@ extern int (*ui_loop_hook) (int signo);
|
|||
following which never should have been in the generic Win32 API
|
||||
headers in the first place since they were our own invention... */
|
||||
#ifndef _GNU_H_WINDOWS_H
|
||||
#define FLAG_TRACE_BIT 0x100
|
||||
#define CONTEXT_DEBUGGER (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
|
||||
enum
|
||||
{
|
||||
FLAG_TRACE_BIT = 0x100,
|
||||
CONTEXT_DEBUGGER = (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
|
||||
};
|
||||
#endif
|
||||
|
||||
/* The string sent by cygwin when it processes a signal.
|
||||
|
@ -441,13 +444,14 @@ safe_symbol_file_add_stub (void *argv)
|
|||
static void
|
||||
safe_symbol_file_add_cleanup (void *p)
|
||||
{
|
||||
#define sp ((struct safe_symbol_file_add_args *)p)
|
||||
# define sp ((struct safe_symbol_file_add_args *)p)
|
||||
gdb_flush (gdb_stderr);
|
||||
gdb_flush (gdb_stdout);
|
||||
ui_file_delete (gdb_stderr);
|
||||
ui_file_delete (gdb_stdout);
|
||||
gdb_stderr = sp->err;
|
||||
gdb_stdout = sp->err;
|
||||
gdb_stdout = sp->out;
|
||||
# undef sp
|
||||
}
|
||||
|
||||
/* symbol_file_add wrapper that prevents errors from being displayed. */
|
||||
|
@ -499,9 +503,8 @@ handle_load_dll (PTR dummy ATTRIBUTE_UNUSED)
|
|||
DWORD dll_name_ptr;
|
||||
DWORD done;
|
||||
char dll_buf[MAX_PATH + 1];
|
||||
struct so_stuff *so, *solast;
|
||||
struct so_stuff *so;
|
||||
char *dll_name = NULL;
|
||||
DWORD dll_base = 0;
|
||||
int len;
|
||||
char *p;
|
||||
|
||||
|
@ -593,7 +596,7 @@ handle_load_dll (PTR dummy ATTRIBUTE_UNUSED)
|
|||
|
||||
/* Return name of last loaded DLL. */
|
||||
char *
|
||||
child_solib_loaded_library_pathname (int pid)
|
||||
child_solib_loaded_library_pathname (int pid ATTRIBUTE_UNUSED)
|
||||
{
|
||||
return !solib_end || !solib_end->name[0]? NULL : solib_end->name;
|
||||
}
|
||||
|
@ -617,7 +620,7 @@ child_clear_solibs (void)
|
|||
|
||||
/* Add DLL symbol information. */
|
||||
void
|
||||
child_solib_add (char *filename, int from_tty, struct target_ops *t)
|
||||
child_solib_add (char *filename ATTRIBUTE_UNUSED, int from_tty ATTRIBUTE_UNUSED, struct target_ops *t ATTRIBUTE_UNUSED)
|
||||
{
|
||||
struct section_addr_info section_addrs;
|
||||
|
||||
|
@ -638,21 +641,19 @@ child_solib_add (char *filename, int from_tty, struct target_ops *t)
|
|||
|
||||
/* Load DLL symbol info. */
|
||||
void
|
||||
dll_symbol_command (char *args, int from_tty)
|
||||
dll_symbol_command (char *args, int from_tty ATTRIBUTE_UNUSED)
|
||||
{
|
||||
struct section_addr_info section_addrs;
|
||||
|
||||
dont_repeat ();
|
||||
|
||||
if (args == NULL)
|
||||
error ("dll-symbols requires a file name");
|
||||
|
||||
safe_symbol_file_add (args, 0, NULL, 0, OBJF_SHARED);
|
||||
safe_symbol_file_add (args, 0, NULL, 0, OBJF_SHARED | OBJF_USERLOADED);
|
||||
}
|
||||
|
||||
/* List currently loaded DLLs. */
|
||||
void
|
||||
info_dll_command (char *ignore, int from_tty)
|
||||
info_dll_command (char *ignore ATTRIBUTE_UNUSED, int from_tty ATTRIBUTE_UNUSED)
|
||||
{
|
||||
struct so_stuff *so = &solib_start;
|
||||
|
||||
|
@ -710,8 +711,6 @@ handle_exception (struct target_waitstatus *ourstatus)
|
|||
/* Record the context of the current thread */
|
||||
th = thread_rec (current_event.dwThreadId, -1);
|
||||
|
||||
last_sig = 0;
|
||||
|
||||
switch (code)
|
||||
{
|
||||
case EXCEPTION_ACCESS_VIOLATION:
|
||||
|
@ -800,13 +799,14 @@ child_continue (DWORD continue_status, int id)
|
|||
static int
|
||||
get_child_debug_event (int pid ATTRIBUTE_UNUSED, struct target_waitstatus *ourstatus)
|
||||
{
|
||||
int breakout = 0;
|
||||
BOOL debug_event;
|
||||
DWORD continue_status, event_code;
|
||||
thread_info *th = NULL;
|
||||
static thread_info dummy_thread_info;
|
||||
int retval = 0;
|
||||
|
||||
last_sig = 0;
|
||||
|
||||
if (!(debug_event = WaitForDebugEvent (¤t_event, 1000)))
|
||||
goto out;
|
||||
|
||||
|
@ -848,13 +848,15 @@ get_child_debug_event (int pid ATTRIBUTE_UNUSED, struct target_waitstatus *ourst
|
|||
"CREATE_PROCESS_DEBUG_EVENT"));
|
||||
current_process_handle = current_event.u.CreateProcessInfo.hProcess;
|
||||
|
||||
main_thread_id = inferior_pid = current_event.dwThreadId;
|
||||
main_thread_id = current_event.dwThreadId;
|
||||
/* Add the main thread */
|
||||
#if 0
|
||||
th = child_add_thread (current_event.dwProcessId,
|
||||
current_event.u.CreateProcessInfo.hProcess);
|
||||
th = child_add_thread (inferior_pid,
|
||||
#endif
|
||||
th = child_add_thread (main_thread_id,
|
||||
current_event.u.CreateProcessInfo.hThread);
|
||||
retval = ourstatus->value.related_pid = current_event.dwProcessId;
|
||||
retval = ourstatus->value.related_pid = current_event.dwThreadId;
|
||||
break;
|
||||
|
||||
case EXIT_PROCESS_DEBUG_EVENT:
|
||||
|
@ -865,7 +867,7 @@ get_child_debug_event (int pid ATTRIBUTE_UNUSED, struct target_waitstatus *ourst
|
|||
ourstatus->kind = TARGET_WAITKIND_EXITED;
|
||||
ourstatus->value.integer = current_event.u.ExitProcess.dwExitCode;
|
||||
CloseHandle (current_process_handle);
|
||||
retval = current_event.dwProcessId;
|
||||
retval = main_thread_id;
|
||||
break;
|
||||
|
||||
case LOAD_DLL_DEBUG_EVENT:
|
||||
|
@ -877,7 +879,7 @@ get_child_debug_event (int pid ATTRIBUTE_UNUSED, struct target_waitstatus *ourst
|
|||
registers_changed (); /* mark all regs invalid */
|
||||
ourstatus->kind = TARGET_WAITKIND_LOADED;
|
||||
ourstatus->value.integer = 0;
|
||||
retval = current_event.dwProcessId;
|
||||
retval = main_thread_id;
|
||||
break;
|
||||
|
||||
case UNLOAD_DLL_DEBUG_EVENT:
|
||||
|
@ -902,8 +904,9 @@ get_child_debug_event (int pid ATTRIBUTE_UNUSED, struct target_waitstatus *ourst
|
|||
(unsigned) current_event.dwThreadId,
|
||||
"OUTPUT_DEBUG_STRING_EVENT"));
|
||||
if (handle_output_debug_string ( ourstatus))
|
||||
retval = current_event.dwProcessId;
|
||||
retval = main_thread_id;
|
||||
break;
|
||||
|
||||
default:
|
||||
printf_unfiltered ("gdb: kernel event for pid=%ld tid=%ld\n",
|
||||
(DWORD) current_event.dwProcessId,
|
||||
|
@ -916,7 +919,10 @@ get_child_debug_event (int pid ATTRIBUTE_UNUSED, struct target_waitstatus *ourst
|
|||
if (!retval)
|
||||
CHECK (child_continue (continue_status, -1));
|
||||
else
|
||||
current_thread = th ?: thread_rec (current_event.dwThreadId, TRUE);
|
||||
{
|
||||
current_thread = th ?: thread_rec (current_event.dwThreadId, TRUE);
|
||||
inferior_pid = retval;
|
||||
}
|
||||
|
||||
out:
|
||||
return retval;
|
||||
|
@ -950,44 +956,70 @@ child_wait (int pid, struct target_waitstatus *ourstatus)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
do_initial_child_stuff (DWORD pid)
|
||||
{
|
||||
extern int stop_after_trap;
|
||||
|
||||
last_sig = 0;
|
||||
event_count = 0;
|
||||
exception_count = 0;
|
||||
current_event.dwProcessId = pid;
|
||||
memset (¤t_event, 0, sizeof (current_event));
|
||||
push_target (&child_ops);
|
||||
child_init_thread_list ();
|
||||
child_clear_solibs ();
|
||||
clear_proceed_status ();
|
||||
init_wait_for_inferior ();
|
||||
|
||||
target_terminal_init ();
|
||||
target_terminal_inferior ();
|
||||
|
||||
while (1)
|
||||
{
|
||||
stop_after_trap = 1;
|
||||
wait_for_inferior ();
|
||||
if (stop_signal != TARGET_SIGNAL_TRAP)
|
||||
resume (0, stop_signal);
|
||||
else
|
||||
break;
|
||||
}
|
||||
stop_after_trap = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Attach to process PID, then initialize for debugging it. */
|
||||
|
||||
static void
|
||||
child_attach (char *args, int from_tty)
|
||||
{
|
||||
BOOL ok;
|
||||
DWORD pid = strtoul (args, 0, 0);
|
||||
|
||||
if (!args)
|
||||
error_no_arg ("process-id to attach");
|
||||
|
||||
current_event.dwProcessId = strtoul (args, 0, 0);
|
||||
|
||||
ok = DebugActiveProcess (current_event.dwProcessId);
|
||||
ok = DebugActiveProcess (pid);
|
||||
|
||||
if (!ok)
|
||||
error ("Can't attach to process.");
|
||||
|
||||
exception_count = 0;
|
||||
event_count = 0;
|
||||
|
||||
child_init_thread_list ();
|
||||
child_clear_solibs ();
|
||||
|
||||
if (from_tty)
|
||||
{
|
||||
char *exec_file = (char *) get_exec_file (0);
|
||||
|
||||
if (exec_file)
|
||||
printf_unfiltered ("Attaching to program `%s', %s\n", exec_file,
|
||||
target_pid_to_str (current_event.dwProcessId));
|
||||
target_pid_to_str (pid));
|
||||
else
|
||||
printf_unfiltered ("Attaching to %s\n",
|
||||
target_pid_to_str (current_event.dwProcessId));
|
||||
target_pid_to_str (pid));
|
||||
|
||||
gdb_flush (gdb_stdout);
|
||||
}
|
||||
|
||||
push_target (&child_ops);
|
||||
do_initial_child_stuff (pid);
|
||||
target_terminal_ours ();
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1037,11 +1069,9 @@ child_create_inferior (char *exec_file, char *allargs, char **env)
|
|||
int i;
|
||||
STARTUPINFO si;
|
||||
PROCESS_INFORMATION pi;
|
||||
struct target_waitstatus dummy;
|
||||
BOOL ret;
|
||||
DWORD flags;
|
||||
char *args;
|
||||
extern int stop_after_trap;
|
||||
|
||||
if (!exec_file)
|
||||
error ("No executable specified, use `target exec'.\n");
|
||||
|
@ -1152,32 +1182,7 @@ child_create_inferior (char *exec_file, char *allargs, char **env)
|
|||
if (!ret)
|
||||
error ("Error creating process %s, (error %d)\n", exec_file, GetLastError ());
|
||||
|
||||
exception_count = 0;
|
||||
event_count = 0;
|
||||
|
||||
current_process_handle = pi.hProcess;
|
||||
current_event.dwProcessId = pi.dwProcessId;
|
||||
memset (¤t_event, 0, sizeof (current_event));
|
||||
inferior_pid = current_event.dwThreadId = pi.dwThreadId;
|
||||
push_target (&child_ops);
|
||||
child_init_thread_list ();
|
||||
child_clear_solibs ();
|
||||
clear_proceed_status ();
|
||||
init_wait_for_inferior ();
|
||||
target_terminal_init ();
|
||||
target_terminal_inferior ();
|
||||
last_sig = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
stop_after_trap = 1;
|
||||
wait_for_inferior ();
|
||||
if (stop_signal != TARGET_SIGNAL_TRAP)
|
||||
resume (0, stop_signal);
|
||||
else
|
||||
break;
|
||||
}
|
||||
stop_after_trap = 0;
|
||||
do_initial_child_stuff (pi.dwProcessId);
|
||||
|
||||
/* child_continue (DBG_CONTINUE, -1);*/
|
||||
proceed ((CORE_ADDR) - 1, TARGET_SIGNAL_0, 0);
|
||||
|
@ -1296,7 +1301,7 @@ child_can_run (void)
|
|||
}
|
||||
|
||||
static void
|
||||
child_close (void)
|
||||
child_close (int x ATTRIBUTE_UNUSED)
|
||||
{
|
||||
DEBUG_EVENTS (("gdb: child_close, inferior_pid=%d\n", inferior_pid));
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue