日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

visual MySQL 教程_MySql轻松入门系列——第二站 使用visual studio 对mysql进行源码级调试...

發(fā)布時(shí)間:2023/11/27 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 visual MySQL 教程_MySql轻松入门系列——第二站 使用visual studio 对mysql进行源码级调试... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一:背景

1. 講故事

上一篇說(shuō)了mysql的架構(gòu)圖,很多同學(xué)反饋說(shuō)不過(guò)癮,畢竟還是聽我講故事,那這篇就來(lái)說(shuō)一說(shuō)怎么利用visual studio 對(duì) mysql進(jìn)行源碼級(jí)調(diào)試,畢竟源碼面前,不談隱私,圣人面前,皆為螻蟻。

二:工具合集

mysql是C++寫的,要想在windows上編譯,還需要下載幾個(gè)必備小工具。

mysql-5.7.12.zip

cmake-3.17.3-win64-x64.msi

boost_1_59_0.tar.gz

bison-2.4.1-setup.exe

windows 10 x64

這里簡(jiǎn)單說(shuō)一下:可以用cmake 將源碼生成 *.sln 可打開的解決方案,比如可以通過(guò)它最終生成 MySQL.sln。boost 是C++中非常強(qiáng)大的基礎(chǔ)庫(kù), bison 一個(gè)流行的語(yǔ)法分析器程序,用于給mysql提供語(yǔ)法分析,最后就是下載正確的mysql版本 5.7.12。

三. 詳細(xì)安裝

我會(huì)寫的比較細(xì),畢竟我也花了一下午時(shí)間,寒酸(┬_┬)

1. cmake-3.17.3-win64-x64.msi 和 bison-2.4.1-setup.exe

cmake 和 bison 安裝起來(lái)比較方便,一鍵安裝就可以了,不過(guò)這里有一個(gè)大坑注意了,在安裝Bison的時(shí)候,千萬(wàn)不要使用默認(rèn)路徑,因?yàn)槟J(rèn)路徑有空格,會(huì)導(dǎo)致你后面vs編譯的時(shí)候卡住,又不顯示什么原因,可氣!!! 所以我換成自定義的: C:\2\GnuWin32。

最后確保 cmake 和 bison 的bin文件都在 環(huán)境變量中即可。

2. mysql-5.7.12.zip

這里我用 C:\2作為根文件夾,所有的小工具都在這里,如圖:

接下來(lái)將 mysql-5.7.12.zip 解壓一下,然后進(jìn)入解壓后的文件夾,新建一個(gè)boost文件夾,將boost_1_59_0.tar.gz放入其中,然后再新建一個(gè) brelease 文件夾可用于存放最終生成的MySql.sln。😄😄😄。

3. cmake編譯

都準(zhǔn)備好了之后,可以開始cmake編譯了。

PS C:\2\mysql-5.7.12\brelease> cmake .. -DDOWNLOAD_BOOST=1 -DWITH_BOOST="C:\2\mysql-5.7.12\boost\boost_1_59_0.tar.gz"

-- Building for: Visual Studio 16 2019

CMake Deprecation Warning at CMakeLists.txt:26 (CMAKE_POLICY):

The OLD behavior for policy CMP0018 will be removed from a future version

of CMake.

-- Cannot find wix 3, installer project will not be generated

-- COMPILE_DEFINITIONS: _WIN32_WINNT=0x0601;WIN32_LEAN_AND_MEAN;NOGDI;NOMINMAX;HAVE_CONFIG_H

-- CMAKE_C_FLAGS: /DWIN32 /D_WINDOWS /W3 /MP /wd4800 /wd4805 /wd4996

-- CMAKE_CXX_FLAGS: /DWIN32 /D_WINDOWS /W3 /GR /EHsc /MP /wd4800 /wd4805 /wd4996 /we4099

-- CMAKE_C_FLAGS_DEBUG: /MTd /Z7 /Ob1 /Od /RTC1 /EHsc -DENABLED_DEBUG_SYNC -DSAFE_MUTEX

-- CMAKE_CXX_FLAGS_DEBUG: /MTd /Z7 /Ob1 /Od /RTC1 /EHsc -DENABLED_DEBUG_SYNC -DSAFE_MUTEX

-- CMAKE_C_FLAGS_RELWITHDEBINFO: /MT /Z7 /O2 /Ob1 /DNDEBUG /EHsc -DDBUG_OFF

-- CMAKE_CXX_FLAGS_RELWITHDEBINFO: /MT /Z7 /O2 /Ob1 /DNDEBUG /EHsc -DDBUG_OFF

-- Configuring done

-- Generating done

-- Build files have been written to: C:/2/mysql-5.7.12/brelease

當(dāng)看到最后一句 Build files have been written to: C:/2/mysql-5.7.12/brelease,恭喜你,MySQL.sln生成好了。

