+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.
/* 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>
~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);
+}
}
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++)
{
CONTEXT c;
c.ContextFlags = CONTEXT_FULL;
GetThreadContext (GetCurrentThread (), &c);
- stackdump (c.Ebp, 0, 0);
+ stackdump (c.Ebp);
}
#define TIME_TO_WAIT_FOR_DEBUGGER 10000
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)
#include "shared_info.h"
#include "cygtls.h"
#include "ntdll.h"
+#include "exception.h"
/*
* Convenience defines
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 */
}
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)