* 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:
Christopher Faylor 2012-02-12 22:43:33 +00:00
parent ce48510394
commit e52a43f101
4 changed files with 27 additions and 20 deletions

View File

@ -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.

View File

@ -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);
}

View File

@ -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;
if (open_file)
open_stackdumpfile ();
already_dumped = true; already_dumped = true;
open_stackdumpfile ();
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)

View File

@ -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)