summaryrefslogtreecommitdiff
path: root/sql/signal_handler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/signal_handler.cc')
-rw-r--r--sql/signal_handler.cc53
1 files changed, 50 insertions, 3 deletions
diff --git a/sql/signal_handler.cc b/sql/signal_handler.cc
index 05e1d2176f9..c913a0477d7 100644
--- a/sql/signal_handler.cc
+++ b/sql/signal_handler.cc
@@ -30,6 +30,10 @@
#define SIGNAL_FMT "signal %d"
#endif
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
/*
We are handling signals/exceptions in this file.
Any global variables we read should be 'volatile sig_atomic_t'
@@ -44,6 +48,43 @@ extern volatile sig_atomic_t ld_assume_kernel_is_set;
extern const char *optimizer_switch_names[];
+static inline void output_core_info()
+{
+ /* proc is optional on some BSDs so it can't hurt to look */
+#ifdef HAVE_READLINK
+ char buff[PATH_MAX];
+ ssize_t len;
+ int fd;
+ if ((len= readlink("/proc/self/cwd", buff, sizeof(buff))) >= 0)
+ {
+ my_safe_printf_stderr("Writing a core file...\nWorking directory at %.*s\n",
+ (int) len, buff);
+ }
+ if ((fd= my_open("/proc/self/limits", O_RDONLY, MYF(0))) >= 0)
+ {
+ my_safe_printf_stderr("Resource Limits:\n");
+ while ((len= my_read(fd, (uchar*)buff, sizeof(buff), MYF(0))) > 0)
+ {
+ my_write_stderr(buff, len);
+ }
+ my_close(fd, MYF(0));
+ }
+#ifdef __linux__
+ if ((fd= my_open("/proc/sys/kernel/core_pattern", O_RDONLY, MYF(0))) >= 0)
+ {
+ len= my_read(fd, (uchar*)buff, sizeof(buff), MYF(0));
+ my_safe_printf_stderr("Core pattern: %.*s\n", (int) len, buff);
+ my_close(fd, MYF(0));
+ }
+#endif
+#else
+ char buff[80];
+ my_getwd(buff, sizeof(buff), 0);
+ my_safe_printf_stderr("Writing a core file at %s\n", buff);
+ fflush(stderr);
+#endif
+}
+
/**
* Handler for fatal signals on POSIX, exception handler on Windows.
*
@@ -113,7 +154,7 @@ extern "C" sig_handler handle_fatal_signal(int sig)
"diagnose the problem, but since we have already crashed, \n"
"something is definitely wrong and this may fail.\n\n");
- set_server_version();
+ set_server_version(server_version, sizeof(server_version));
my_safe_printf_stderr("Server version: %s\n", server_version);
if (dflt_key_cache)
@@ -201,6 +242,13 @@ extern "C" sig_handler handle_fatal_signal(int sig)
case ABORT_QUERY_HARD:
kreason= "ABORT_QUERY";
break;
+ case KILL_SLAVE_SAME_ID:
+ kreason= "KILL_SLAVE_SAME_ID";
+ break;
+ case KILL_WAIT_TIMEOUT:
+ case KILL_WAIT_TIMEOUT_HARD:
+ kreason= "KILL_WAIT_TIMEOUT";
+ break;
}
my_safe_printf_stderr("%s", "\n"
"Trying to get some variables.\n"
@@ -288,11 +336,10 @@ extern "C" sig_handler handle_fatal_signal(int sig)
}
#endif
+ output_core_info();
#ifdef HAVE_WRITE_CORE
if (test_flags & TEST_CORE_ON_SIGNAL)
{
- my_safe_printf_stderr("%s", "Writing a core file\n");
- fflush(stderr);
my_write_core(sig);
}
#endif