如何搭建用于 gdb 调试的 MySQL

134 阅读1分钟

如何搭建用于 gdb 调试的 MySQL

搭建用于 gdb 调试的 MySQL 的步骤如下(以 5.7.44 版本为例):

  1. 使用 vagrant 创建一个虚拟机,并通过 vagrant ssh 登录该虚拟机

  2. 安装编译 MySQL 所需的组件和 gdb

$ sudo apt install -y g++ gdb cmake libssl-dev libncurses5-dev pkg-config
  1. 下载源码压缩包
$ wget "https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-5.7.44.tar.gz"
  1. 编译并安装
$ 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
  1. 初始化 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
  1. 启动 MySQL Server
$ bin/mysqld --gdb

--gdb 参数的作用

  • 能够接收 SIGINT(Ctrl+C)信号,以便中断当前的流程(特别是陷入 poll() 等死循环时)添加断点

  • 可以在 /tmp/mysqld.trace 中查看 debug 日志

  1. 修改 root 用户的密码,这里要输入刚刚得到的临时密码
$ bin/mysql -hlocalhost -uroot -p
Enter password: 
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
FLUSH PRIVILEGES;
  1. gdb 调试 MySQL Server
$ sudo gdb --tui -q -p $(pidof mysqld)
(gdb) b mysql_execute_command
(gdb) c