使用visual studio 對mysql進行源碼級調試

2021-02-21 碼農讀書

一:背景1. 講故事

上一篇說了mysql的架構圖,很多同學反饋說不過癮,畢竟還是聽我講故事,那這篇就來說一說怎麼利用visual studio 對 mysql進行源碼級調試,畢竟源碼面前,不談隱私,聖人面前,皆為螻蟻。

二:工具合集

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

這裡簡單說一下:可以用cmake 將源碼生成 *.sln 可打開的解決方案,比如可以通過它最終生成 MySQL.sln。boost 是C++中非常強大的基礎庫, bison 一個流行的語法分析器程序,用於給mysql提供語法分析,最後就是下載正確的mysql版本 5.7.12。

三. 詳細安裝

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

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

cmake 和 bison 安裝起來比較方便,一鍵安裝就可以了,不過這裡有一個大坑注意了,在安裝Bison的時候,千萬不要使用默認路徑,因為默認路徑有空格,會導致你後面vs編譯的時候卡住,又不顯示什麼原因,可氣!!!所以我換成自定義的: C:\2\GnuWin32。

最後確保 cmake 和 bison 的bin文件都在 環境變量中即可。

2. mysql-5.7.12.zip

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

接下來將 mysql-5.7.12.zip 解壓一下,然後進入解壓後的文件夾,新建一個boost文件夾,將boost_1_59_0.tar.gz放入其中,然後再新建一個 brelease 文件夾可用於存放最終生成的MySql.sln。😄😄😄。

3. cmake編譯

都準備好了之後,可以開始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

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

4. 打開 MySQL.sln 編譯項目

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

三:啟動mysql並調試insert1. mysql的初始化

這裡要做兩件事情,第一件事是將mysql的調試模式打開,第二件事就是附加 --initialize 啟動參數。

<1> mysql 調試模式打開

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

<2> vs的command增加啟動參數

上一篇大家都知道了,mysqld項目是mysql的啟動項目,main函數也在其中,在F5調試之前增加初始化參數 --console --initialize,如下圖:

2. 繼續入坑出坑

啟動之後,有103個報錯,氣人呀。。。看錯誤信息應該是編碼問題,如下圖:

修改起來也很簡單,將 C:\2\mysql-5.7.12\sqlsql_locale.cc 用 [utf-8 + BOM] 格式保存一下,然後對mysqld項目Rebuild再Ctrl+F5直接運行,終於謝天謝地,從輸出可以看到,搞定啦。。。太不容易啦。

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

可以看到,3306埠已開啟,然後用剛才的 zJDE>IC5o+ya 連接即可,這裡我使用navicat。

連接上去後會提示修改默認密碼,設置我就設置為: 123456 ,😁😁嘿嘿,一切搞定~~~

3. 繼續追蹤 write_row

上一篇我們追蹤到了 write_row 就斷掉了,我當時說它是一個虛方法,由底層具體的存儲引擎去調用,代碼如下:


int handler::ha_write_row(uchar *buf)
{
MYSQL_TABLE_IO_WAIT(m_psi, PSI_TABLE_WRITE_ROW, MAX_KEY, 0,{ error= write_row(buf); })
}

//這是一個虛方法
virtual int write_row(uchar *buf __attribute__((unused))){
return HA_ERR_WRONG_COMMAND;
}

到底這話虛不虛,這次我親自調試一下給大家看看,證據先行哈。。。為了方便,我生成一條創表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;

接下來,大家看仔細了,在源碼 int handler::ha_write_row(uchar *buf) 方法處下一個斷點,然後F5調試應用程式。

接下來可以執行insert操作,這地方會命中斷點的。


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

可以看到,斷點命中了,然後進行單步調試,最終你會看到代碼會進入到 C:\2\mysql-5.7.12\storage\innobase\handler\ha_innodb.cc中的 int ha_innobase::write_row 方法,如下圖:

然後找幾個局部變量和調用堆棧看看。。。

四:總結

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

