diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index fcbc8fad0..f82ad8cc7 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,11 @@ +2012-02-12 Christopher Faylor + + * 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 * miscfuncs.cc (DEFAULT_STACKSIZE): Remove. diff --git a/winsup/cygwin/exception.h b/winsup/cygwin/exception.h index 9f4a6c45c..b0a66b4ee 100644 --- a/winsup/cygwin/exception.h +++ b/winsup/cygwin/exception.h @@ -1,13 +1,12 @@ /* 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 Cygwin license. Please consult the file "CYGWIN_LICENSE" for details. */ -#ifndef _EXCEPTION_H -#define _EXCEPTION_H +#pragma once #include @@ -29,5 +28,10 @@ public: ~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); +} diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 6d03da8e7..c6497f3b1 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -280,21 +280,21 @@ stack_info::walk () } void -stackdump (DWORD ebp, int open_file, bool isexception) +stackdump (DWORD ebp, PCONTEXT in, EXCEPTION_RECORD *e) { static bool already_dumped; - if (cygheap->rlim_core == 0UL || (open_file && already_dumped)) + if (already_dumped || cygheap->rlim_core == 0Ul) return; - - if (open_file) - open_stackdumpfile (); - already_dumped = true; + open_stackdumpfile (); + + if (e) + dump_exception (e, in); 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"); for (i = 0; i < 16 && thestack++; i++) { @@ -356,7 +356,7 @@ cygwin_stackdump () CONTEXT c; c.ContextFlags = CONTEXT_FULL; GetThreadContext (GetCurrentThread (), &c); - stackdump (c.Ebp, 0, 0); + stackdump (c.Ebp); } #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); if (cygheap->rlim_core > 0UL) - { - open_stackdumpfile (); - dump_exception (e, in); - stackdump ((DWORD) ebp, 0, 1); - } + stackdump ((DWORD) ebp, in, e); } if (e->ExceptionCode == STATUS_ACCESS_VIOLATION) diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index 7850ab1b6..73b934b3d 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -23,6 +23,7 @@ details. */ #include "shared_info.h" #include "cygtls.h" #include "ntdll.h" +#include "exception.h" /* * Convenience defines @@ -373,8 +374,6 @@ close_my_readsig () void _cygtls::signal_exit (int rc) { - extern void stackdump (DWORD, int, bool); - HANDLE myss = my_sendsig; my_sendsig = NULL; /* Make no_signals_allowed return true */ @@ -414,7 +413,7 @@ _cygtls::signal_exit (int rc) } if ((rc & 0x80) && !try_to_debug ()) - stackdump (thread_context.ebp, 1, 1); + stackdump (thread_context.ebp, true); lock_process until_exit (true); if (have_execed || exit_state > ES_PROCESS_LOCKED)