《高效C/C++調試》封麵

內容簡介

《高效C/C++調試》是關於軟件調試技術的深度探索,融合了作者的實踐智慧。書中不僅指導讀者如何使用專業的調試工具,還介紹了如何宏觀和微觀地分析問題,並**限度地發揮調試器功能。此外,書中還深入解讀了調試背後的技術原理,如調試符號、內存管理及係統內核對內存的操作機製,以揭示內存管理的關鍵性和複雜性。 除了介紹基礎概念外,本書還涵蓋了許多增強調試能力的工具與插件。盡管焦點集中在C/C++,但其中的策略與技巧具有普適性,適用於多種編程語境。內容包括從內存泄漏預防調試、Linux下的eBPF和strace調試方法,到Kubernetes容器調試,再到C++20的協程與崩潰信息收集策略。 《高效C/C++調試》主要麵向具有C/C++編程基礎的讀者,同時也非常適合對軟件技術原理有深入探索興趣的讀者以及追求高效調試技巧的開發人員。

作者簡介

目錄

第1章調試符號和調試器1
1.1調試符號1
1.1.1調試符號概覽2
1.1.2DWARF格式3
1.2實戰故事1:數據類型的不一致14
1.3調試器的內部結構16
1.3.1用戶界麵16
1.3.2符號管理模塊16
1.3.3目標管理模塊17
1.4技巧和注意事項21
1.4.1特殊的調試符號21
1.4.2改變執行及其副作用24
1.4.3符號匹配的自動化25
1.4.4後期分析26
1.4.5內存保護27
1.4.6斷點不工作27
1.5本章小結28
第2章堆數據結構29
2.1理解內存管理器30
2.1.1ptmalloc31
2.1.2TCMalloc34
2.1.3多個堆38
2.2利用堆元數據39
2.3本章小結42
第3章內存損壞43
3.1內存是怎麼損壞的44
3.1.1內存溢出與下溢44
3.1.2訪問釋放的內存45
3.1.3使用未初始化的值46
3.2調試內存損壞47
3.2.1初始調查49
3.2.2內存調試工具53
3.2.3堆與棧內存損壞對比53
3.2.4工具箱54
3.3實戰故事2:神秘的字節序轉換55
3.3.1症狀55
3.3.2分析和調試56
3.3.3錯誤和有價值的點64
3.4實戰故事3:覆寫棧變量65
3.4.1症狀65
3.4.2分析和調試65
3.5本章小結68
第4章C++對象布局69
4.1對齊和大小端69
4.1.1對齊69
4.1.2大小端70
4.2C++對象布局71
4.3實戰故事4:訪問已經釋放的數據94
4.3.1症狀94
4.3.2分析和調試94
4.4搜索引用樹95
4.5本章小結101
第5章優化後的二進製102
5.1調試版和發行版的區別102
5.2調試優化代碼的挑戰106
5.3匯編代碼介紹108
5.3.1寄存器109
5.3.2指令集111
5.3.3程序匯編的結構113
5.3.4函數調用習慣116
5.4分析優化後的代碼127
5.5調試優化後的代碼示例130
5.6本章小結141
第6章進程鏡像142
6.1二進製文件格式144
6.2運行期加載和鏈接148
6.3進程映射表153
6.3.1可執行文件154
6.3.2共享庫156
6.3.3線程棧157
6.3.4無名區域157
6.3.5攔截158
6.3.6鏈接時替換158
6.3.7預先加載代理函數159
6.3.8修改導入和導出表159
6.3.9對目標函數進行手術改變164
6.3.10核心轉儲文件格式166
6.3.11核心轉儲文件分析工具169
6.4本章小結170
第7章調試多線程程序171
7.1競爭條件171
7.2它是競爭條件嗎172
7.3調試競爭條件174
7.4實戰故事5:記錄重要區域175
7.4.1症狀175
7.4.2分析調試175
7.5死鎖177
7.6本章小結179
第8章更多調試方法180
8.1重現錯誤180
8.1.1歸因181
8.1.2收集環境信息182
8.1.3重建環境184
8.2防止未來的bug184
8.2.1知識保留和傳遞185
8.2.2增強提前檢查185
8.2.3編寫更好調試的代碼185
8.3不要忘記這些調試規則189
8.3.1分治法189
8.3.2退一步,獲取新的觀點189
8.3.3保留調試歷史190
8.4逆向調試190
8.4.1rr:RecordandReplay191
8.4.2rr注意事項191
8.5本章小結192
第9章拓展調試器能力193
9.1使用Python拓展GDB193
9.1.1美化輸出194
9.1.2編寫自己的美觀打印器195
9.1.3將重複的工作變成一個命令197
9.1.4更快地調試bug198
9.1.5使用Python設置斷點200
9.1.6通過命令行來啟動程序和設置斷點203
9.2GDB自定義命令203
9.3本章小結206
第10章內存調試工具207
10.1ptmalloc’sMALLOC_CHECK_208
10.2GoogleAddressSanitizer212
10.3AccuTrak213
10.4有效地調試內存損壞225
10.5實戰故事6:內存管理器的崩潰問題228
10.5.1症狀229
10.5.2分析和調試229
10.6本章小結235
第11章CoreAnalyzer236
11.1使用示例237
11.2主要功能239
11.2.1搜索引用的對象(水平搜索)239
11.2.2查詢地址及其底層對象(垂直搜索)240
11.2.3內存模式分析241
11.2.4查詢堆內存塊242
11.2.5堆遍歷(檢查整個堆以發現損壞並獲取內存使用統計)242
11.3本章小結246
第12章更多調試工具247
12.1strace247
12.1.1常用功能247
12.1.2常用附加選項248
12.2實戰故事7:僵屍進程248
12.2.1遇到難題248
12.2.2揭示bug的真相249
12.3Perf249
12.4eBPF250
12.4.1準備環境251
12.4.2編寫代碼251
12.4.3編譯程序252
12.4.4加載和運行程序254
12.5實戰故事8:鏈接問題255
12.5.1切入255
12.5.2更奇怪的事情258
12.5.3柳暗花明259
12.5.4補充260
12.5.5結論261
12.6實戰故事9:臨時變量的生命周期261
12.7本章小結264
第13章崩潰發送機製265
13.1客戶端266
13.2遠程報告收集服務器267
13.3終端集成器268
13.4本章小結268
第14章內存泄漏269
14.1為什麼RAII是基石269
14.2分析270
14.3調試內存泄漏273
14.4本章小結275
第15章協程276
15.1C++協程277
15.2協程的切分點279
15.3協程之諾281
15.4本章小結283
第16章遠程調試284
16.1GDB遠程調試285
16.2VisualStudio遠程調試286
16.3本章小結287
第17章容器世界288
17.1容器示例288
17.2容器應用289
17.3C/C++容器調試291
17.4實戰故事10:CrashLoopBackOff292
17.5實戰故事11:livenessfailure292
17.6本章小結294
第18章盡量不要調試程序295
18.1借助編譯器來提前發現錯誤295
18.2編寫簡短的實驗代碼295
18.3日誌和監控296
18.3.1日誌296
18.3.2監控297
18.4遵循最佳編碼實踐297
18.5本章小結298
附錄A調試混合語言299
附錄B在Windows/x86環境下進行程序調試301
B.1PE文件格式301
B.2WindowsMinidump格式306
附錄C一個簡單的C++coroutine程序309
······

最後修改:2026 年 01 月 23 日