2002-02-05 Pierre Muller <muller@ics.u-strasbg.fr>
win32-nat.c (last_sig): Changed type of variable to target_signal, to allow easier handling of pass state. (DEBUG_EXCEPTION_SIMPLE): New macro, used in handle_exception, that gives exception name and address. (handle_exception): Use DEBUG_EXCEPTION_SIMPLE macro and set last_sig value to ourstatus->value.sig. Some missing exceptions added. (child_continue): Correctly report continue_status. (get_child_debug_event,do_initial_child_stuff): Set last_sig to TARGET_SIGNAL_0 (new default value). (child_resume): consider sig argument passed to decide if the exception should be passed to debuggee or not.
This commit is contained in:
parent
6b32719e57
commit
7393af7c90
3 changed files with 229 additions and 72 deletions
|
@ -1,3 +1,18 @@
|
||||||
|
2002-02-05 Pierre Muller <muller@ics.u-strasbg.fr>
|
||||||
|
|
||||||
|
win32-nat.c (last_sig): Changed type of variable to target_signal,
|
||||||
|
to allow easier handling of pass state.
|
||||||
|
(DEBUG_EXCEPTION_SIMPLE): New macro, used in handle_exception,
|
||||||
|
that gives exception name and address.
|
||||||
|
(handle_exception): Use DEBUG_EXCEPTION_SIMPLE macro
|
||||||
|
and set last_sig value to ourstatus->value.sig. Some missing
|
||||||
|
exceptions added.
|
||||||
|
(child_continue): Correctly report continue_status.
|
||||||
|
(get_child_debug_event,do_initial_child_stuff): Set last_sig to
|
||||||
|
TARGET_SIGNAL_0 (new default value).
|
||||||
|
(child_resume): consider sig argument passed to decide if
|
||||||
|
the exception should be passed to debuggee or not.
|
||||||
|
|
||||||
2002-02-05 Michael Snyder <msnyder@redhat.com>
|
2002-02-05 Michael Snyder <msnyder@redhat.com>
|
||||||
|
|
||||||
* regcache.c (fetch_register): Call target_fetch_register
|
* regcache.c (fetch_register): Call target_fetch_register
|
||||||
|
|
143
gdb/win32-nat.c
143
gdb/win32-nat.c
|
@ -98,8 +98,9 @@ static void child_stop (void);
|
||||||
static int win32_child_thread_alive (ptid_t);
|
static int win32_child_thread_alive (ptid_t);
|
||||||
void child_kill_inferior (void);
|
void child_kill_inferior (void);
|
||||||
|
|
||||||
static int last_sig = 0; /* Set if a signal was received from the
|
static enum target_signal last_sig = TARGET_SIGNAL_0;
|
||||||
debugged process */
|
/* Set if a signal was received from the debugged process */
|
||||||
|
|
||||||
/* Thread information structure used to track information that is
|
/* Thread information structure used to track information that is
|
||||||
not available in gdb's thread structure. */
|
not available in gdb's thread structure. */
|
||||||
typedef struct thread_info_struct
|
typedef struct thread_info_struct
|
||||||
|
@ -218,6 +219,7 @@ static const struct xlate_exception
|
||||||
{EXCEPTION_BREAKPOINT, TARGET_SIGNAL_TRAP},
|
{EXCEPTION_BREAKPOINT, TARGET_SIGNAL_TRAP},
|
||||||
{DBG_CONTROL_C, TARGET_SIGNAL_INT},
|
{DBG_CONTROL_C, TARGET_SIGNAL_INT},
|
||||||
{EXCEPTION_SINGLE_STEP, TARGET_SIGNAL_TRAP},
|
{EXCEPTION_SINGLE_STEP, TARGET_SIGNAL_TRAP},
|
||||||
|
{STATUS_FLOAT_DIVIDE_BY_ZERO, TARGET_SIGNAL_FPE},
|
||||||
{-1, -1}};
|
{-1, -1}};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -823,6 +825,10 @@ handle_output_debug_string (struct target_waitstatus *ourstatus)
|
||||||
return gotasig;
|
return gotasig;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define DEBUG_EXCEPTION_SIMPLE(x) if (debug_exceptions) \
|
||||||
|
printf ("gdb: Target exception %s at 0x%08lx\n", x, \
|
||||||
|
(DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress)
|
||||||
|
|
||||||
static int
|
static int
|
||||||
handle_exception (struct target_waitstatus *ourstatus)
|
handle_exception (struct target_waitstatus *ourstatus)
|
||||||
{
|
{
|
||||||
|
@ -837,52 +843,80 @@ handle_exception (struct target_waitstatus *ourstatus)
|
||||||
switch (code)
|
switch (code)
|
||||||
{
|
{
|
||||||
case EXCEPTION_ACCESS_VIOLATION:
|
case EXCEPTION_ACCESS_VIOLATION:
|
||||||
DEBUG_EXCEPT (("gdb: Target exception ACCESS_VIOLATION at 0x%08lx\n",
|
DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ACCESS_VIOLATION");
|
||||||
(DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
|
|
||||||
ourstatus->value.sig = TARGET_SIGNAL_SEGV;
|
ourstatus->value.sig = TARGET_SIGNAL_SEGV;
|
||||||
last_sig = SIGSEGV;
|
|
||||||
break;
|
|
||||||
case STATUS_FLOAT_UNDERFLOW:
|
|
||||||
case STATUS_FLOAT_DIVIDE_BY_ZERO:
|
|
||||||
case STATUS_FLOAT_OVERFLOW:
|
|
||||||
case STATUS_INTEGER_DIVIDE_BY_ZERO:
|
|
||||||
DEBUG_EXCEPT (("gdb: Target exception STACK_OVERFLOW at 0x%08lx\n",
|
|
||||||
(DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
|
|
||||||
ourstatus->value.sig = TARGET_SIGNAL_FPE;
|
|
||||||
last_sig = SIGFPE;
|
|
||||||
break;
|
break;
|
||||||
case STATUS_STACK_OVERFLOW:
|
case STATUS_STACK_OVERFLOW:
|
||||||
DEBUG_EXCEPT (("gdb: Target exception STACK_OVERFLOW at 0x%08lx\n",
|
DEBUG_EXCEPTION_SIMPLE ("STATUS_STACK_OVERFLOW");
|
||||||
(DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
|
|
||||||
ourstatus->value.sig = TARGET_SIGNAL_SEGV;
|
ourstatus->value.sig = TARGET_SIGNAL_SEGV;
|
||||||
break;
|
break;
|
||||||
|
case STATUS_FLOAT_DENORMAL_OPERAND:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DENORMAL_OPERAND");
|
||||||
|
ourstatus->value.sig = TARGET_SIGNAL_FPE;
|
||||||
|
break;
|
||||||
|
case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ARRAY_BOUNDS_EXCEEDED");
|
||||||
|
ourstatus->value.sig = TARGET_SIGNAL_FPE;
|
||||||
|
break;
|
||||||
|
case STATUS_FLOAT_INEXACT_RESULT:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INEXACT_RESULT");
|
||||||
|
ourstatus->value.sig = TARGET_SIGNAL_FPE;
|
||||||
|
break;
|
||||||
|
case STATUS_FLOAT_INVALID_OPERATION:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INVALID_OPERATION");
|
||||||
|
ourstatus->value.sig = TARGET_SIGNAL_FPE;
|
||||||
|
break;
|
||||||
|
case STATUS_FLOAT_OVERFLOW:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_OVERFLOW");
|
||||||
|
ourstatus->value.sig = TARGET_SIGNAL_FPE;
|
||||||
|
break;
|
||||||
|
case STATUS_FLOAT_STACK_CHECK:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_STACK_CHECK");
|
||||||
|
ourstatus->value.sig = TARGET_SIGNAL_FPE;
|
||||||
|
break;
|
||||||
|
case STATUS_FLOAT_UNDERFLOW:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_UNDERFLOW");
|
||||||
|
ourstatus->value.sig = TARGET_SIGNAL_FPE;
|
||||||
|
break;
|
||||||
|
case STATUS_FLOAT_DIVIDE_BY_ZERO:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DIVIDE_BY_ZERO");
|
||||||
|
ourstatus->value.sig = TARGET_SIGNAL_FPE;
|
||||||
|
break;
|
||||||
|
case STATUS_INTEGER_DIVIDE_BY_ZERO:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_DIVIDE_BY_ZERO");
|
||||||
|
ourstatus->value.sig = TARGET_SIGNAL_FPE;
|
||||||
|
break;
|
||||||
|
case STATUS_INTEGER_OVERFLOW:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_OVERFLOW");
|
||||||
|
ourstatus->value.sig = TARGET_SIGNAL_FPE;
|
||||||
|
break;
|
||||||
case EXCEPTION_BREAKPOINT:
|
case EXCEPTION_BREAKPOINT:
|
||||||
DEBUG_EXCEPT (("gdb: Target exception BREAKPOINT at 0x%08lx\n",
|
DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_BREAKPOINT");
|
||||||
(DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
|
|
||||||
ourstatus->value.sig = TARGET_SIGNAL_TRAP;
|
ourstatus->value.sig = TARGET_SIGNAL_TRAP;
|
||||||
break;
|
break;
|
||||||
case DBG_CONTROL_C:
|
case DBG_CONTROL_C:
|
||||||
DEBUG_EXCEPT (("gdb: Target exception CONTROL_C at 0x%08lx\n",
|
DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_C");
|
||||||
(DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
|
|
||||||
ourstatus->value.sig = TARGET_SIGNAL_INT;
|
ourstatus->value.sig = TARGET_SIGNAL_INT;
|
||||||
last_sig = SIGINT; /* FIXME - should check pass state */
|
|
||||||
break;
|
break;
|
||||||
case DBG_CONTROL_BREAK:
|
case DBG_CONTROL_BREAK:
|
||||||
DEBUG_EXCEPT (("gdb: Target exception CONTROL_BREAK at 0x%08lx\n",
|
DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_BREAK");
|
||||||
(DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
|
|
||||||
ourstatus->value.sig = TARGET_SIGNAL_INT;
|
ourstatus->value.sig = TARGET_SIGNAL_INT;
|
||||||
last_sig = SIGINT; /* FIXME - should check pass state */
|
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_SINGLE_STEP:
|
case EXCEPTION_SINGLE_STEP:
|
||||||
DEBUG_EXCEPT (("gdb: Target exception SINGLE_STEP at 0x%08lx\n",
|
DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_SINGLE_STEP");
|
||||||
(DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
|
|
||||||
ourstatus->value.sig = TARGET_SIGNAL_TRAP;
|
ourstatus->value.sig = TARGET_SIGNAL_TRAP;
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_ILLEGAL_INSTRUCTION:
|
case EXCEPTION_ILLEGAL_INSTRUCTION:
|
||||||
DEBUG_EXCEPT (("gdb: Target exception SINGLE_ILL at 0x%08lx\n",
|
DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ILLEGAL_INSTRUCTION");
|
||||||
(DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
|
ourstatus->value.sig = TARGET_SIGNAL_ILL;
|
||||||
|
break;
|
||||||
|
case EXCEPTION_PRIV_INSTRUCTION:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_PRIV_INSTRUCTION");
|
||||||
|
ourstatus->value.sig = TARGET_SIGNAL_ILL;
|
||||||
|
break;
|
||||||
|
case EXCEPTION_NONCONTINUABLE_EXCEPTION:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_NONCONTINUABLE_EXCEPTION");
|
||||||
ourstatus->value.sig = TARGET_SIGNAL_ILL;
|
ourstatus->value.sig = TARGET_SIGNAL_ILL;
|
||||||
last_sig = SIGILL;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (current_event.u.Exception.dwFirstChance)
|
if (current_event.u.Exception.dwFirstChance)
|
||||||
|
@ -894,6 +928,7 @@ handle_exception (struct target_waitstatus *ourstatus)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
exception_count++;
|
exception_count++;
|
||||||
|
last_sig = ourstatus->value.sig;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -906,8 +941,10 @@ child_continue (DWORD continue_status, int id)
|
||||||
thread_info *th;
|
thread_info *th;
|
||||||
BOOL res;
|
BOOL res;
|
||||||
|
|
||||||
DEBUG_EVENTS (("ContinueDebugEvent (cpid=%ld, ctid=%ld, DBG_CONTINUE);\n",
|
DEBUG_EVENTS (("ContinueDebugEvent (cpid=%ld, ctid=%ld, %s);\n",
|
||||||
current_event.dwProcessId, current_event.dwThreadId));
|
current_event.dwProcessId, current_event.dwThreadId,
|
||||||
|
continue_status == DBG_CONTINUE ?
|
||||||
|
"DBG_CONTINUE" : "DBG_EXCEPTION_NOT_HANDLED"));
|
||||||
res = ContinueDebugEvent (current_event.dwProcessId,
|
res = ContinueDebugEvent (current_event.dwProcessId,
|
||||||
current_event.dwThreadId,
|
current_event.dwThreadId,
|
||||||
continue_status);
|
continue_status);
|
||||||
|
@ -952,7 +989,7 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus)
|
||||||
static thread_info dummy_thread_info;
|
static thread_info dummy_thread_info;
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
|
|
||||||
last_sig = 0;
|
last_sig = TARGET_SIGNAL_0;
|
||||||
|
|
||||||
if (!(debug_event = WaitForDebugEvent (¤t_event, 1000)))
|
if (!(debug_event = WaitForDebugEvent (¤t_event, 1000)))
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -1118,7 +1155,7 @@ do_initial_child_stuff (DWORD pid)
|
||||||
extern int stop_after_trap;
|
extern int stop_after_trap;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
last_sig = 0;
|
last_sig = TARGET_SIGNAL_0;
|
||||||
event_count = 0;
|
event_count = 0;
|
||||||
exception_count = 0;
|
exception_count = 0;
|
||||||
debug_registers_changed = 0;
|
debug_registers_changed = 0;
|
||||||
|
@ -1470,11 +1507,45 @@ void
|
||||||
child_resume (ptid_t ptid, int step, enum target_signal sig)
|
child_resume (ptid_t ptid, int step, enum target_signal sig)
|
||||||
{
|
{
|
||||||
thread_info *th;
|
thread_info *th;
|
||||||
DWORD continue_status = last_sig > 0 && last_sig < NSIG ?
|
DWORD continue_status = DBG_CONTINUE;
|
||||||
DBG_EXCEPTION_NOT_HANDLED : DBG_CONTINUE;
|
|
||||||
int pid = PIDGET (ptid);
|
int pid = PIDGET (ptid);
|
||||||
|
|
||||||
last_sig = 0;
|
if (sig != TARGET_SIGNAL_0)
|
||||||
|
{
|
||||||
|
if (current_event.dwDebugEventCode != EXCEPTION_DEBUG_EVENT)
|
||||||
|
{
|
||||||
|
DEBUG_EXCEPT(("Cannot continue with signal %d here.\n",sig));
|
||||||
|
}
|
||||||
|
else if (sig == last_sig)
|
||||||
|
continue_status = DBG_EXCEPTION_NOT_HANDLED;
|
||||||
|
else
|
||||||
|
#if 0
|
||||||
|
/* This code does not seem to work, because
|
||||||
|
the kernel does probably not consider changes in the ExceptionRecord
|
||||||
|
structure when passing the exception to the inferior.
|
||||||
|
Note that this seems possible in the exception handler itself. */
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; xlate[i].them != -1; i++)
|
||||||
|
if (xlate[i].us == sig)
|
||||||
|
{
|
||||||
|
current_event.u.Exception.ExceptionRecord.ExceptionCode =
|
||||||
|
xlate[i].them;
|
||||||
|
continue_status = DBG_EXCEPTION_NOT_HANDLED;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (continue_status == DBG_CONTINUE)
|
||||||
|
{
|
||||||
|
DEBUG_EXCEPT(("Cannot continue with signal %d.\n",sig));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
DEBUG_EXCEPT(("Can only continue with recieved signal %d.\n",
|
||||||
|
last_sig));
|
||||||
|
}
|
||||||
|
|
||||||
|
last_sig = TARGET_SIGNAL_0;
|
||||||
|
|
||||||
DEBUG_EXEC (("gdb: child_resume (pid=%d, step=%d, sig=%d);\n",
|
DEBUG_EXEC (("gdb: child_resume (pid=%d, step=%d, sig=%d);\n",
|
||||||
pid, step, sig));
|
pid, step, sig));
|
||||||
|
|
|
@ -98,8 +98,9 @@ static void child_stop (void);
|
||||||
static int win32_child_thread_alive (ptid_t);
|
static int win32_child_thread_alive (ptid_t);
|
||||||
void child_kill_inferior (void);
|
void child_kill_inferior (void);
|
||||||
|
|
||||||
static int last_sig = 0; /* Set if a signal was received from the
|
static enum target_signal last_sig = TARGET_SIGNAL_0;
|
||||||
debugged process */
|
/* Set if a signal was received from the debugged process */
|
||||||
|
|
||||||
/* Thread information structure used to track information that is
|
/* Thread information structure used to track information that is
|
||||||
not available in gdb's thread structure. */
|
not available in gdb's thread structure. */
|
||||||
typedef struct thread_info_struct
|
typedef struct thread_info_struct
|
||||||
|
@ -218,6 +219,7 @@ static const struct xlate_exception
|
||||||
{EXCEPTION_BREAKPOINT, TARGET_SIGNAL_TRAP},
|
{EXCEPTION_BREAKPOINT, TARGET_SIGNAL_TRAP},
|
||||||
{DBG_CONTROL_C, TARGET_SIGNAL_INT},
|
{DBG_CONTROL_C, TARGET_SIGNAL_INT},
|
||||||
{EXCEPTION_SINGLE_STEP, TARGET_SIGNAL_TRAP},
|
{EXCEPTION_SINGLE_STEP, TARGET_SIGNAL_TRAP},
|
||||||
|
{STATUS_FLOAT_DIVIDE_BY_ZERO, TARGET_SIGNAL_FPE},
|
||||||
{-1, -1}};
|
{-1, -1}};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -823,6 +825,10 @@ handle_output_debug_string (struct target_waitstatus *ourstatus)
|
||||||
return gotasig;
|
return gotasig;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define DEBUG_EXCEPTION_SIMPLE(x) if (debug_exceptions) \
|
||||||
|
printf ("gdb: Target exception %s at 0x%08lx\n", x, \
|
||||||
|
(DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress)
|
||||||
|
|
||||||
static int
|
static int
|
||||||
handle_exception (struct target_waitstatus *ourstatus)
|
handle_exception (struct target_waitstatus *ourstatus)
|
||||||
{
|
{
|
||||||
|
@ -837,52 +843,80 @@ handle_exception (struct target_waitstatus *ourstatus)
|
||||||
switch (code)
|
switch (code)
|
||||||
{
|
{
|
||||||
case EXCEPTION_ACCESS_VIOLATION:
|
case EXCEPTION_ACCESS_VIOLATION:
|
||||||
DEBUG_EXCEPT (("gdb: Target exception ACCESS_VIOLATION at 0x%08lx\n",
|
DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ACCESS_VIOLATION");
|
||||||
(DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
|
|
||||||
ourstatus->value.sig = TARGET_SIGNAL_SEGV;
|
ourstatus->value.sig = TARGET_SIGNAL_SEGV;
|
||||||
last_sig = SIGSEGV;
|
|
||||||
break;
|
|
||||||
case STATUS_FLOAT_UNDERFLOW:
|
|
||||||
case STATUS_FLOAT_DIVIDE_BY_ZERO:
|
|
||||||
case STATUS_FLOAT_OVERFLOW:
|
|
||||||
case STATUS_INTEGER_DIVIDE_BY_ZERO:
|
|
||||||
DEBUG_EXCEPT (("gdb: Target exception STACK_OVERFLOW at 0x%08lx\n",
|
|
||||||
(DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
|
|
||||||
ourstatus->value.sig = TARGET_SIGNAL_FPE;
|
|
||||||
last_sig = SIGFPE;
|
|
||||||
break;
|
break;
|
||||||
case STATUS_STACK_OVERFLOW:
|
case STATUS_STACK_OVERFLOW:
|
||||||
DEBUG_EXCEPT (("gdb: Target exception STACK_OVERFLOW at 0x%08lx\n",
|
DEBUG_EXCEPTION_SIMPLE ("STATUS_STACK_OVERFLOW");
|
||||||
(DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
|
|
||||||
ourstatus->value.sig = TARGET_SIGNAL_SEGV;
|
ourstatus->value.sig = TARGET_SIGNAL_SEGV;
|
||||||
break;
|
break;
|
||||||
|
case STATUS_FLOAT_DENORMAL_OPERAND:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DENORMAL_OPERAND");
|
||||||
|
ourstatus->value.sig = TARGET_SIGNAL_FPE;
|
||||||
|
break;
|
||||||
|
case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ARRAY_BOUNDS_EXCEEDED");
|
||||||
|
ourstatus->value.sig = TARGET_SIGNAL_FPE;
|
||||||
|
break;
|
||||||
|
case STATUS_FLOAT_INEXACT_RESULT:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INEXACT_RESULT");
|
||||||
|
ourstatus->value.sig = TARGET_SIGNAL_FPE;
|
||||||
|
break;
|
||||||
|
case STATUS_FLOAT_INVALID_OPERATION:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INVALID_OPERATION");
|
||||||
|
ourstatus->value.sig = TARGET_SIGNAL_FPE;
|
||||||
|
break;
|
||||||
|
case STATUS_FLOAT_OVERFLOW:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_OVERFLOW");
|
||||||
|
ourstatus->value.sig = TARGET_SIGNAL_FPE;
|
||||||
|
break;
|
||||||
|
case STATUS_FLOAT_STACK_CHECK:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_STACK_CHECK");
|
||||||
|
ourstatus->value.sig = TARGET_SIGNAL_FPE;
|
||||||
|
break;
|
||||||
|
case STATUS_FLOAT_UNDERFLOW:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_UNDERFLOW");
|
||||||
|
ourstatus->value.sig = TARGET_SIGNAL_FPE;
|
||||||
|
break;
|
||||||
|
case STATUS_FLOAT_DIVIDE_BY_ZERO:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DIVIDE_BY_ZERO");
|
||||||
|
ourstatus->value.sig = TARGET_SIGNAL_FPE;
|
||||||
|
break;
|
||||||
|
case STATUS_INTEGER_DIVIDE_BY_ZERO:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_DIVIDE_BY_ZERO");
|
||||||
|
ourstatus->value.sig = TARGET_SIGNAL_FPE;
|
||||||
|
break;
|
||||||
|
case STATUS_INTEGER_OVERFLOW:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_OVERFLOW");
|
||||||
|
ourstatus->value.sig = TARGET_SIGNAL_FPE;
|
||||||
|
break;
|
||||||
case EXCEPTION_BREAKPOINT:
|
case EXCEPTION_BREAKPOINT:
|
||||||
DEBUG_EXCEPT (("gdb: Target exception BREAKPOINT at 0x%08lx\n",
|
DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_BREAKPOINT");
|
||||||
(DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
|
|
||||||
ourstatus->value.sig = TARGET_SIGNAL_TRAP;
|
ourstatus->value.sig = TARGET_SIGNAL_TRAP;
|
||||||
break;
|
break;
|
||||||
case DBG_CONTROL_C:
|
case DBG_CONTROL_C:
|
||||||
DEBUG_EXCEPT (("gdb: Target exception CONTROL_C at 0x%08lx\n",
|
DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_C");
|
||||||
(DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
|
|
||||||
ourstatus->value.sig = TARGET_SIGNAL_INT;
|
ourstatus->value.sig = TARGET_SIGNAL_INT;
|
||||||
last_sig = SIGINT; /* FIXME - should check pass state */
|
|
||||||
break;
|
break;
|
||||||
case DBG_CONTROL_BREAK:
|
case DBG_CONTROL_BREAK:
|
||||||
DEBUG_EXCEPT (("gdb: Target exception CONTROL_BREAK at 0x%08lx\n",
|
DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_BREAK");
|
||||||
(DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
|
|
||||||
ourstatus->value.sig = TARGET_SIGNAL_INT;
|
ourstatus->value.sig = TARGET_SIGNAL_INT;
|
||||||
last_sig = SIGINT; /* FIXME - should check pass state */
|
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_SINGLE_STEP:
|
case EXCEPTION_SINGLE_STEP:
|
||||||
DEBUG_EXCEPT (("gdb: Target exception SINGLE_STEP at 0x%08lx\n",
|
DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_SINGLE_STEP");
|
||||||
(DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
|
|
||||||
ourstatus->value.sig = TARGET_SIGNAL_TRAP;
|
ourstatus->value.sig = TARGET_SIGNAL_TRAP;
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_ILLEGAL_INSTRUCTION:
|
case EXCEPTION_ILLEGAL_INSTRUCTION:
|
||||||
DEBUG_EXCEPT (("gdb: Target exception SINGLE_ILL at 0x%08lx\n",
|
DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ILLEGAL_INSTRUCTION");
|
||||||
(DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
|
ourstatus->value.sig = TARGET_SIGNAL_ILL;
|
||||||
|
break;
|
||||||
|
case EXCEPTION_PRIV_INSTRUCTION:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_PRIV_INSTRUCTION");
|
||||||
|
ourstatus->value.sig = TARGET_SIGNAL_ILL;
|
||||||
|
break;
|
||||||
|
case EXCEPTION_NONCONTINUABLE_EXCEPTION:
|
||||||
|
DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_NONCONTINUABLE_EXCEPTION");
|
||||||
ourstatus->value.sig = TARGET_SIGNAL_ILL;
|
ourstatus->value.sig = TARGET_SIGNAL_ILL;
|
||||||
last_sig = SIGILL;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (current_event.u.Exception.dwFirstChance)
|
if (current_event.u.Exception.dwFirstChance)
|
||||||
|
@ -894,6 +928,7 @@ handle_exception (struct target_waitstatus *ourstatus)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
exception_count++;
|
exception_count++;
|
||||||
|
last_sig = ourstatus->value.sig;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -906,8 +941,10 @@ child_continue (DWORD continue_status, int id)
|
||||||
thread_info *th;
|
thread_info *th;
|
||||||
BOOL res;
|
BOOL res;
|
||||||
|
|
||||||
DEBUG_EVENTS (("ContinueDebugEvent (cpid=%ld, ctid=%ld, DBG_CONTINUE);\n",
|
DEBUG_EVENTS (("ContinueDebugEvent (cpid=%ld, ctid=%ld, %s);\n",
|
||||||
current_event.dwProcessId, current_event.dwThreadId));
|
current_event.dwProcessId, current_event.dwThreadId,
|
||||||
|
continue_status == DBG_CONTINUE ?
|
||||||
|
"DBG_CONTINUE" : "DBG_EXCEPTION_NOT_HANDLED"));
|
||||||
res = ContinueDebugEvent (current_event.dwProcessId,
|
res = ContinueDebugEvent (current_event.dwProcessId,
|
||||||
current_event.dwThreadId,
|
current_event.dwThreadId,
|
||||||
continue_status);
|
continue_status);
|
||||||
|
@ -952,7 +989,7 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus)
|
||||||
static thread_info dummy_thread_info;
|
static thread_info dummy_thread_info;
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
|
|
||||||
last_sig = 0;
|
last_sig = TARGET_SIGNAL_0;
|
||||||
|
|
||||||
if (!(debug_event = WaitForDebugEvent (¤t_event, 1000)))
|
if (!(debug_event = WaitForDebugEvent (¤t_event, 1000)))
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -1118,7 +1155,7 @@ do_initial_child_stuff (DWORD pid)
|
||||||
extern int stop_after_trap;
|
extern int stop_after_trap;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
last_sig = 0;
|
last_sig = TARGET_SIGNAL_0;
|
||||||
event_count = 0;
|
event_count = 0;
|
||||||
exception_count = 0;
|
exception_count = 0;
|
||||||
debug_registers_changed = 0;
|
debug_registers_changed = 0;
|
||||||
|
@ -1470,11 +1507,45 @@ void
|
||||||
child_resume (ptid_t ptid, int step, enum target_signal sig)
|
child_resume (ptid_t ptid, int step, enum target_signal sig)
|
||||||
{
|
{
|
||||||
thread_info *th;
|
thread_info *th;
|
||||||
DWORD continue_status = last_sig > 0 && last_sig < NSIG ?
|
DWORD continue_status = DBG_CONTINUE;
|
||||||
DBG_EXCEPTION_NOT_HANDLED : DBG_CONTINUE;
|
|
||||||
int pid = PIDGET (ptid);
|
int pid = PIDGET (ptid);
|
||||||
|
|
||||||
last_sig = 0;
|
if (sig != TARGET_SIGNAL_0)
|
||||||
|
{
|
||||||
|
if (current_event.dwDebugEventCode != EXCEPTION_DEBUG_EVENT)
|
||||||
|
{
|
||||||
|
DEBUG_EXCEPT(("Cannot continue with signal %d here.\n",sig));
|
||||||
|
}
|
||||||
|
else if (sig == last_sig)
|
||||||
|
continue_status = DBG_EXCEPTION_NOT_HANDLED;
|
||||||
|
else
|
||||||
|
#if 0
|
||||||
|
/* This code does not seem to work, because
|
||||||
|
the kernel does probably not consider changes in the ExceptionRecord
|
||||||
|
structure when passing the exception to the inferior.
|
||||||
|
Note that this seems possible in the exception handler itself. */
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; xlate[i].them != -1; i++)
|
||||||
|
if (xlate[i].us == sig)
|
||||||
|
{
|
||||||
|
current_event.u.Exception.ExceptionRecord.ExceptionCode =
|
||||||
|
xlate[i].them;
|
||||||
|
continue_status = DBG_EXCEPTION_NOT_HANDLED;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (continue_status == DBG_CONTINUE)
|
||||||
|
{
|
||||||
|
DEBUG_EXCEPT(("Cannot continue with signal %d.\n",sig));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
DEBUG_EXCEPT(("Can only continue with recieved signal %d.\n",
|
||||||
|
last_sig));
|
||||||
|
}
|
||||||
|
|
||||||
|
last_sig = TARGET_SIGNAL_0;
|
||||||
|
|
||||||
DEBUG_EXEC (("gdb: child_resume (pid=%d, step=%d, sig=%d);\n",
|
DEBUG_EXEC (("gdb: child_resume (pid=%d, step=%d, sig=%d);\n",
|
||||||
pid, step, sig));
|
pid, step, sig));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue