全部博文(389)
分类: Mysql/postgreSQL
2014-06-27 06:38:57
使用debug调试mysql的执行
通过激活mysql内置的debug的功能,可以看到程序执行到哪个地方出问题了.使用debug需要在编译的
时候激活debug功能.
比如我在mysql 5.6.14编译时,使用了以下选项
[root@c12 mysql]cmake . -DWTITH_DEBUG=1
接下来可以激活mysql的debug,这样mysql在执行对应的函数时会进行提示信息的输出.
[root@c12 bin]# ./mysqld --debug=d,info --user=mysql --basedir=/opt/mysql/usr/local/mysql
--datadir=/opt/mysql/usr/local/mysql/data
现在来测试执行debug来判断程序执行到什么地方了.mysql服务器的代码的起始文件是在源码包sql/mysqld.cc文件中.
mysql在执行一系列初始化后,然后调用handle_connections_socket()函数,该函数的主要作用一直循环侦听网络请求,
当接收到网络请求时,再重用或创建线程进行下一步处理.
我们可以在进入该函数之前加一条提示信息,以确认服务器是否已经执行到该函数,以判断问题是出在之前
还是之后
修改之前
#if defined(_WIN32) || defined(HAVE_SMEM)
handle_connections_methods();
#else
handle_connections_sockets();
#endif /* _WIN32 || HAVE_SMEM */
修改之后
#if defined(_WIN32) || defined(HAVE_SMEM)
handle_connections_methods();
#else
#add by frankzou 2014/06/26
DBUG_PRINT("info", ("the loop begin....."));
handle_connections_sockets();
#endif /* _WIN32 || HAVE_SMEM */
增加了代码DBUG_PRINT("info", ("the loop begin....."));
intern_plugin_unlock: info: unlocking plugin, name= MyISAM, ref_count= 17
intern_plugin_unlock: info: unlocking plugin, name= MyISAM, ref_count= 16
~THD(): info: freeing security context
2014-06-26 22:26:11 6127 [Note] ./mysqld: ready for connections.
Version: '5.6.14-debug' socket: '/tmp/mysql.sock' port: 3306 Source distribution
?func: info: the loop begin.....
可以看到服务器已经执行到我们刚刚所加到的代码位置,接下来服务器会一直侦听网络请求.直到loop会中止
这样mysql服务器就会关闭.
one_thread_per_connection_end: info: Blocking pthread for reuse
?func: info: Got signal: 15 abort_loop: 0
2014-06-26 22:27:27 6127 [Note] ./mysqld: Normal shutdown
服务器关闭的代码
switch (sig) {
case SIGTERM:
case SIGQUIT:
case SIGKILL:
#ifdef EXTRA_DEBUG
sql_print_information("Got signal %d to shutdown mysqld",sig);
#endif
/* switch to the old log message processing */
logger.set_handlers(LOG_FILE, opt_slow_log ? LOG_FILE:LOG_NONE,
opt_log ? LOG_FILE:LOG_NONE);
DBUG_PRINT("info",("Got signal: %d abort_loop: %d",sig,abort_loop));
SIGKILL的代码是15,说明服务器是通过mysqladmin kill掉的.