《C/C++代碼調(diào)試的藝術(shù)》圍繞C/C++程序調(diào)試這一主題,系統(tǒng)深入地介紹了在Windows和Linux操作系統(tǒng)上如何高效地調(diào)試C/C++程序。
《C/C++代碼調(diào)試的藝術(shù)》分為11章,內(nèi)容涵蓋了程序調(diào)試的基本知識(shí)、Visual C++調(diào)試程序的基本功能與技巧、Linux系統(tǒng)中g(shù)db工具的使用、死鎖調(diào)試、動(dòng)態(tài)庫(kù)調(diào)試、內(nèi)存泄漏檢查、遠(yuǎn)程調(diào)試、崩潰轉(zhuǎn)儲(chǔ)文件分析、發(fā)行版調(diào)試,以及調(diào)試的高級(jí)話題和調(diào)試擴(kuò)展方面的知識(shí)。
《C/C++代碼調(diào)試的藝術(shù)》作為學(xué)習(xí)C/C++調(diào)試技術(shù)的重要資料,講解通俗易懂,選取的示例注重理論與實(shí)際的聯(lián)系。無(wú)論是C/C++的初學(xué)者,還是經(jīng)驗(yàn)豐富的開(kāi)發(fā)人員,都會(huì)從中受益。
·本書(shū)以Windows和Linux系統(tǒng)為平臺(tái),介紹了C/C++程序的代碼調(diào)試和分析的基本操作以及相應(yīng)技巧。
·此外,本書(shū)還以真實(shí)程序中經(jīng)常出現(xiàn)的一些問(wèn)題,比如死鎖、動(dòng)態(tài)庫(kù)調(diào)試、內(nèi)存檢查、崩潰轉(zhuǎn)儲(chǔ)文件分析等,進(jìn)行了詳細(xì)介紹,并給出了相應(yīng)的解決方案。
·本書(shū)注重理論與實(shí)際的聯(lián)系,所選示例通俗易懂,適合每一位想要提升C/C++代碼調(diào)試技能的人員閱讀。
·其他編程語(yǔ)言的開(kāi)發(fā)人員也可以觸類(lèi)旁通,將書(shū)中學(xué)到的代碼調(diào)試之道用于自己的日常編程工作中。
·提供源代碼。
所謂代碼調(diào)試,是指在將編寫(xiě)的代碼投入實(shí)際運(yùn)行之前,用手工或編譯程序等方法進(jìn)行測(cè)試,修正程序代碼中的語(yǔ)法錯(cuò)誤和邏輯錯(cuò)誤的過(guò)程。代碼調(diào)試對(duì)成功的程序開(kāi)發(fā)來(lái)說(shuō)至關(guān)重要。無(wú)論是資深的程序開(kāi)發(fā)人員,還是開(kāi)發(fā)新人,在編碼過(guò)程中都需要通過(guò)調(diào)試代碼來(lái)確保程序的正確性,確保執(zhí)行結(jié)果符合預(yù)期。然而,代碼調(diào)試絕非是一朝一夕就可以掌握的程序開(kāi)發(fā)技能。
本書(shū)包含如下內(nèi)容:
C/C++調(diào)試基本知識(shí)
Visual C++調(diào)試基本功能
Linux系統(tǒng)gdb調(diào)試基本功能
多線程死鎖調(diào)試
調(diào)試動(dòng)態(tài)庫(kù)
內(nèi)存檢查
遠(yuǎn)程調(diào)試
轉(zhuǎn)儲(chǔ)文件調(diào)試分析
發(fā)行(Release)版調(diào)試
調(diào)試高級(jí)話題
調(diào)試擴(kuò)展知識(shí)
張海洋,清華大學(xué)計(jì)算機(jī)專(zhuān)業(yè)畢業(yè),曾在外企工作10多年,現(xiàn)為云塢科技聯(lián)合創(chuàng)始人,已經(jīng)在國(guó)內(nèi)外申請(qǐng)軟件發(fā)明專(zhuān)利10多件,從事軟件開(kāi)發(fā)近20年,長(zhǎng)期工作在開(kāi)發(fā)第一線。精通C/C++、Python等語(yǔ)言,在Windows驅(qū)動(dòng)、Linux驅(qū)動(dòng)、Windows/Linux系統(tǒng)開(kāi)發(fā)、調(diào)試方面具有豐富的經(jīng)驗(yàn)。
第 1章 C/C++調(diào)試基本知識(shí) 1
1.1 BUG與Debug 1
1.2 為什么選擇C/C++ 3
1.3 什么是調(diào)試器 4
第 2章 Visual C++調(diào)試基本功能 5
2.1 Visual C++簡(jiǎn)介 5
2.1.1 VC 2019版本選擇 7
2.1.2 VC 2019安裝 9
2.2 斷點(diǎn)管理 10
2.2.1 設(shè)置/刪除斷點(diǎn) 10
2.2.2 禁用斷點(diǎn) 11
2.2.3 查看所有斷點(diǎn) 11
2.3 調(diào)試執(zhí)行 14
2.3.1 啟動(dòng)調(diào)試 14
2.3.2 逐語(yǔ)句執(zhí)行 15
2.3.3 逐過(guò)程執(zhí)行 17
2.3.4 跳出執(zhí)行 17
2.3.5 運(yùn)行到光標(biāo)處 17
2.3.6 多次執(zhí)行代碼 18
2.4 監(jiān)視/快速監(jiān)視 20
2.4.1 快速監(jiān)視 20
2.4.2 監(jiān)視窗口 21
2.4.3 表達(dá)式支持 23
2.5 內(nèi)存查看 25
2.5.1 字符串內(nèi)存布局 26
2.5.2 整型變量?jī)?nèi)存布局 27
2.6 通過(guò)“局部變量”窗口和“自動(dòng)”窗口查看變量 28
2.6.1 “局部變量”窗口查看變量 28
2.6.2 “自動(dòng)”窗口查看變量 30
2.7 即時(shí)窗口 31
2.7.1 顯示變量的值 31
2.7.2 執(zhí)行內(nèi)嵌函數(shù) 32
2.8 調(diào)用堆!32
2.8.1 調(diào)用堆;拘畔ⅰ33
2.8.2 設(shè)置符號(hào)信息 33
2.9 多線程管理 36
2.9.1 創(chuàng)建多線程測(cè)試項(xiàng)目 36
2.9.2 開(kāi)始調(diào)試多線程程序 37
2.10 查看錯(cuò)誤碼 40
2.11 調(diào)試宏Assert使用 43
2.11.1 Assert宏簡(jiǎn)介 44
2.11.2 使用Assert宏的注意事項(xiàng) 45
2.12 其他 46
2.12.1 編輯并繼續(xù)調(diào)試 46
2.12.2 字符串可視化工具 47
2.12.3 條件斷點(diǎn) 48
2.12.4 函數(shù)斷點(diǎn) 51
2.12.5 數(shù)據(jù)斷點(diǎn) 52
2.12.6 VC調(diào)試常用快捷鍵和組合鍵列表 55
第3章 Linux系統(tǒng)gdb調(diào)試基本功能 57
3.1 Linux C/C++編程基本知識(shí) 57
3.1.1 開(kāi)發(fā)環(huán)境安裝 58
3.1.2 開(kāi)發(fā)第 一個(gè)C/C++程序 61
3.2 gdb簡(jiǎn)介 68
3.2.1 gdb的安裝 69
3.2.2 gdb常用功能概覽 70
3.3 調(diào)試執(zhí)行 71
3.3.1 啟動(dòng)調(diào)試 71
3.3.2 啟動(dòng)調(diào)試并添加參數(shù) 74
3.3.3 附加到進(jìn)程 75
3.4 斷點(diǎn)管理 77
3.4.1 設(shè)置斷點(diǎn) 77
3.4.2 啟用/禁用斷點(diǎn) 86
3.4.3 啟用斷點(diǎn)一次 87
3.4.4 啟用斷點(diǎn)并刪除 88
3.4.5 啟用斷點(diǎn)并命中N次 89
3.4.6 忽略斷點(diǎn)前N次命中 90
3.4.7 查看斷點(diǎn) 90
3.4.8 刪除斷點(diǎn) 91
3.5 程序執(zhí)行 92
3.5.1 啟動(dòng)程序 92
3.5.2 繼續(xù)運(yùn)行 93
3.5.3 繼續(xù)運(yùn)行并跳過(guò)當(dāng)前斷點(diǎn)N次 94
3.5.4 繼續(xù)運(yùn)行直到當(dāng)前函數(shù)執(zhí)行完成 94
3.5.5 單步執(zhí)行 95
3.5.6 逐過(guò)程執(zhí)行 96
3.6 查看當(dāng)前函數(shù)參數(shù) 96
3.7 查看/修改變量的值 97
3.7.1 使用gdb內(nèi)嵌函數(shù) 98
3.7.2 查看結(jié)構(gòu)體/類(lèi)的值 99
3.7.3 查看數(shù)組 101
3.8 自動(dòng)顯示變量的值 102
3.9 顯示源代碼 104
3.10 查看內(nèi)存 106
3.11 查看寄存器 109
3.12 查看調(diào)用!111
3.12.1 查看;厮菪畔ⅰ112
3.12.2 切換棧幀 113
3.12.3 查看幀信息 115
3.13 線程管理 116
3.13.1 查看所有線程信息 118
3.13.2 切換線程 118
3.13.3 為線程設(shè)置斷點(diǎn) 119
3.13.4 為線程執(zhí)行命令 120
3.14 其他 121
3.14.1 觀察點(diǎn) 121
3.14.2 捕獲點(diǎn) 124
3.14.3 搜索源代碼 126
3.14.4 查看變量類(lèi)型 127
3.14.5 跳轉(zhuǎn)執(zhí)行 130
3.14.6 窗口管理 132
3.14.7 調(diào)用Shell命令 133
3.14.8 assert宏使用 134
3.14.9 gdb常用命令列表 136
第4章 多線程死鎖調(diào)試 141
4.1 創(chuàng)建多線程 142
4.2 多線程的同步 144
4.3 C++標(biāo)準(zhǔn)庫(kù)中的鎖 146
4.3.1 std::mutex類(lèi) 147
4.3.2 std::timed_mutex類(lèi) 149
4.3.3 std::recursive_mutex和std::recursive_timed_mutex 149
4.4 死鎖調(diào)試 150
4.4.1 Windows死鎖調(diào)試 151
4.4.2 Linux系統(tǒng)中的死鎖調(diào)試 153
4.4.3 死鎖條件 156
4.4.4 解決死鎖 157
第5章 調(diào)試動(dòng)態(tài)庫(kù) 160
5.1 Windows系統(tǒng)動(dòng)態(tài)庫(kù)開(kāi)發(fā)與調(diào)試 161
5.1.1 創(chuàng)建動(dòng)態(tài)庫(kù) 161
5.1.2 使用動(dòng)態(tài)庫(kù) 164
5.1.3 調(diào)試動(dòng)態(tài)庫(kù) 165
5.2 Linux系統(tǒng)動(dòng)態(tài)庫(kù)開(kāi)發(fā)與調(diào)試 170
5.2.1 創(chuàng)建動(dòng)態(tài)庫(kù) 171
5.2.2 使用動(dòng)態(tài)庫(kù) 174
5.2.3 調(diào)試動(dòng)態(tài)庫(kù) 177
第6章 內(nèi)存檢查 183
6.1 VC調(diào)試器和C/C++內(nèi)存檢查機(jī)制 183
6.1.1 內(nèi)存泄漏測(cè)試程序 184
6.1.2 使用VC運(yùn)行時(shí)庫(kù)函數(shù)來(lái)檢測(cè)內(nèi)存泄漏 186
6.1.3 檢測(cè)堆內(nèi)存破壞(堆溢出) 193
6.1.4 其他調(diào)試函數(shù) 197
6.2 Linux系統(tǒng)內(nèi)存檢查 198
6.2.1 檢查內(nèi)存泄漏 198
6.2.2 檢查堆溢出 200
6.2.3 檢查棧溢出 201
6.2.4 檢查全局內(nèi)存溢出 202
6.2.5 檢查釋放后繼續(xù)使用 203
第7章 遠(yuǎn)程調(diào)試 205
7.1 遠(yuǎn)程調(diào)試簡(jiǎn)介 205
7.2 Visual C++遠(yuǎn)程調(diào)試 206
7.2.1 準(zhǔn)備測(cè)試程序 206
7.2.2 準(zhǔn)備目標(biāo)機(jī)環(huán)境 206
7.2.3 啟動(dòng)遠(yuǎn)程調(diào)試 209
7.3 Linux系統(tǒng)gdb遠(yuǎn)程調(diào)試 215
7.3.1 準(zhǔn)備測(cè)試程序 215
7.3.2 準(zhǔn)備目標(biāo)機(jī)環(huán)境 216
7.3.3 啟動(dòng)調(diào)試 216
7.4 使用VC遠(yuǎn)程調(diào)試Linux程序 219
7.5 使用VC創(chuàng)建Linux程序并調(diào)試 221
第8章 轉(zhuǎn)儲(chǔ)文件調(diào)試分析 225
8.1 Windows系統(tǒng)中的轉(zhuǎn)儲(chǔ)文件分析 225
8.1.1 轉(zhuǎn)儲(chǔ)文件死鎖調(diào)試分析 225
8.1.2 崩潰轉(zhuǎn)儲(chǔ)調(diào)試分析 228
8.2 Linux系統(tǒng)中的轉(zhuǎn)儲(chǔ)文件分析 234
8.2.1 內(nèi)核轉(zhuǎn)儲(chǔ)文件調(diào)試分析死鎖 234
8.2.2 內(nèi)核轉(zhuǎn)儲(chǔ)文件調(diào)試分析程序崩潰問(wèn)題 238
第9章 發(fā)行(Release)版調(diào)試 242
9.1 在VC中調(diào)試發(fā)行版 242
9.1.1 去優(yōu)化測(cè)試 242
9.1.2 保留優(yōu)化調(diào)試 245
9.2 在gdb中調(diào)試發(fā)行版 249
9.2.1 從調(diào)試版中提取調(diào)試符號(hào) 251
9.2.2 直接使用調(diào)試版作為符號(hào)源 252
第 10章 調(diào)試高級(jí)話題 255
10.1 斷點(diǎn)的秘密 255
10.2 你好,燙 258
10.3 與Windows調(diào)試相關(guān)的API 261
10.3.1 輸出窗口輸出信息 262
10.3.2 檢測(cè)是否在調(diào)試器運(yùn)行 262
10.3.3 Windows調(diào)試API列表 263
10.4 與Linux調(diào)試相關(guān)的系統(tǒng)調(diào)用 264
第 11章 調(diào)試擴(kuò)展知識(shí) 265
11.1 Windows驅(qū)動(dòng)開(kāi)發(fā)調(diào)試入門(mén) 265
11.1.1 環(huán)境準(zhǔn)備 265
11.1.2 創(chuàng)建Helloworld驅(qū)動(dòng)項(xiàng)目 266
11.1.3 編譯、構(gòu)建驅(qū)動(dòng) 267
11.1.4 部署驅(qū)動(dòng) 267
11.1.5 安裝驅(qū)動(dòng)程序 271
11.1.6 調(diào)試驅(qū)動(dòng) 272
11.2 WinDbg簡(jiǎn)介 273
11.2.1 直接啟動(dòng)應(yīng)用程序進(jìn)行調(diào)試 273
11.2.2 附加到進(jìn)程 274
11.2.3 調(diào)試轉(zhuǎn)儲(chǔ)文件 276
11.2.4 WinDbg命令列表 276
11.3 Linux內(nèi)核驅(qū)動(dòng)開(kāi)發(fā)簡(jiǎn)介 279
11.3.1 環(huán)境準(zhǔn)備 279
11.3.2 開(kāi)發(fā)Helloworld 280
11.3.3 加載和卸載驅(qū)動(dòng) 281
11.4 Linux內(nèi)核轉(zhuǎn)儲(chǔ)文件調(diào)試分析 283
11.4.1 Ubuntu系統(tǒng) 283
11.4.2 在CentOS系統(tǒng)中配置內(nèi)核轉(zhuǎn)儲(chǔ) 285
11.4.3 調(diào)試分析內(nèi)核轉(zhuǎn)儲(chǔ)文件 287