4. 打開 MySQL.sln 編譯項(xiàng)目

我的電腦安裝的是visual studio 2019,接下來(lái)打開MySql.Sln整體編譯,需要等個(gè)十幾分鐘,看到下面的輸出就算安裝成功。

三: 啟動(dòng)mysql并調(diào)試insert

1. mysql的初始化

這里要做兩件事情,第一件事是將mysql的調(diào)試模式打開,第二件事就是附加 --initialize 啟動(dòng)參數(shù)。

<1> mysql 調(diào)試模式打開

修改C:\2\mysql-5.7.12\sql\mysqld.cc中的 test_lc_time_sz方法中的 DBUG_ASSERT(0); 改成 DBUG_ASSERT(1); 如下圖:

<2> vs的command增加啟動(dòng)參數(shù)

上一篇大家都知道了,mysqld項(xiàng)目是mysql的啟動(dòng)項(xiàng)目,main函數(shù)也在其中,在F5調(diào)試之前增加初始化參數(shù) --console --initialize,如下圖:

2. 繼續(xù)入坑出坑

啟動(dòng)之后,有103個(gè)報(bào)錯(cuò),氣人呀。。。看錯(cuò)誤信息應(yīng)該是編碼問(wèn)題,如下圖:

修改起來(lái)也很簡(jiǎn)單,將 C:\2\mysql-5.7.12\sqlsql_locale.cc 用 [utf-8 + BOM] 格式保存一下,然后對(duì)mysqld項(xiàng)目Rebuild再Ctrl+F5直接運(yùn)行,終于謝天謝地,從輸出可以看到,搞定啦。。。太不容易啦。

從上圖中可以看到,默認(rèn)密碼是:zJDE>IC5o+ya,先記錄下這個(gè)密碼,然后再把CommandLine Arguments 中的--initialize去掉再重啟Console。

可以看到,3306端口已開啟,然后用剛才的 zJDE>IC5o+ya 連接即可,這里我使用navicat。

連接上去后會(huì)提示修改默認(rèn)密碼,設(shè)置我就設(shè)置為: 123456 ,😁😁嘿嘿,一切搞定~~~

3. 繼續(xù)追蹤 write_row

上一篇我們追蹤到了 write_row 就斷掉了,我當(dāng)時(shí)說(shuō)它是一個(gè)虛方法,由底層具體的存儲(chǔ)引擎去調(diào)用,代碼如下:

int handler::ha_write_row(uchar *buf)

{

MYSQL_TABLE_IO_WAIT(m_psi, PSI_TABLE_WRITE_ROW, MAX_KEY, 0,{ error= write_row(buf); })

}

//這是一個(gè)虛方法

virtual int write_row(uchar *buf __attribute__((unused)))

{

return HA_ERR_WRONG_COMMAND;

}

到底這話虛不虛,這次我親自調(diào)試一下給大家看看,證據(jù)先行哈。。。為了方便,我生成一條創(chuàng)表sql。

drop database if exists `datamip`;

create database `datamip`;

drop table if exists `datamip`.`customer`;

create table `datamip`.`customer` (

`customerID` int NOT NULL AUTO_INCREMENT COMMENT '自增主鍵',

`customerName` varchar(50) COMMENT '用戶姓名',

`email` varchar(50) COMMENT '郵箱地址',

`desc` varchar(50) COMMENT '描述',

primary key (`customerID`)

) ENGINE=InnoDB charset=utf8 collate=utf8_bin;

接下來(lái),大家看仔細(xì)了,在源碼 int handler::ha_write_row(uchar *buf) 方法處下一個(gè)斷點(diǎn),然后F5調(diào)試應(yīng)用程序。

接下來(lái)可以執(zhí)行insert操作,這地方會(huì)命中斷點(diǎn)的。

insert into `datamip`.`customer`(customerName,email,`desc`) values('mary','123456789@qq.com','vip');

可以看到,斷點(diǎn)命中了,然后進(jìn)行單步調(diào)試,最終你會(huì)看到代碼會(huì)進(jìn)入到 C:\2\mysql-5.7.12\storage\innobase\handler\ha_innodb.cc中的 int ha_innobase::write_row 方法,如下圖:

然后找?guī)讉€(gè)局部變量和調(diào)用堆棧看看。。。

四: 總結(jié)

這就是我花了一下午的時(shí)間總結(jié)出的進(jìn)坑出坑指南,希望能幫助大家節(jié)省時(shí)間,還是那句話,源碼面前,不談隱私,若還能進(jìn)行調(diào)試,那一切皆為螻蟻!

來(lái)源:oschina

鏈接:https://my.oschina.net/u/135083/blog/4306379

總結(jié)

以上是生活随笔為你收集整理的visual MySQL 教程_MySql轻松入门系列——第二站 使用visual studio 对mysql进行源码级调试...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。