diff options
author | unknown <monty@donna.mysql.com> | 2000-08-30 06:05:12 +0300 |
---|---|---|
committer | unknown <monty@donna.mysql.com> | 2000-08-30 06:05:12 +0300 |
commit | a6ec1f09b09f03652d6ab00b2a6632979825ffa3 (patch) | |
tree | e238fa1f519c24267d1b73a298d39c0f8a1a8a1b /sql | |
parent | 45e355c2bede4f943e9915c9168ad80d5fae05d9 (diff) | |
download | mariadb-git-a6ec1f09b09f03652d6ab00b2a6632979825ffa3.tar.gz |
--core-file ; To get a core on SIGSEGV when using Linuxthreads
Docs/manual.texi:
Documentation for --core-file
sql/mysql_priv.h:
--core-file
sql/mysqld.cc:
--core-file
Diffstat (limited to 'sql')
-rw-r--r-- | sql/mysql_priv.h | 2 | ||||
-rw-r--r-- | sql/mysqld.cc | 43 |
2 files changed, 38 insertions, 7 deletions
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 7e3186defd3..7e372a7ffd1 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -127,7 +127,7 @@ void sql_element_free(void *ptr); #define TEST_NO_THREADS 32 /* For debugging under Linux */ #define TEST_READCHECK 64 /* Force use of readcheck */ #define TEST_NO_EXTRA 128 -#define TEST_KILL_ON_DEBUG 256 /* Kill server */ +#define TEST_CORE_ON_SIGNAL 256 /* Give core if signal */ /* options for select set by the yacc parser */ #define SELECT_DISTINCT 1 diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 37b03ef4a67..8ea12f68da8 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -1003,6 +1003,20 @@ static void init_signals(void) } #else +#ifdef HAVE_LINUXTHREADS + +/* Produce a core for the thread */ + +static sig_handler write_core(int sig) +{ + fprintf(stderr,"Got signal %s in thread %d\n",sys_siglist[sig],getpid()); + signal(sig, SIG_DFL); + if (fork() != 0) exit(1); // Abort main program + // Core will be written at exit +} +#endif + + static void init_signals(void) { sigset_t set; @@ -1012,6 +1026,16 @@ static void init_signals(void) sigset(THR_KILL_SIGNAL,end_thread_signal); sigset(THR_SERVER_ALARM,print_signal_warning); // Should never be called! +#ifdef HAVE_LINUXTHREADS + if (test_flags & TEST_CORE_ON_SIGNAL) + { + struct sigaction sa; sa.sa_flags = 0; + sigemptyset(&sa.sa_mask); + sigprocmask(SIG_SETMASK,&sa.sa_mask,NULL); + sa.sa_handler=write_core; + sigaction(SIGSEGV, &sa, NULL); + } +#endif (void) sigemptyset(&set); #ifdef THREAD_SPECIFIC_SIGPIPE sigset(SIGPIPE,abort_thread); @@ -2134,7 +2158,7 @@ enum options {OPT_ISAM_LOG=256,OPT_SKIP_NEW,OPT_SKIP_GRANT, OPT_MASTER_PORT, OPT_MASTER_INFO_FILE, OPT_MASTER_CONNECT_RETRY, OPT_SQL_BIN_UPDATE_SAME, OPT_REPLICATE_DO_DB, OPT_REPLICATE_IGNORE_DB, OPT_LOG_SLAVE_UPDATES, - OPT_BINLOG_DO_DB, OPT_BINLOG_IGNORE_DB}; + OPT_BINLOG_DO_DB, OPT_BINLOG_IGNORE_DB, OPT_WANT_CORE}; static struct option long_options[] = { @@ -2156,6 +2180,7 @@ static struct option long_options[] = #ifdef __WIN__ {"console", no_argument, 0, OPT_CONSOLE}, #endif + {"core-file", no_argument, 0, OPT_WANT_CORE}, {"chroot", required_argument,0, 'r'}, {"character-sets-dir",required_argument,0, OPT_CHARSETS_DIR}, {"datadir", required_argument, 0, 'h'}, @@ -2188,8 +2213,10 @@ static struct option long_options[] = {"master-connect-retry", required_argument, 0, (int) OPT_MASTER_CONNECT_RETRY}, {"master-info-file", required_argument, 0, (int) OPT_MASTER_INFO_FILE}, {"new", no_argument, 0, 'n'}, - {"old-protocol", no_argument, 0, 'o'}, + {"old-protocol", no_argument, 0, 'o'}, +#ifndef DBUG_OFF {"one-thread", no_argument, 0, OPT_ONE_THREAD}, +#endif {"pid-file", required_argument, 0, (int) OPT_PID_FILE}, {"port", required_argument, 0, 'P'}, {"replicate-do-db", required_argument, 0, OPT_REPLICATE_DO_DB}, @@ -2432,6 +2459,7 @@ static void usage(void) --character-sets-dir=...\n\ Directory where character sets are\n\ --chroot=path Chroot mysqld daemon during startup\n\ + --core-file Write core on errors\n\ -h, --datadir=path Path to the database root"); #ifndef DBUG_OFF printf("\ @@ -2465,9 +2493,11 @@ static void usage(void) --pid-file=path Pid file used by safe_mysqld\n\ -P, --port=... Port number to use for connection\n\ -n, --new Use very new possible 'unsafe' functions\n\ - -o, --old-protocol Use the old (3.20) protocol\n\ + -o, --old-protocol Use the old (3.20) protocol\n"); +#ifndef DBUG_OFF + puts("\ --one-thread Only use one thread (for debugging under Linux)\n"); - /* We have to break the string here because of VC++ limits */ +#endif puts("\ -O, --set-variable var=option\n\ Give a variable an value. --help lists variables\n\ @@ -2729,8 +2759,6 @@ static void get_options(int argc,char **argv) binlog_do_db.push_back(db); break; } - - case (int) OPT_SQL_BIN_UPDATE_SAME: opt_sql_bin_update = 1; break; @@ -2785,6 +2813,9 @@ static void get_options(int argc,char **argv) case (int) OPT_ONE_THREAD: test_flags |= TEST_NO_THREADS; break; + case (int) OPT_WANT_CORE: + test_flags |= TEST_CORE_ON_SIGNAL; + break; case (int) OPT_BIND_ADDRESS: if (optarg && isdigit(optarg[0])) { |