Fix Cygwin gdb build
Simon pointed out that the windows-nat sharing series broke the Cygwin build. This patch fixes the problem, by moving the Cygwin-specific code to a new handler function. This approach is taken because this code calls find_pc_partial_function, which isn't available in gdbserver. gdb/ChangeLog 2020-04-16 Tom Tromey <tromey@adacore.com> * windows-nat.c (windows_nat::handle_access_violation): New function. * nat/windows-nat.h (handle_access_violation): Declare. * nat/windows-nat.c (handle_exception): Move Cygwin code to windows-nat.c. Call handle_access_violation. gdbserver/ChangeLog 2020-04-16 Tom Tromey <tromey@adacore.com> * win32-low.cc (windows_nat::handle_access_violation): New function.
This commit is contained in:
parent
efba5c2319
commit
a010605fef
|
@ -1,3 +1,11 @@
|
|||
2020-04-16 Tom Tromey <tromey@adacore.com>
|
||||
|
||||
* windows-nat.c (windows_nat::handle_access_violation): New
|
||||
function.
|
||||
* nat/windows-nat.h (handle_access_violation): Declare.
|
||||
* nat/windows-nat.c (handle_exception): Move Cygwin code to
|
||||
windows-nat.c. Call handle_access_violation.
|
||||
|
||||
2020-04-16 Tom de Vries <tdevries@suse.de>
|
||||
|
||||
PR symtab/25791
|
||||
|
|
|
@ -184,26 +184,8 @@ handle_exception (struct target_waitstatus *ourstatus, bool debug_exceptions)
|
|||
case EXCEPTION_ACCESS_VIOLATION:
|
||||
DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ACCESS_VIOLATION");
|
||||
ourstatus->value.sig = GDB_SIGNAL_SEGV;
|
||||
#ifdef __CYGWIN__
|
||||
{
|
||||
/* See if the access violation happened within the cygwin DLL
|
||||
itself. Cygwin uses a kind of exception handling to deal
|
||||
with passed-in invalid addresses. gdb should not treat
|
||||
these as real SEGVs since they will be silently handled by
|
||||
cygwin. A real SEGV will (theoretically) be caught by
|
||||
cygwin later in the process and will be sent as a
|
||||
cygwin-specific-signal. So, ignore SEGVs if they show up
|
||||
within the text segment of the DLL itself. */
|
||||
const char *fn;
|
||||
CORE_ADDR addr = (CORE_ADDR) (uintptr_t) rec->ExceptionAddress;
|
||||
|
||||
if ((!cygwin_exceptions && (addr >= cygwin_load_start
|
||||
&& addr < cygwin_load_end))
|
||||
|| (find_pc_partial_function (addr, &fn, NULL, NULL)
|
||||
&& startswith (fn, "KERNEL32!IsBad")))
|
||||
return HANDLE_EXCEPTION_UNHANDLED;
|
||||
}
|
||||
#endif
|
||||
if (handle_access_violation (rec))
|
||||
return HANDLE_EXCEPTION_UNHANDLED;
|
||||
break;
|
||||
case STATUS_STACK_OVERFLOW:
|
||||
DEBUG_EXCEPTION_SIMPLE ("STATUS_STACK_OVERFLOW");
|
||||
|
|
|
@ -157,6 +157,13 @@ extern void handle_unload_dll ();
|
|||
|
||||
extern bool handle_ms_vc_exception (const EXCEPTION_RECORD *rec);
|
||||
|
||||
/* When EXCEPTION_ACCESS_VIOLATION is processed, we give the embedding
|
||||
application a chance to change it to be considered "unhandled".
|
||||
This function must be supplied by the embedding application. If it
|
||||
returns true, then the exception is "unhandled". */
|
||||
|
||||
extern bool handle_access_violation (const EXCEPTION_RECORD *rec);
|
||||
|
||||
|
||||
/* Currently executing process */
|
||||
extern HANDLE current_process_handle;
|
||||
|
|
|
@ -1230,6 +1230,31 @@ windows_nat::handle_ms_vc_exception (const EXCEPTION_RECORD *rec)
|
|||
return false;
|
||||
}
|
||||
|
||||
/* See nat/windows-nat.h. */
|
||||
|
||||
bool
|
||||
windows_nat::handle_access_violation (const EXCEPTION_RECORD *rec)
|
||||
{
|
||||
#ifdef __CYGWIN__
|
||||
/* See if the access violation happened within the cygwin DLL
|
||||
itself. Cygwin uses a kind of exception handling to deal with
|
||||
passed-in invalid addresses. gdb should not treat these as real
|
||||
SEGVs since they will be silently handled by cygwin. A real SEGV
|
||||
will (theoretically) be caught by cygwin later in the process and
|
||||
will be sent as a cygwin-specific-signal. So, ignore SEGVs if
|
||||
they show up within the text segment of the DLL itself. */
|
||||
const char *fn;
|
||||
CORE_ADDR addr = (CORE_ADDR) (uintptr_t) rec->ExceptionAddress;
|
||||
|
||||
if ((!cygwin_exceptions && (addr >= cygwin_load_start
|
||||
&& addr < cygwin_load_end))
|
||||
|| (find_pc_partial_function (addr, &fn, NULL, NULL)
|
||||
&& startswith (fn, "KERNEL32!IsBad")))
|
||||
return true;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Resume thread specified by ID, or all artificially suspended
|
||||
threads, if we are continuing execution. KILLED non-zero means we
|
||||
have killed the inferior, so we should ignore weird errors due to
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2020-04-16 Tom Tromey <tromey@adacore.com>
|
||||
|
||||
* win32-low.cc (windows_nat::handle_access_violation): New
|
||||
function.
|
||||
|
||||
2020-04-15 Simon Marchi <simon.marchi@polymtl.ca>
|
||||
|
||||
* win32-low.cc (get_child_debug_event): Fix format string warning.
|
||||
|
|
|
@ -1198,6 +1198,14 @@ windows_nat::handle_ms_vc_exception (const EXCEPTION_RECORD *rec)
|
|||
return false;
|
||||
}
|
||||
|
||||
/* See nat/windows-nat.h. */
|
||||
|
||||
bool
|
||||
windows_nat::handle_access_violation (const EXCEPTION_RECORD *rec)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* A helper function that will, if needed, set
|
||||
'stopped_at_software_breakpoint' on the thread and adjust the
|
||||
PC. */
|
||||
|
|
Loading…
Reference in New Issue