* 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>
* miscfuncs.cc (DEFAULT_STACKSIZE): Remove.

View File

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

View File

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

View File

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