summaryrefslogtreecommitdiff
path: root/sql/sql_parse.cc
diff options
context:
space:
mode:
authorunknown <vvaintroub@wva.>2008-02-19 12:37:39 +0100
committerunknown <vvaintroub@wva.>2008-02-19 12:37:39 +0100
commit721d24124fee09a13da32cb49295fdfd45729592 (patch)
tree31944515f437dadb20aac5d217317572ec7950c4 /sql/sql_parse.cc
parent32f59206764a448e1adf06e72ed69f7b4a907ce3 (diff)
downloadmariadb-git-721d24124fee09a13da32cb49295fdfd45729592.tar.gz
Bug#31745 - crash handler does not work on Windows
- Replace per-thread signal()'s with SetUnhandledExceptionFilter(). The only remaining signal() is for SIGABRT (default abort() handler in VS2005 is broken, i.e removes user exception filter) - remove MessageBox()'es from error handling code - Windows port for print_stacktrace() and write_core() - Cleanup, removed some unused functions sql/CMakeLists.txt: Implement stack tracing on and generating crash dumps on Windows sql/mysqld.cc: Correct signal handling on Windows. - For console events, like CTRL-C use SetConsoleCtrlHandler - For exceptions like access violation, use SetUnhandledExceptionFilter - For SIGABRT generate exception via __debugbreak() intrinsic if built with VS2005 and later , since default SIGABRT handler replaces unhandled exception filter specified by user - make provisions to debug exception filter, as it is not trivial (should be compiled with /DDEBUG_UNHANDLED_EXCEPTION_FILTER) sql/sql_parse.cc: Remove message box from windows signal handler. The only thread specific handler left is for SIGABRT, which is broken on VS2005 and later (user specified unhandled exception filter gets overwritten) sql/stacktrace.c: Stack tracing and generating crash dumps on Windows sql/stacktrace.h: Implement print_stacktrace and write_core on Windows
Diffstat (limited to 'sql/sql_parse.cc')
-rw-r--r--sql/sql_parse.cc19
1 files changed, 2 insertions, 17 deletions
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 8af79d77fa1..493cc1a1a7e 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -98,22 +98,7 @@ static bool do_command(THD *thd);
#endif // EMBEDDED_LIBRARY
#ifdef __WIN__
-static void test_signal(int sig_ptr)
-{
-#if !defined( DBUG_OFF)
- MessageBox(NULL,"Test signal","DBUG",MB_OK);
-#endif
-#if defined(OS2)
- fprintf(stderr, "Test signal %d\n", sig_ptr);
- fflush(stderr);
-#endif
-}
-static void init_signals(void)
-{
- int signals[7] = {SIGINT,SIGILL,SIGFPE,SIGSEGV,SIGTERM,SIGBREAK,SIGABRT } ;
- for (int i=0 ; i < 7 ; i++)
- signal( signals[i], test_signal) ;
-}
+extern void win_install_sigabrt_handler(void);
#endif
static void unlock_locked_tables(THD *thd)
@@ -1124,7 +1109,7 @@ pthread_handler_t handle_one_connection(void *arg)
/* now that we've called my_thread_init(), it is safe to call DBUG_* */
#if defined(__WIN__)
- init_signals();
+ win_install_sigabrt_handler();
#elif !defined(OS2) && !defined(__NETWARE__)
sigset_t set;
VOID(sigemptyset(&set)); // Get mask in use