第 1章 C/C 調試基本知識 1
1.1 BUG與Debug 1
1.2 為什么選擇C/C 3
1.3 什么是調試器 4
第 2章 Visual C 調試基本功能 5
2.1 Visual C 簡介 5
2.1.1 VC 2019版本選擇 7
2.1.2 VC 2019安裝 8
2.2 斷點管理 9
2.2.1 設置/刪除斷點 10
2.2.2 禁用斷點 10
2.2.3 查看所有斷點 11
2.3 調試執(zhí)行 14
2.3.1 啟動調試 14
2.3.2 逐語句執(zhí)行 15
2.3.3 逐過程執(zhí)行 17
2.3.4 跳出執(zhí)行 17
2.3.5 運行到光標處 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 表達式支持 23
2.5 內存查看 25
2.5.1 字符串內存布局 26
2.5.2 整型變量內存布局 27
2.6 通過“局部變量”窗口和“自動”窗口查看變量 28
2.6.1 “局部變量”窗口查看變量 28
2.6.2 “自動”窗口查看變量 30
2.7 即時窗口 31
2.7.1 顯示變量的值 31
2.7.2 執(zhí)行內嵌函數(shù) 32
2.8 調用堆棧 32
2.8.1 調用堆?;拘畔?33
2.8.2 設置符號信息 33
2.9 多線程管理 36
2.9.1 創(chuàng)建多線程測試項目 36
2.9.2 開始調試多線程程序 37
2.10 查看錯誤碼 40
2.11 調試宏assert使用 43
2.11.1 assert宏簡介 44
2.11.2 使用assert宏的注意事項 45
2.12 其他 46
2.12.1 編輯并繼續(xù)調試 46
2.12.2 字符串可視化工具 47
2.12.3 條件斷點 48
2.12.4 函數(shù)斷點 51
2.12.5 數(shù)據(jù)斷點 52
2.12.6 VC調試時常用的快捷鍵和組合鍵列表 55
第3章 Linux系統(tǒng)下gdb調試基本功能 57
3.1 Linux系統(tǒng)下C/C 編程的基本知識 57
3.1.1 開發(fā)環(huán)境安裝 58
3.1.2 開發(fā)第 一個C/C 程序 61
3.2 gdb簡介 68
3.2.1 gdb的安裝 68
3.2.2 gdb常用功能概覽 70
3.3 調試執(zhí)行 71
3.3.1 啟動調試 71
3.3.2 啟動調試并添加參數(shù) 74
3.3.3 附加到進程 75
3.4 斷點管理 77
3.4.1 設置斷點 77
3.4.2 啟用/禁用斷點 86
3.4.3 啟用斷點一次 87
3.4.4 啟用斷點并刪除 88
3.4.5 啟用斷點并命中N次 89
3.4.6 忽略斷點前N次命中 90
3.4.7 查看斷點 90
3.4.8 刪除斷點 91
3.5 程序執(zhí)行 92
3.5.1 啟動程序 92
3.5.2 繼續(xù)運行 93
3.5.3 繼續(xù)運行并跳過當前斷點N次 94
3.5.4 繼續(xù)運行直到當前函數(shù)執(zhí)行完成 94
3.5.5 單步執(zhí)行 95
3.5.6 逐過程執(zhí)行 96
3.6 查看當前函數(shù)參數(shù) 96
3.7 查看/修改變量的值 97
3.7.1 使用gdb內嵌函數(shù) 98
3.7.2 查看結構體/類的值 99
3.7.3 查看數(shù)組 101
3.8 自動顯示變量的值 102
3.9 查看源代碼 104
3.10 查看內存 106
3.11 查看寄存器 109
3.12 查看調用棧 111
3.12.1 查看?;厮菪畔?112
3.12.2 切換棧幀 113
3.12.3 查看幀信息 115
3.13 線程管理 115
3.13.1 查看所有線程信息 118
3.13.2 切換線程 118
3.13.3 為線程設置斷點 119
3.13.4 為線程執(zhí)行命令 120
3.14 其他 121
3.14.1 觀察點 121
3.14.2 捕獲點 124
3.14.3 搜索源代碼 126
3.14.4 查看變量類型 128
3.14.5 跳轉執(zhí)行 130
3.14.6 窗口管理 132
3.14.7 調用Shell命令 134
3.14.8 assert宏使用 135
3.14.9 gdb常用命令列表 137
第4章 多線程死鎖調試 141
4.1 創(chuàng)建多線程 142
4.2 多線程的同步 144
4.3 C 標準庫中的鎖 146
4.3.1 std::mutex類 146
4.3.2 std::timed_mutex類 149
4.3.3 std::recursive_mutex和std::recursive_timed_mutex 149
4.4 死鎖調試 150
4.4.1 Windows系統(tǒng)中的死鎖調試 151
4.4.2 Linux系統(tǒng)中的死鎖調試 153
4.4.3 死鎖條件 156
4.4.4 解決死鎖 157
第5章 調試動態(tài)庫 160
5.1 Windows系統(tǒng)動態(tài)庫開發(fā)與調試 161
5.1.1 創(chuàng)建動態(tài)庫 161
5.1.2 使用動態(tài)庫 164
5.1.3 調試動態(tài)庫 165
5.2 Linux系統(tǒng)動態(tài)庫開發(fā)與調試 170
5.2.1 創(chuàng)建動態(tài)庫 171
5.2.2 使用動態(tài)庫 174
5.2.3 調試動態(tài)庫 177
第6章 內存檢查 183
6.1 VC調試器和C/C 內存檢查機制 183
6.1.1 內存泄漏測試程序 184
6.1.2 使用VC運行時庫函數(shù)來檢測內存泄漏 186
6.1.3 檢測堆內存破壞(堆溢出) 193
6.1.4 使用數(shù)據(jù)斷點來定位堆內存破壞問題 196
6.1.5 使用地址擦除系統(tǒng)(AddressSanitizer)來定位內存問題 206
6.1.6 其他調試函數(shù) 214
6.2 Linux系統(tǒng)內存檢查 215
6.2.1 檢查內存泄漏 215
6.2.2 檢查堆溢出 217
6.2.3 檢查棧溢出 218
6.2.4 檢查全局變量的內存溢出 219
6.2.5 檢查內存被釋放后繼續(xù)使用 220
第7章 遠程調試 222
7.1 遠程調試簡介 222
7.2 Visual C 遠程調試 223
7.2.1 準備測試程序 223
7.2.2 準備目標機環(huán)境 223
7.2.3 啟動遠程調試 226
7.3 Linux系統(tǒng)gdb遠程調試 232
7.3.1 準備測試程序 232
7.3.2 準備目標機環(huán)境 233
7.3.3 啟動調試 233
7.4 使用VC遠程調試Linux程序 236
7.5 使用VC創(chuàng)建Linux程序并調試 238
第8章 轉儲文件調試分析 242
8.1 Windows系統(tǒng)中的轉儲文件分析 242
8.1.1 轉儲文件死鎖調試分析 242
8.1.2 崩潰轉儲調試分析 245
8.2 Linux系統(tǒng)中的轉儲文件分析 251
8.2.1 內核轉儲文件調試分析死鎖 251
8.2.2 內核轉儲文件調試分析程序崩潰問題 255
第9章 發(fā)行(Release)版調試 259
9.1 在VC中調試發(fā)行版 259
9.1.1 去優(yōu)化測試 259
9.1.2 保留優(yōu)化調試 262
9.2 在gdb中調試發(fā)行版 266
9.2.1 從調試版中提取調試符號 268
9.2.2 直接使用調試版作為符號源 269
第 10章 調試高級話題 272
10.1 斷點的秘密 272
10.2 你好,燙 275
10.3 與Windows調試相關的API 278
10.3.1 輸出窗口輸出信息 279
10.3.2 檢測是否在調試器運行 279
10.3.3 Windows調試API列表 280
10.4 與Linux調試相關的系統(tǒng)調用 281
10.5 使用gdb為軟件制作補丁 281
10.5.1 為有源碼軟件制作軟件補丁 282
10.5.2 為無源碼軟件制作軟件補丁 285
10.6 使用gdb“破解”軟件密碼 287
第 11章 調試擴展知識 292
11.1 Windows驅動開發(fā)調試入門 292
11.1.1 環(huán)境準備 292
11.1.2 創(chuàng)建Helloworld驅動項目 293
11.1.3 編譯、構建驅動 294
11.1.4 部署驅動 294
11.1.5 安裝驅動程序 298
11.1.6 調試驅動 299
11.2 WinDbg簡介 300
11.2.1 直接啟動應用程序進行調試 300
11.2.2 附加到進程 301
11.2.3 調試轉儲文件 303
11.2.4 WinDbg命令列表 303
11.3 Linux內核驅動開發(fā)簡介 306
11.3.1 環(huán)境準備 306
11.3.2 開發(fā)Helloworld 307
11.3.3 加載和卸載驅動 308
11.4 Linux內核轉儲文件調試分析 310
11.4.1 Ubuntu系統(tǒng) 310
11.4.2 在CentOS系統(tǒng)中配置內核轉儲 312
11.4.3 分析內核轉儲文件 314
11.5 Visual Studio 2022調試新特性介紹 316
11.5.1 臨時斷點 316
11.5.2 斷點行為控制 318
11.5.3 依賴斷點 319
11.5.4 強制運行到光標處 321
11.5.5 強制運行到單擊處 321
11.5.6 附加到進程 321