Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/winsup
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2012-02-13 02:43:33 +0400
committerChristopher Faylor <me@cgf.cx>2012-02-13 02:43:33 +0400
commite52a43f10116f1481d2b8c5cf7b935749cbd3a4d (patch)
tree26a7ead58601442735f5a66d0a2951a900def95d /winsup
parentce48510394663e2fbac99395030cdecdf0b61671 (diff)
* 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.
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/ChangeLog8
-rw-r--r--winsup/cygwin/exception.h12
-rw-r--r--winsup/cygwin/exceptions.cc22
-rw-r--r--winsup/cygwin/sigproc.cc5
4 files changed, 27 insertions, 20 deletions
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 <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.
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 <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);
+}
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)