* exception.h (stackdump): Declare.
* exceptions.cc (stackdump): Rework to perform all operations needed for a stackdump and to avoid recursion. (exception::handle): Use simplified stackdump interface. * sigproc.cc (signal::exit): Ditto. Delete now, uneeded declaration.
This commit is contained in:
		| @@ -1,3 +1,11 @@ | |||||||
|  | 2012-02-12  Christopher Faylor  <me.cygwin2012@cgf.cx> | ||||||
|  |  | ||||||
|  | 	* exception.h (stackdump): Declare. | ||||||
|  | 	* exceptions.cc (stackdump): Rework to perform all operations needed | ||||||
|  | 	for a stackdump and to avoid recursion. | ||||||
|  | 	(exception::handle): Use simplified stackdump interface. | ||||||
|  | 	* sigproc.cc (signal::exit): Ditto.  Delete now, uneeded declaration. | ||||||
|  |  | ||||||
| 2012-02-11  Corinna Vinschen  <corinna@vinschen.de> | 2012-02-11  Corinna Vinschen  <corinna@vinschen.de> | ||||||
|  |  | ||||||
| 	* miscfuncs.cc (DEFAULT_STACKSIZE): Remove. | 	* miscfuncs.cc (DEFAULT_STACKSIZE): Remove. | ||||||
|   | |||||||
| @@ -1,13 +1,12 @@ | |||||||
| /* exception.h | /* exception.h | ||||||
|  |  | ||||||
|    Copyright 2010, 2011 Red Hat, Inc. |    Copyright 2010, 2011, 2012 Red Hat, Inc. | ||||||
|  |  | ||||||
| This software is a copyrighted work licensed under the terms of the | This software is a copyrighted work licensed under the terms of the | ||||||
| Cygwin license.  Please consult the file "CYGWIN_LICENSE" for | Cygwin license.  Please consult the file "CYGWIN_LICENSE" for | ||||||
| details. */ | details. */ | ||||||
|  |  | ||||||
| #ifndef _EXCEPTION_H | #pragma once | ||||||
| #define _EXCEPTION_H |  | ||||||
|  |  | ||||||
| #include <exceptions.h> | #include <exceptions.h> | ||||||
|  |  | ||||||
| @@ -29,5 +28,10 @@ public: | |||||||
|   ~exception () __attribute__ ((always_inline)) { _except_list = save; } |   ~exception () __attribute__ ((always_inline)) { _except_list = save; } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif /*_EXCEPTION_H*/ | void stackdump (DWORD, CONTEXT * = NULL, EXCEPTION_RECORD * = NULL); | ||||||
|  | extern void inline | ||||||
|  | stackdump (DWORD n, bool) | ||||||
|  | { | ||||||
|  |   stackdump (n, (CONTEXT *) 1); | ||||||
|  | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -280,21 +280,21 @@ stack_info::walk () | |||||||
| } | } | ||||||
|  |  | ||||||
| void | void | ||||||
| stackdump (DWORD ebp, int open_file, bool isexception) | stackdump (DWORD ebp, PCONTEXT in, EXCEPTION_RECORD *e) | ||||||
| { | { | ||||||
|   static bool already_dumped; |   static bool already_dumped; | ||||||
|  |  | ||||||
|   if (cygheap->rlim_core == 0UL || (open_file && already_dumped)) |   if (already_dumped || cygheap->rlim_core == 0Ul) | ||||||
|     return; |     return; | ||||||
|  |   already_dumped = true; | ||||||
|   if (open_file) |  | ||||||
|   open_stackdumpfile (); |   open_stackdumpfile (); | ||||||
|  |  | ||||||
|   already_dumped = true; |   if (e) | ||||||
|  |     dump_exception (e, in); | ||||||
|  |  | ||||||
|   int i; |   int i; | ||||||
|  |  | ||||||
|   thestack.init (ebp, 1, !isexception);	/* Initialize from the input CONTEXT */ |   thestack.init (ebp, 1, !in);	/* Initialize from the input CONTEXT */ | ||||||
|   small_printf ("Stack trace:\r\nFrame     Function  Args\r\n"); |   small_printf ("Stack trace:\r\nFrame     Function  Args\r\n"); | ||||||
|   for (i = 0; i < 16 && thestack++; i++) |   for (i = 0; i < 16 && thestack++; i++) | ||||||
|     { |     { | ||||||
| @@ -356,7 +356,7 @@ cygwin_stackdump () | |||||||
|   CONTEXT c; |   CONTEXT c; | ||||||
|   c.ContextFlags = CONTEXT_FULL; |   c.ContextFlags = CONTEXT_FULL; | ||||||
|   GetThreadContext (GetCurrentThread (), &c); |   GetThreadContext (GetCurrentThread (), &c); | ||||||
|   stackdump (c.Ebp, 0, 0); |   stackdump (c.Ebp); | ||||||
| } | } | ||||||
|  |  | ||||||
| #define TIME_TO_WAIT_FOR_DEBUGGER 10000 | #define TIME_TO_WAIT_FOR_DEBUGGER 10000 | ||||||
| @@ -660,11 +660,7 @@ exception::handle (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *in, void | |||||||
|  |  | ||||||
| 	  rtl_unwind (frame, e); | 	  rtl_unwind (frame, e); | ||||||
| 	  if (cygheap->rlim_core > 0UL) | 	  if (cygheap->rlim_core > 0UL) | ||||||
| 	    { | 	    stackdump ((DWORD) ebp, in, e); | ||||||
| 	      open_stackdumpfile (); |  | ||||||
| 	      dump_exception (e, in); |  | ||||||
| 	      stackdump ((DWORD) ebp, 0, 1); |  | ||||||
| 	    } |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|       if (e->ExceptionCode == STATUS_ACCESS_VIOLATION) |       if (e->ExceptionCode == STATUS_ACCESS_VIOLATION) | ||||||
|   | |||||||
| @@ -23,6 +23,7 @@ details. */ | |||||||
| #include "shared_info.h" | #include "shared_info.h" | ||||||
| #include "cygtls.h" | #include "cygtls.h" | ||||||
| #include "ntdll.h" | #include "ntdll.h" | ||||||
|  | #include "exception.h" | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Convenience defines |  * Convenience defines | ||||||
| @@ -373,8 +374,6 @@ close_my_readsig () | |||||||
| void | void | ||||||
| _cygtls::signal_exit (int rc) | _cygtls::signal_exit (int rc) | ||||||
| { | { | ||||||
|   extern void stackdump (DWORD, int, bool); |  | ||||||
|  |  | ||||||
|   HANDLE myss = my_sendsig; |   HANDLE myss = my_sendsig; | ||||||
|   my_sendsig = NULL;		 /* Make no_signals_allowed return true */ |   my_sendsig = NULL;		 /* Make no_signals_allowed return true */ | ||||||
|  |  | ||||||
| @@ -414,7 +413,7 @@ _cygtls::signal_exit (int rc) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|   if ((rc & 0x80) && !try_to_debug ()) |   if ((rc & 0x80) && !try_to_debug ()) | ||||||
|     stackdump (thread_context.ebp, 1, 1); |     stackdump (thread_context.ebp, true); | ||||||
|  |  | ||||||
|   lock_process until_exit (true); |   lock_process until_exit (true); | ||||||
|   if (have_execed || exit_state > ES_PROCESS_LOCKED) |   if (have_execed || exit_state > ES_PROCESS_LOCKED) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user