上周参加Oracle技术嘉年华 2015
收获非常大.
其中吕海波老师分享的内容是 《调试Oracle二三例:调试技术在日常运维中的应用》
其中有关于调试MySQL源码的内容.
实验如下:
下载MySQL 5.7的源码
http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.9.tar.gz
编译,注意增加 DEBUG 选项。(cmake的版本要求在2.8.2以上)
cmake \
-DCMAKE_INSTALL_PREFIX=/home/mysql5.7/mysql-5.7.9/ \
-DMYSQL_DATADIR=/home/mysql5.7/mysql-5.7.9/data \
-DSYSCONFDIR=/etc \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DMYSQL_UNIX_ADDR=/home/mysql5.7/mysql-5.7.9/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_DEBUG=1 \
-DDOWNLOAD_BOOST=1 -DWITH_BOOST=/tmp -DDOWNLOAD_BOOST_TIMEOUT=60000
make && make install
scripts/mysql_install_db --basedir=/home/mysql5.7/mysql-5.7.9/ --datadir=/home/mysql5.7/mysql-5.7.9/data --user=mysql5.7
源码安装完MySQL之后,使用Debug模式启动
mysqld --debug --console &
然后重头戏来了
先找到MySQL的PID
[mysql5.7@localhost~]$ps -ef | grep mysqld
mysql5.7 26086 1 2 19:29 pts/3 00:00:01 mysqld --debug --console
mysql5.7 26170 26118 0 19:30 pts/3 00:00:00 grep mysqld
这时候,tail -f /tmp/mysqld.trace
可以看到,任何在MySQL的操作,调用的函数信息都记录在这个trace文件中.
找到其中任意一行,比如 PROFILING::status_change
使用命令gdb调试.
gdb --pid 26086 --tui
将上述函数打断点.
break PROFILING::status_change
开启另外一个MySQL终端.执行查询,然后进入gdb的断点.
可以看到源码,并且单步执行,打印变量.
看静态的代码一般比较枯燥,用这种方式感觉比较好入门.
同样的方式,也适用于Redis
收获非常大.
其中吕海波老师分享的内容是 《调试Oracle二三例:调试技术在日常运维中的应用》
其中有关于调试MySQL源码的内容.
实验如下:
下载MySQL 5.7的源码
http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.9.tar.gz
编译,注意增加 DEBUG 选项。(cmake的版本要求在2.8.2以上)
cmake \
-DCMAKE_INSTALL_PREFIX=/home/mysql5.7/mysql-5.7.9/ \
-DMYSQL_DATADIR=/home/mysql5.7/mysql-5.7.9/data \
-DSYSCONFDIR=/etc \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DMYSQL_UNIX_ADDR=/home/mysql5.7/mysql-5.7.9/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_DEBUG=1 \
-DDOWNLOAD_BOOST=1 -DWITH_BOOST=/tmp -DDOWNLOAD_BOOST_TIMEOUT=60000
make && make install
mysqld --debug --console &
然后重头戏来了
先找到MySQL的PID
[mysql5.7@localhost~]$ps -ef | grep mysqld
mysql5.7 26086 1 2 19:29 pts/3 00:00:01 mysqld --debug --console
mysql5.7 26170 26118 0 19:30 pts/3 00:00:00 grep mysqld
这时候,tail -f /tmp/mysqld.trace
可以看到,任何在MySQL的操作,调用的函数信息都记录在这个trace文件中.
找到其中任意一行,比如 PROFILING::status_change
使用命令gdb调试.
gdb --pid 26086 --tui
将上述函数打断点.
break PROFILING::status_change
开启另外一个MySQL终端.执行查询,然后进入gdb的断点.
可以看到源码,并且单步执行,打印变量.
看静态的代码一般比较枯燥,用这种方式感觉比较好入门.
同样的方式,也适用于Redis