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:
Tom Tromey 2020-04-16 07:24:57 -06:00
parent efba5c2319
commit a010605fef
6 changed files with 55 additions and 20 deletions

View File

@ -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

View File

@ -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");

View File

@ -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;

View File

@ -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

View File

@ -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.

View File

@ -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. */