Linux环境下,进程崩溃生成core文件以便于程序调试和问题排查。进程在启动前,设置core file size 大于0,进程崩溃通常就会生成core file dump文件。MySQL在系统提供的core file生成机制之外,额外添加了一个参数--core-file,来控制是否生成core文件。
// mysqld.cc
{"core-file", OPT_WANT_CORE, "Write core on errors.", 0, 0, 0, GET_NO_ARG,NO_ARG, 0, 0, 0, 0, 0, 0},
...
case (int) OPT_WANT_CORE:
test_flags |= TEST_CORE_ON_SIGNAL;
break;
...
// my_init_signals()
if (test_flags & TEST_CORE_ON_SIGNAL)
{
// Change limits so that we will get a core file.
struct rlimit rl;
rl.rlim_cur= rl.rlim_max= RLIM_INFINITY;
if (setrlimit(RLIMIT_CORE, &rl))
sql_print_warning("setrlimit could not change the size of core files to"
" 'infinity'; We may not be able to generate a"
" core file on signals");
}
从以上代码可以看出,启动MySQL进程时,加上--core-file参数,即使linux系统没有配置生成core file,MySQL也能通过自己在代码中调用系统函数来让自己进程在崩溃时生成core file。
2. core file 操作系统相关参数设置
echo 2 >/proc/sys/fs/suid_dumpable
chmod 0777 /mysql/crash
echo /mysql/crash/core.%e.%t.%p > /proc/sys/kernel/core_pattern
echo 1 >/proc/sys/kernel/core_uses_pid
/proc/sys/fs/suid_dumpable 取值为0,1,2,具体意义如下:
0 表明调用 seteuid和 setgid 改变用户或组的进程,将不能产生core文件
1 表明debug模式,任何进程都可以产生core文件
2 表明生成的core文件只有root用户可读,更加安全地保护内存数据
/proc/sys/kernel/core_pattern 设置的core文件存放目录和core文件名称,注意磁盘空间要足够存储core file。
/proc/sys/kernel/core_uses_pid 控制core文件扩展名是否带中进程id。
3. 模拟MySQL崩溃,生成core文件
测试当mysqld进程崩溃时,是否会产生core file:
kill -SEGV mysqld进程号
4. gdb调试core文件
gdb调试core文件:
gdb /usr/local/mysql/bin/mysqld core.mysqld.1573578046.1207
/usr/local/mysql/bin/mysqld 为MySQL进程路径。