MySQL 調(diào)試環(huán)境搭建:VSCode + Docker
近期使用 gdb 調(diào)試比較多,發(fā)現(xiàn)了很多好用的功能,而在 Mac 上使用 gdb 調(diào)試,體驗不太順暢。
為此,基于 Docker 搭建了一套 CentOS 環(huán)境,結(jié)合 VSCode 和 gdb 來調(diào)試 MySQL,拿出來和大家分享。
本文基于 Mac + MySQL 8.0.32,對于在其它系統(tǒng)上搭建 MySQL 調(diào)試環(huán)境,安裝好 Docker Desktop 之后的步驟也是可以借鑒的。
1、下載 Docker Desktop
下載地址:https://www.docker.com/products/docker-desktop
下載界面:
Docker Desktop 下載完成之后,安裝并運行,然后就可以繼續(xù)接下來的步驟了。
2、創(chuàng)建 Docker 容器
先在 Docker Desktop 中設(shè)置能夠映射到容器中的宿主機目錄:
在第 3 個紅框處的輸入框?中,輸入 /opt/data/docker?,然后按回車鍵?把目錄加入 FILE SHARING?,表示允許把宿主機中該目錄及其子目錄映射到容器中,最后點擊第 4 個紅框處的 Apply & Restart?,應(yīng)用并重啟 Docker Desktop,讓修改生效。
在宿主機執(zhí)行以下命令,創(chuàng)建容器并運行:
在 Mac 宿主機上,連接容器中的 MySQL,需要指定 -p 選項做端口映射,然后通過 宿主機 IP + 映射的宿主機端口連接容器中的 MySQL。
3、安裝 VSCode 擴展
VSCode 擴展包含兩部分:安裝在宿主機的擴展、安裝在容器中的擴展。
我們先打開 VSCode,安裝宿主機 Docker 擴展:
安裝 Docker 擴展之后,我們就能在 VSCode? 中看到之前創(chuàng)建的 mysql 容器了:
點擊 Attach Visual Studio Code 會打開一個新的 VSCode 窗口,我們給它取個名字:mysql 容器窗口,后面會用到。
接下來,在 mysql 容器窗口安裝擴展。
安裝 C/C++ 擴展:
安裝 CMake Tools 擴展:
4、準(zhǔn)備編譯
在宿主機執(zhí)行以下命令,進(jìn)入 mysql 容器:
在 mysql 容器中執(zhí)行以下命令,下載源碼、安裝依賴軟件:
5、編譯
編譯過程按以下步驟進(jìn)行:
第 1 步,在 mysql 容器窗口中打開剛下載的 MySQL 源碼目錄:
第 2 步,創(chuàng)建 .vscode 目錄:
第 3 步,新建 CMake 配置文件 settings.json:
settings.json 文件內(nèi)容如下:
cmake.parallelJobs 用于控制多少個線程同時進(jìn)行編譯,以加快編譯速度,默認(rèn)值為 0,CMake 會根據(jù) CPU 核數(shù)自行確定并發(fā)線程數(shù)。
如果編譯過程中報以下錯誤,有兩種解決方案:
方案 1:把 cmake.parallelJobs 設(shè)置的小一點,我在編譯過程中把并發(fā)數(shù)設(shè)置為 10 會報錯,后來改為 8 就能成功編譯了。
方案 2:?在 Docker Desktop 中調(diào)整容器能夠使用的資源,如下:
想要編譯的更快,可以把 cmake.parallelJobs 設(shè)置為 0,然后,在以上 Docker Desktop 界面中,把 CPU、Memory 兩項調(diào)大。
第 4 步,CMake 配置?,生成 Makefile 文件:在 ?mysql 容器窗口?頂部的輸入框中,輸入 > CMake: 配置?,然后選擇下面列出來的 CMake 配置,開始生成 Makefile 文件。
選擇編譯器:
如果 CMake:配置執(zhí)行過程中出現(xiàn)了錯誤,解決錯誤之后需要刪除 CMakeCache.txt,然后重新執(zhí)行 CMake:配置步驟。
CMakeCache.txt 文件路徑為 /opt/data/code/8.0.32/output/CMakeCache.txt。
第 5 步,編譯服務(wù)端可執(zhí)行程序 mysqld:
在輸入框中輸入“> CMake: 生成目標(biāo)”,選中第 2 個紅框中的選項。
接著會出現(xiàn)另一個輸入框,在其中輸入 mysqld,然后回車,就開始編譯 mysqld 了。
第 6 步,編譯客戶端可執(zhí)行程序 mysql:
在輸入框中輸入“> CMake: 生成目標(biāo)”,選中第 2 個紅框中的選項。
接著會出現(xiàn)另一個輸入框,在其中輸入 mysql,然后回車,就開始編譯 mysql 了。
6、初始化
接下來,依然是在 mysql 容器中執(zhí)行以下命令:
7、調(diào)試
經(jīng)過前面一系列操作之后,就可以開始著手在 mysql 容器窗口中調(diào)試了。
第 1 步,新建配置文件 launch.json:
launch.json 文件內(nèi)容如下:
第 2 步,啟動調(diào)試,launch.json 文件配置完成之后,運行和調(diào)試下拉框就能看到剛剛添加的配置,點擊 (gdb) 啟動前面的小三角,啟動 MySQL,然后就可以開始調(diào)試了。
第 3 步,在 mysql 容器的命令行中,通過前面編譯的客戶端可執(zhí)行程序 mysql,連接 MySQL:
第 4 步,連接 MySQL 成功之后,在 MySQL 源碼中打個斷點,先打開 sql/sql_parse.cc 文件:
然后在 mysql_execute_command() 函數(shù)入口處打上斷點:
第 5 步,執(zhí)行一條 SQL:
程序在斷點處暫停之后,就可以查看一系列運行時信息了,查看斷點所在函數(shù)的局部變量:
查看斷點處的調(diào)用棧:
也可以在調(diào)試控制臺中,用命令行執(zhí)行更多 gdb 命令:
VSCode + Docker 調(diào)試,需要在命令之前加上 -exec,上圖中命令 p thd->m_query_string 前面就加上了 -exec。
8、總結(jié)
本文介紹了 VSCode + Docker + CentOS 7.9 搭建 MySQL 調(diào)試環(huán)境的完整流程。
本文轉(zhuǎn)載自微信公眾號「一樹一溪」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系一樹一溪公眾號。