前言
先進行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屬性
好的,結束