This fixes constantly replaying the exception if we have a segfault
while a debugger is already attached, e.g. stracing a segv, see:

https://cygwin.com/pipermail/cygwin/2025-May/258144.html

(I'm tempted to remove the 'debugging' static from exception::handle()
and everything associated with it, since replaying the exception the
next half a million times it's hit seems really weird)

(This would seem to make try_to_debug() less useful, as it then does
nothing if you're just run under gdb, but it's what the code used to
do...)

Fixes: 91457377d6c9 ("Cygwin: Make 'ulimit -c' control writing a coredump")
---
 winsup/cygwin/exceptions.cc | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc
index 9763a1b04..3a0315fd0 100644
--- a/winsup/cygwin/exceptions.cc
+++ b/winsup/cygwin/exceptions.cc
@@ -591,13 +591,16 @@ int exec_prepared_command (PWCHAR command)
 extern "C" int
 try_to_debug ()
 {
+  if (!debugger_command)
+    return 0;
+
   /* If already being debugged, break into the debugger (Note that this 
function
      can be called from places other than an exception) */
   if (being_debugged ())
     {
       extern void break_here ();
       break_here ();
-      return 1;
+      return 0;
     }
 
   /* Otherwise, invoke the JIT debugger, if set */
@@ -812,6 +815,8 @@ exception::handle (EXCEPTION_RECORD *e, exception_list 
*frame, CONTEXT *in,
   else if (try_to_debug ())
     {
       debugging = 1;
+      /* If a JIT debugger just attached, replay the exception for the benefit
+        of that */
       return ExceptionContinueExecution;
     }
 
-- 
2.45.1

Reply via email to