Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2803009
  • 博文数量: 389
  • 博客积分: 4177
  • 博客等级: 上校
  • 技术积分: 4773
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-16 23:29
文章分类

全部博文(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掉的.

阅读(4717) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~