如何搭建用于 gdb 调试的 MySQL
搭建用于 gdb 调试的 MySQL 的步骤如下(以 5.7.44 版本为例):
-
使用 vagrant 创建一个虚拟机,并通过
vagrant ssh
登录该虚拟机 -
安装编译 MySQL 所需的组件和 gdb
$ sudo apt install -y g++ gdb cmake libssl-dev libncurses5-dev pkg-config
- 下载源码压缩包
$ wget "https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-5.7.44.tar.gz"
- 编译并安装
$ tar xzvf mysql-boost-5.7.44.tar.gz
$ cd mysql-boost-5.7.44
$ sudo mkdir /opt/mysql-5.7
$ sudo chown -R vagrant:vagrant /opt/mysql-5.7/
$ cmake -DCMAKE_C_FLAGS="-ggdb3 -O0" -DCMAKE_CXX_FLAGS="-ggdb3 -O0" -DCMAKE_INSTALL_PREFIX="/opt/mysql-5.7" -DWITH_BOOST=$(pwd)/boost -DWITH_DEBUG=1 -DMYSQL_MAINTAINER_MODE=0
$ make
$ make install
处理 virtual memory exhausted: Cannot allocate memory 错误
$ sudo fallocate -l 4G /swapfile $ sudo chmod 0600 /swapfile $ sudo mkswap /swapfile $ sudo swapon /swapfile
- 初始化 MySQL Server
$ cd /opt/mysql-5.7
$ bin/mysqld --initialize --user=root
......
2024-05-29T10:37:07.376492Z 0 [Warning] One can only use the --user switch if running as root
......
2024-05-29T10:37:09.125900Z 1 [Note] A temporary password is generated for root@localhost: -hu8p,djr7jI
- 启动 MySQL Server
$ bin/mysqld --gdb
--gdb
参数的作用
能够接收
SIGINT
(Ctrl+C)信号,以便中断当前的流程(特别是陷入poll()
等死循环时)添加断点可以在
/tmp/mysqld.trace
中查看 debug 日志
- 修改
root
用户的密码,这里要输入刚刚得到的临时密码
$ bin/mysql -hlocalhost -uroot -p
Enter password:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
FLUSH PRIVILEGES;
- 用
gdb
调试 MySQL Server
$ sudo gdb --tui -q -p $(pidof mysqld)
(gdb) b mysql_execute_command
(gdb) c