相關焦點

  • 用Visual Studio調試Linux程序
    使用Visual Studio+VisualGDB調試遠程linux程序需要工具:Visual Studio 2013或以上版本(以下簡稱VS)VisualGDB(一款VS插件,官網為:http://visualgdb.com/)含有調試符號的linux程序文件(該程序文件為調試目標)Visual Assistant(番茄助手
  • 12個Visual Studio調試效率技巧
    在這篇文章中,我們假定讀者了解VS基本的調試知識,如:F11 步進到函數內(如果當前程序指針指向一個函數)調試窗口:局部變量、監視、即時窗口、模塊、調用堆棧、異常設置許多開發人員使用這個功能強大的工具包來處理調試會話。
  • Visual Studio 2018
    1017.23KB 版本: 15.5 正式版 *使用豌豆莢官方商店能下載目標軟體
  • visual studio 2013下載及安裝使用教程(內附vs2013產品密鑰)
    為了是大家對visual studio有更多的選擇性,IT考試網特意整理了visual studio 2013下載及安裝使用教程(內附vs2013產品密鑰)供大家學習,切勿商用!1、visual studio 2013下載(內附vs2013產品密鑰)2、visual studio 2013安裝使用教程3、visual studio提示系統找不到指定文件怎麼辦4、visual studio 2013使用聲明一、visual studio 2013下載(內附vs2013產品密鑰)
  • Visual Studio Code 4 月 Python 擴展更新
    這意味著可以將所有交互式繪圖庫(例如 beakerX、bqplot 等)與 Notebooks 和 VS Code 中的數據進行交互及可視化。對應用程式進行編輯時,無需重新啟動調試器即可進行應用。保存更改後,將在相同的調試會話中自動重新加載 Web 伺服器。
  • visual studio 2013 設置中文
    人多第一次下載visual studio 2013的人發現自己的visual studio 2013是英文的不知道如何設置語言本文教大家設置打開VS2013,發現界面是英文的我們進行設置為中文--------Options.....
  • visual studio 2005 team suite中文版到
    微軟visual studio 2005 team suite中文版FPP是2005 年發布的一個面向團隊的開發軟體,其提供支持整個軟體開發團隊的工具,讓架構師、開發人員、測試人員、項目管理等人員的工作能夠簡化,同時提高團隊的工作效率,讓開發工作得到有效的監控,是一個非常優秀的高度集成開發環境。目前,商家對其報價為56000元,有需求的朋友不妨考慮下。
  • 微軟Visual Studio 2019 v16.7 Preview 2 發布
    還可以設置默認遠程連接以通過 $ {defaultRemoteMachineName} 在 CMakeSettings.json 和 launch.vs.json 中使用。當編輯遠程連接時,Visual Studio 將不再需要將標頭重新複製到 Windows 以獲得本機 IntelliSense 體驗。
  • visual studio 2015怎麼把英文界面變成中文?
    visual studio 2015怎麼把英文界面變成中文界面?最新的vs2015,剛下載下來時是全英文界面,如何將它改成中文界面呢。下面介紹一下詳細的教程,需要的朋友可以參考下最新的vs2015,剛下載下來時是全英文界面,如何將它改成中文界面呢。
  • visual studio 2012建立工程實戰
    【IT168技術】隨著2012年8月份,微軟正式推出了visual studio 2012,其中asp.net mvc4和asp.net web api也正式與廣大開發者見面了。
  • Microsoft Visual Studio
    這周為大家安利微軟公司的兩個經典版本的編譯開發環境軟體,visual C++6.0.本來我不太想放上去的,主要是看到後臺回復的有點兇,就花了點時間搜集並測試了一下
  • 微軟VS Code 或將取代 Visual Studio!
    作者 | 琥珀對於前端來講,使用微軟的Visual Studio Code 以提高開發效率簡直就是一款無比性感的神器。「免費」、「開源」、「顏值高」、「比atom更快」、「比webstorm更輕」……這均是開發者給出的最高評價。
  • 微軟將 Visual Studio Online 重命名為 Visual Studio Codespaces
    詳情查看 https://azure.microsoft.com/en-us/pricing/details/visual-studio-online/還有一個值得一提的功能是對自託管環境功能的巨大改進。
  • Visual Studio Natvis調試框架應用
    在開發者日常編碼工作中,說是三分編碼七分調試並不過分,提升效率自然離不開好用的調試器.但是調試器也不是萬能的,C++開發者會使用或者定義很多類型,默認情況下調試器並不能很直觀地顯示這些類型的信息.譬如以下示例:class UserInfo{public:
  • 超好用的Visual Studio編程軟體,你在用嗎?
    visual studio不僅可以編寫C,C++,還可以編寫python,還可寫網頁等等語言,功能很強大。再次記錄下來,以便查看。1.搜索「visual studio」打開官網,點擊下載,我選擇的是community版本2.
  • 技巧:Ubuntu中安裝Visual Studio Code
    使用Ubuntu Make來安裝Visual Studio Code。據了解,Ubuntu Make是以前Ubuntu開發者工具中心,作為一個命令行工具可以幫助用戶快速安裝各種開發工具、語言和IDE。
  • Visual Studio Code 7 月 Python 擴展更新
    用戶無需手動刪除未使用的導入內容或不相關的代碼即可清理 Notebook。Gather 的最終文件格式可以使用 VS Code 設置 「Data Science: Gather To Script」 進行自定義。
  • 小技巧 | 在 Android Studio 調試應用 (上)
    正因如此,最近我們找機會了解了 Android Studio 團隊在提升調試速度方面使用的一些技巧。接下來,我們會為您一一呈現那些我們認為最好的、節省您時間的、且方便與您的調試流程整合的小技巧。雖然您的應用可能與本文假想中的示例應用大相逕庭,但是本文所介紹的小竅門可以用在任何應用的開發上。本文分為上下兩篇,本篇為上篇。我們從經典調試法 —— printf 語句的一個小竅門說起。
  • 程式設計師請收好:10個非常有用的 Visual Studio Code 插件!
    正確的工具使用則可以幫助你實現這個目標。如果你選擇使用Visual Code作為IDE,你就可以使它符合你的偏好選擇。實現此目的的一種方法是安裝正確的插件。為了讓你的生活儘可能的簡單,你可以添加很多你想要的內容。你使用的插件將會對你的工作效率以及工作方式產生很大的影響。這就是為什麼我們要運用Visual Studio Code插件列表的原因。
  • 使用pdb進行Python調試
    調試程序有時會很令人頭疼。有時候是你忙於工作時間緊張,只想讓它儘快成功;有時候是你正在學習一種新的語言,或者試驗使用新的方法,並且希望更深入地了解某些功能是如何工作的。無論是哪種情況,調試代碼都是必需的,所以在調試器中工作是一個好主意。在本教程中,我將向你展示Python的交互式代碼調試器pdb的基礎知識。我會帶你了解pdb的一些常見用法。