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>
|
2020-04-16 Tom de Vries <tdevries@suse.de>
|
||||||
|
|
||||||
PR symtab/25791
|
PR symtab/25791
|
||||||
|
@ -184,26 +184,8 @@ handle_exception (struct target_waitstatus *ourstatus, bool debug_exceptions)
|
|||||||
case EXCEPTION_ACCESS_VIOLATION:
|
case EXCEPTION_ACCESS_VIOLATION:
|
||||||
DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ACCESS_VIOLATION");
|
DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ACCESS_VIOLATION");
|
||||||
ourstatus->value.sig = GDB_SIGNAL_SEGV;
|
ourstatus->value.sig = GDB_SIGNAL_SEGV;
|
||||||
#ifdef __CYGWIN__
|
if (handle_access_violation (rec))
|
||||||
{
|
return HANDLE_EXCEPTION_UNHANDLED;
|
||||||
/* 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
|
|
||||||
break;
|
break;
|
||||||
case STATUS_STACK_OVERFLOW:
|
case STATUS_STACK_OVERFLOW:
|
||||||
DEBUG_EXCEPTION_SIMPLE ("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);
|
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 */
|
/* Currently executing process */
|
||||||
extern HANDLE current_process_handle;
|
extern HANDLE current_process_handle;
|
||||||
|
@ -1230,6 +1230,31 @@ windows_nat::handle_ms_vc_exception (const EXCEPTION_RECORD *rec)
|
|||||||
return false;
|
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
|
/* Resume thread specified by ID, or all artificially suspended
|
||||||
threads, if we are continuing execution. KILLED non-zero means we
|
threads, if we are continuing execution. KILLED non-zero means we
|
||||||
have killed the inferior, so we should ignore weird errors due to
|
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>
|
2020-04-15 Simon Marchi <simon.marchi@polymtl.ca>
|
||||||
|
|
||||||
* win32-low.cc (get_child_debug_event): Fix format string warning.
|
* 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;
|
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
|
/* A helper function that will, if needed, set
|
||||||
'stopped_at_software_breakpoint' on the thread and adjust the
|
'stopped_at_software_breakpoint' on the thread and adjust the
|
||||||
PC. */
|
PC. */
|
||||||
|
Loading…
Reference in New Issue
Block a user