* 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:
parent
ce48510394
commit
e52a43f101
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue