1)在eclipse中建立一個c++ empty project。
創(chuàng)新互聯(lián)公司是一家以網(wǎng)站建設(shè)公司、網(wǎng)頁設(shè)計、品牌設(shè)計、軟件運維、成都網(wǎng)站營銷、小程序App開發(fā)等移動開發(fā)為一體互聯(lián)網(wǎng)公司。已累計為成都資質(zhì)代辦等眾行業(yè)中小客戶提供優(yōu)質(zhì)的互聯(lián)網(wǎng)建站和軟件開發(fā)服務(wù)。
2)選中上面建立的project,新建文件夾,引入代碼。
3)設(shè)置編譯源目錄Build directory,即cmake生成的Makefile所在的目錄。
前幾天看到姜老師的舊文 用 VSCode 編譯和調(diào)試 MySQL,每個 DBA 都應(yīng) get 的小技能[1] , 文末留了一個思考題,如何修改源碼,自定義版本,使得 select version() 輸出自定義內(nèi)容
調(diào)試過程參考 macOS VSCode 編譯調(diào)試 MySQL 5.7[2]
內(nèi)部 Item 對象參考 從SQL語句到MySQL內(nèi)部對象[3]
源碼面前沒有秘密,建義對 DB 感興趣的嘗試 debug 調(diào)試。本文環(huán)境為 mac + vscode + lldb
vscode 插件:
mysql 源碼:
補?。? MySQL = 8.0.21 需要對 cmake/mysql_version.cmake 文件打補丁 (沒有嚴(yán)格測試所有版本)
創(chuàng)建 cmake-build-debug 目錄,后續(xù) mysql 編譯結(jié)果,以及啟動后生成的文件都在這里
在 mysql 工程目錄下面創(chuàng)建 .vscode/settings.json 文件
內(nèi)容沒啥好說的,都是指定目錄及 boost 配置,其中 WITH_DEBUG 打開 debug 模式,會在 /tmp/debug.trace 生成 debug 信息
View - Command Palette - CMake: Configure 執(zhí)行后生成 cmake 配置
View - Command Palette - CMake: Build 編譯生成最終 mysql 相關(guān)命令
發(fā)現(xiàn)老版本編譯很麻煩,各種報錯,mysql 5.7 代碼量遠(yuǎn)超過 5.5, 只能硬著頭皮看 5.7
首先初始化 my.cnf 配置,簡單的就可以,共它均默認(rèn)
初始化數(shù)據(jù)文件,非安全模式,調(diào)試用
由于用 vscode 接管 mysql, 所以需要配置 .vscode/launch.json
然后點擊 run and debug mysqld
mysql 啟動,看到輸出日志無異常,此時可以用 mysql-client 連接
首先在 sql_parser.cc:5435 處打斷點
mysql_parse 是 sql 處理的入口,至于 tcp connection 連接先可以忽略
執(zhí)行上述 sql 自動跳轉(zhuǎn)到斷點處, Step Into , Step Over , Step Out 這些調(diào)試熟悉下即可
接下來分別調(diào)用主要函數(shù): mysql_execute_command , execute_sqlcom_select , handle_query , select-join-exec() , Query_result_send::send_data , Item::send , Item_string:val_str , Protocol_text::store , net_send_ok
啟動 mysql 時 init_common_variables 會初始化一堆變量,其中會調(diào)用 set_server_version 生成版本信息,修改這個就可以
看好條件編譯的是哪塊,修改即可, 重新 CMake: Build 編譯再運行
這里不做過深分析,簡單講
sql_yacc.cc 函數(shù) PTI_function_call_generic_ident_sys 解析 sql, 識別出 version() 是一個函數(shù)調(diào)用
find_native_function_builder 查找 hash 表,找到對應(yīng) version 函數(shù)注冊的單例工廠函數(shù)
mysql 啟動時調(diào)用 item_create_init 將這些函數(shù) builder 注冊到 hash 表 native_functions_hash
MySQL 代碼太龐大,5.1 大約 100w 行,5.5 130w 行,5.7 以后 330w 行,只能挑重點讀源碼。最近很多群里的人在背八股,沒必要,有那時間學(xué)著調(diào)試下源碼,讀讀多好
原文出處:
用vs code 就可以了。
Visual Studio Code
Visual Studio Code(簡稱VS Code)是由微軟開發(fā)的,同時支持Windows、Linux和macOS操作系統(tǒng)的開源文本編輯器。它支持調(diào)試,內(nèi)置了Git 版本控制功能,同時也具有開發(fā)環(huán)境功能,例如代碼補全(類似于IntelliSense)、代碼片段、代碼重構(gòu)等。該編輯器支持用戶自定義配置,例如改變主題顏色、鍵盤快捷方式、編輯器屬性和其他參數(shù),還支持?jǐn)U展程序并在編輯器中內(nèi)置了擴展程序管理的功能。
安裝LLDB
LLDB是LLVM編譯器的一部分,推薦使用Homebrew安裝LLVM工具集,不建議使用系統(tǒng)自帶的LLDB,安裝前必須先創(chuàng)建證書否則無法安裝,步驟如下:
創(chuàng)建完成后,開始安裝LLVM
brew install llvm --with-python@2?--with-lldb
安裝插件
VS Code自帶有debug功能,這里我推薦使用LLDB Debugger插件。
?接下來,為項目配置調(diào)試參數(shù)。
配置調(diào)試參數(shù)
使用VS Code打開MySQL源碼目錄,在側(cè)邊欄選擇debug欄目,添加配置,program輸入需要調(diào)試的程序路徑,這里選擇你編譯好的mysqld路徑,args輸入程序啟動所需的參數(shù),通常會指定mysqld的配置文件。這樣就配置好了,是不是很簡單。
啟動調(diào)試
點擊啟動按鈕,啟動后如果沒有設(shè)置斷點會mysqld會正常啟動,如果觸發(fā)了斷點會如下圖顯示。
整個調(diào)試窗口基本分為六部分,所有的調(diào)試操作都在這里完成:
1:?顯示變量信息
2:?設(shè)置重點關(guān)注的變量
3:?顯示調(diào)用棧信息
4:?設(shè)置斷點信息,在代碼行號前也可以設(shè)置斷點
5:?代碼顯示區(qū)域,上方是調(diào)試按鈕,包括 continue/stepover/step in/step out/restart/stop
6:?調(diào)試終端輸入輸出區(qū)
斷點設(shè)置
在代碼行號前點擊即可在該行為設(shè)置斷點,也可以根據(jù)條件設(shè)置斷點。以設(shè)置ConditionalBreakpoint為例,當(dāng)程序啟動后會按照你設(shè)置的條件表達(dá)式判斷是否觸發(fā)斷點。
Conditional Breakpoint這種方式用在目標(biāo)變量達(dá)到某條件時觸發(fā)斷點,其余則跳過繼續(xù)執(zhí)行。比如:設(shè)置變量等于目標(biāo)表名時觸發(fā)斷點,其余表則跳過,相對函數(shù)名斷點省去很多手工跳過操作。
遠(yuǎn)程調(diào)試
假如你想調(diào)試遠(yuǎn)程Linux服務(wù)器上的MySQL上面的方法就不合適了,這時需要遠(yuǎn)程調(diào)試。lldb和gdb都支持遠(yuǎn)程調(diào)試,這里以lldb為例。
需要先在遠(yuǎn)程主機上安裝lldb,使用yum安裝,源地址在這里
remote$ yum install -y llvm-toolset-7
安裝完成后,啟動lldb-server
remote$ /opt/rh/llvm-toolset-7/root/usr/bin/lldb-serverplatform --listen?"*:9191"?--server
接下來,在VS Code調(diào)試界面中新增配置項。
{
"type":?"lldb",
"request":?"attach",
"name":?"Remote attach",
"program":?"~/mysql5626/usr/local/mysql/bin/mysqld",
"pid":"target_pid",
"initCommands": [
"platform select remote-linux",
"platform connect connect://remote_host:9191"
],
"sourceMap": {
"/export/home/pb2/build/sb_0-15908961-1436910670.17/mysql-5.6.26":?"/Users/hongbin/workbench/mysql-server"
}
},
program:?本機也要拷貝一份目標(biāo)程序,加載
pid:?填寫遠(yuǎn)程主機的mysqld進(jìn)程id
sourceMap:?填寫mysqld編譯的代碼路徑與本機代碼庫路徑的映射,這樣調(diào)試時代碼才可以和程序關(guān)聯(lián)在一起看
注意:記得調(diào)試前將代碼切換到與目標(biāo)程序版本一致的branch
mysql源碼調(diào)用引擎步驟:
1、打開mysql的命令行。
2、輸入數(shù)據(jù)庫密碼。
3、查詢默認(rèn)數(shù)據(jù)庫引擎。
4、默認(rèn)的引擎是InnoDB,修改即可。
由于在寫MySQL日志訂閱服務(wù)時候,需要確定在什么event之后保存position,所以就開始研究MySQL的源碼,剛開始采用最原始的打印輸出的方式去調(diào)試,然后每次改完編譯運行,效率好低,讓我很絕望,然后我花了些時間研究下怎么使用CLion Debug MySQL。
獲取源碼
git clone
編譯安裝初始化數(shù)據(jù)庫
cd mysql-server
cmake \
-DCMAKE_INSTALL_PREFIX=/path/mysql/install \
-DMYSQL_DATADIR=/path/mysql/data \
-DSYSCONFDIR=/path/mysql/etc \
-DMYSQL_UNIX_ADDR=/path/mysql/mysql.sock \
-DWITH_DEBUG=1 \
-DDOWNLOAD_BOOST=1 -DWITH_BOOST=/path/mysql-server/ -DDOWNLOAD_BOOST_TIMEOUT=60000
make -j 4
make install -j 4
mysqld --initialize-insecure --user=root --datadir=/path/mysql/data
啟動MySQL,測試下是否安裝成功
/path/install/bin/mysqld --defaults-file=/path/mysql/etc/my.cnf
使用CLion新建工程并打開源碼目錄之后,設(shè)置CLion
CMake Options和你編譯安裝時的選項一致
-DCMAKE_INSTALL_PREFIX=/path/mysql/install
-DMYSQL_DATADIR=/path/mysql/data
-DSYSCONFDIR=/path/mysql/etc
-DMYSQL_UNIX_ADDR=/path/mysql/mysql.sock
-DWITH_DEBUG=1
然后在CLion里,Reload CMake Project
在Run/Debug列表里就可以看到很多選項了
找到mysqld配置下啟動參數(shù)
mysqld --defaults-file=/path/mysql/etc/my.cnf
然后以Debug模式啟動,看下成功的效果
本文標(biāo)題:mysql源碼怎么調(diào)試 mysql函數(shù)調(diào)試
本文來源:http://aaarwkj.com/article40/dooogho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、網(wǎng)站維護(hù)、網(wǎng)站導(dǎo)航、做網(wǎng)站、網(wǎng)站營銷、域名注冊
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)