[binutils-gdb] Adjust gdb.base/exitsignal.exp for Cygwin

Pedro Alves via Gdb-cvs <[email protected]> Mon, 25 May 2026 14:43:13 +0000 (GMT)
Newsgroups gmane.comp.gdb.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=13f28e68cc751e4aac96f0ae700d7a708791006c

commit 13f28e68cc751e4aac96f0ae700d7a708791006c
Author: Pedro Alves <[email protected]>
Date:   Thu May 21 15:33:16 2026 +0100

    Adjust gdb.base/exitsignal.exp for Cygwin
    
    Cygwin has this feature where if the program is about to die with a
    signal, and there's a debugger attached, it raises a SIGTRAP via
    DebugBreak.  So if you try to pass a terminating signal to the
    inferior, you see that SIGTRAP first, before the process exits with
    the signal.  E.g.:
    
     Thread 1 "segfault" received signal SIGSEGV, Segmentation fault.
     0x0000000100401092 in main () at segfault.cc:5
     5         *(volatile int *)0;
     (gdb) c
     Continuing.
     Thread 1 "segfault" received signal SIGTRAP, Trace/breakpoint trap.
     0x00007ffe99d35a13 in KERNELBASE!DebugBreak () from C:/WINDOWS/System32/KERNELBASE.dll
     (gdb) bt
     #0  0x00007ffe99d35a13 in KERNELBASE!DebugBreak () from C:/WINDOWS/System32/KERNELBASE.dll
     #1  0x00007ffe896163b7 in break_here () at /usr/src/debug/cygwin-3.6.9-1/winsup/cygwin/dcrt0.cc:473
     #2  0x00007ffe8962fe13 in try_to_debug () at /usr/src/debug/cygwin-3.6.9-1/winsup/cygwin/exceptions.cc:599
     #3  exception::handle (e=0x7ffffc9b0, frame=<optimized out>, in=0x7ffffc4c0, dispatch=<optimized out>) at /usr/src/debug/cygwin-3.6.9-1/winsup/cygwin/exceptions.cc:812
     #4  0x00007ffe9c5e63df in ntdll!.chkstk () from C:/WINDOWS/SYSTEM32/ntdll.dll
     #5  0x00007ffe9c499497 in ntdll!RtlLocateExtendedFeature () from C:/WINDOWS/SYSTEM32/ntdll.dll
     #6  0x00007ffe9c5e5d1e in ntdll!KiUserExceptionDispatcher () from C:/WINDOWS/SYSTEM32/ntdll.dll
     #7  0x0000000100401092 in main () at segfault.cc:5
     (gdb) c
     Continuing.
     ...
     [Inferior 1 (process 8032) exited with code 05400]
     (gdb)
    
    gdb.base/exitsignal.exp fails on Cygwin partly because it doesn't take
    that into account.  This commit fixes it.
    
    In addition, the typical adjustement for the fact that all programs
    are multi-threaded on Windows is also necessary.
    
    gdb.base/exitsignal.exp still won't pass cleanly on Cygwin yet.
    That'll be finally fixed in a following patch.
    
    Approved-By: Tom Tromey <[email protected]>
    Change-Id: I2d18e2604afe3a4f80987848e2c1cd307ed43401
    commit-id: 013964ce

Diff:
---
 gdb/testsuite/gdb.base/exitsignal.exp | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/gdb/testsuite/gdb.base/exitsignal.exp b/gdb/testsuite/gdb.base/exitsignal.exp
index aa2710450b5..5099ae1a1d6 100644
--- a/gdb/testsuite/gdb.base/exitsignal.exp
+++ b/gdb/testsuite/gdb.base/exitsignal.exp
@@ -50,7 +50,14 @@ gdb_test "print \$_exitcode" " = void" \
     "\$_exitcode is void before running"
 
 # Trigger SIGSEGV.
-gdb_test "continue" "Program received signal SIGSEGV.*" "trigger SIGSEGV"
+gdb_test "continue" "(Thread .*|Program) received signal SIGSEGV.*" \
+    "trigger SIGSEGV"
+
+if {[istarget "*-*-cygwin*"]} {
+    # Cygwin calls DebugBreak before it lets the process exit.
+    gdb_test "continue" "Thread .* received signal SIGTRAP.*" \
+	"trigger try_to_debug SIGTRAP"
+}
 
 # Continue until the end.
 gdb_test "continue" "Program terminated with signal SIGSEGV.*" \