error_start patch

Egor Duda deo@logos-m.ru
Mon May 22 10:27:00 GMT 2000


Hi!

  Below  is  a  patch  to prevent cygwin's JIT debugger (specified via
'error_start')   from   being   spawned   recursively,  in  case  when
debugger throws exception itself. It also allows to notify the debugee
that  we've    done    with   debugging   and  it  can  exit in peace.
debugger can post event named

"cygwin_error_start_event_<debugee_win32_pid>"

instead of

(gdb) set keep_looping=0
(gdb) c

----------------------------------------------------------------------------
2000-05-22  Egor Duda <deo@logos-m.ru>

        * exceptions.cc (try_to_debug): prevent recursive spawning of JIT
        debugger.
        * exceptions.cc (try_to_debug): treat  special event from debugger
        as command to continue.

Index: cygwin/exceptions.cc
===================================================================
RCS file: /home/duda_admin/cvs-mirror/src/winsup/cygwin/exceptions.cc,v
retrieving revision 1.17
diff -c -2 -r1.17 exceptions.cc
*** cygwin/exceptions.cc        2000/05/20 05:52:33     1.17
--- cygwin/exceptions.cc        2000/05/22 16:55:40
***************
*** 301,304 ****
--- 301,306 ----
  static int NO_COPY keep_looping = 0;
  
+ #define TIME_TO_WAIT_FOR_DEBUGGER 10000
+ 
  extern "C" int
  try_to_debug ()
***************
*** 330,333 ****
--- 332,350 ----
    ReleaseMutex (title_mutex);
  
+   /* prevent recursive exception handling */
+   char* rawenv = GetEnvironmentStrings () ;
+   for ( char* p = rawenv; *p != '\0'; p = strchr (p, '\0') + 1 )
+     { 
+       if (strncmp ( p, "CYGWIN=", sizeof("CYGWIN=") - 1) == 0)
+         {
+           system_printf ( "%s", p);
+           char* q = strstr ( p, "error_start" ) ;
+           /* replace 'error_start=...' with '_rror_start=...' */
+           if ( q ) *q = '_' ;
+           SetEnvironmentVariable ( "CYGWIN", p+sizeof("CYGWIN=") ) ;
+           break ;
+         }
+     }
+ 
    dbg = CreateProcess (NULL,
                       debugger_command,
***************
*** 349,355 ****
    else
      {
        keep_looping = 1;
!       while (keep_looping)
!       Sleep (10000);
      }
  
--- 366,385 ----
    else
      {
+       char event_name [ sizeof ( "cygwin_error_start_event" ) + 9 ];
+       DWORD win32_pid = GetCurrentProcessId ();
+       __small_sprintf ( event_name, "cygwin_error_start_event%x", win32_pid );
+       HANDLE sync_with_dbg = CreateEvent ( NULL, TRUE, FALSE, event_name );
        keep_looping = 1;
!       while (keep_looping) 
!         {
!           if (sync_with_dbg == NULL)
!             Sleep (TIME_TO_WAIT_FOR_DEBUGGER);
!           else
!             {
!               if (WaitForSingleObject (sync_with_dbg,
!                                        TIME_TO_WAIT_FOR_DEBUGGER) == WAIT_OBJECT_0)
!                 break;
!             }
!          }
      }

----------------------------------------------------------------------------

Egor.            mailto:deo@logos-m.ru ICQ 5165414 FidoNet 2:5020/496.19




More information about the Cygwin-patches mailing list