mysql-mysql源码本地调试
前言
先进行mysql源码本地编译:mysql源码本地编译
1.本地调试
这里以macbook为例
1.使用vscode打开mysql源码
2.创建basedir目录、数据目录、配置文件目录、配置文件
cd /Users/test/
mkdir mysqldir
//创建数据目录和配置目录
cd mysqldir
mkdir conf data
cd conf
touch my.cnf
目录结构如图:
3.编辑my.cnf配置文件
[mysqld]
bind-address=0.0.0.0
port=3306
user=mysql
basedir=/Users/test/mysqldir
datadir=/Users/test/mysqldir/data
socket=/Users/test/mysqldir/mysql.sock
log-error=/Users/test/mysqldir/mysql.err
pid-file=/Users/test/mysqldir/mysql.pid
#character config
character_set_server=utf8mb4
symbolic-links=0
explicit_defaults_for_timestamp=true[client]
port=3306
socket=/Users/test/mysqldir/mysql.sock
4.初始化mysql
mysql源码编译成功后可执行文件mysqld、mysql会出现在工程的build/bin下
4.1配置mysql数据库debug配置
在工程目录下创建.vscode目录并在该目录下创建launch.json文件
4.2编辑launcun.json文件
{"version": "0.2.0","configurations": [{"name": "C++ Debug","type": "lldb",//windows系统是cppgdb,macbook系统是lldb"request": "launch","program": "${workspaceFolder}/build/bin/mysqld", // 替换为你的可执行文件路径"args": ["--defaults-file=/Users/test/mysqldir/conf/my.cnf"///"${workspaceFolder}/data.xodr"],// "stopAtEntry": false,"cwd": "${workspaceFolder}",// "environment": [],// "externalConsole": false,// "MIMode": "lldb",// "setupCommands": [// {// "description": "Disable pretty printing",// "text": "-enable-pretty-printing",// "args": [],// "ignoreFailures": true// }// ],// "miDebuggerPath": "/opt/homebrew/bin/gdb" // 根据系统修改路径,如 macOS 上可能是 `/opt/homebrew/bin/gdb`}]}
4.3安装codelldb插件
安装过程中有可能会让你去github下载codelldb-darwin-x64.vsix会很慢,不过放心我已经帮你下载好了
链接: https://pan.baidu.com/s/1FSMyzNfLu9fTaMR1-X2Mzg?pwd=cyv2 提取码: cyv2
下载后之后选择插件下载界面,将该文件拖拽到vscode插件列表区域会自动安装,等待安装成功即可。
4.4开始mysqld启动调试
ctrl+p搜索 sql_parse.cc文件
开启调试
进入调试状态
设置断点
为什么先开启调试再设置断点,因为数据库服务端启动的时候也会执行这个方法,为了影响mysqld的正常启动,等到调试启动后再打断点。
4.5 启动mysql客户端
进入build/bin启动mysql客户端
./mysql -uroot -p -S /Users/test/mysqldir/mysql.sock
回车进入数据库客户端
创建数据库
create database test;
使用数据库
use test
创建数据库
create table test(age int,name varchar(15)
) engine=innodb character set utf8mb4;
4.6执行sql进行
客户端执行
select * from test;
此时回到调试界面会看到断点处已经暂停
到这里关注
int mysql_execute_command(THD *thd, bool first_level)
中的thd变量,找到m_query_string属性
好的,结束