高效C/C++調試

高效C/C++調試

《高效C/C++調試》是2024年清華大學出版社出版的圖書,作者是 (美)嚴琦、盧憲廷。

基本介紹

  • 中文名:高效C/C++調試
  • 作者: (美)嚴琦、盧憲廷
  • 出版時間:2024年1月1日
  • 出版社:清華大學出版社
  • ISBN:9787302649717 
  • 定價:99 元
內容簡介,圖書目錄,

內容簡介

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

圖書目錄

目 錄
第1章 調試符號和調試器 1
1.1 調試符號 1
1.1.1 調試符號概覽 2
1.1.2 DWARF格式 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.1 ptmalloc 31
2.1.2 TCMalloc 34
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.2 C++對象布局 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 防止未來的bug 184
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.1 rr:Record and Replay 191
8.4.2 rr注意事項 191
8.5 本章小結 192
第9章 拓展調試器能力 193
9.1 使用Python拓展GDB 193
9.1.1 美化輸出 194
9.1.2 編寫自己的美觀列印器 195
9.1.3 將重複的工作變成一個命令 197
9.1.4 更快地調試bug 198
9.1.5 使用Python設定斷點 200
9.1.6 通過命令行來啟動程式和設定斷點 203
9.2 GDB自定義命令 203
9.3 本章小結 206
第10章 記憶體調試工具 207
10.1 ptmalloc’s MALLOC_CHECK_ 208
10.2 Google Address Sanitizer 212
10.3 AccuTrak 213
10.4 有效地調試記憶體損壞 225
10.5 實戰故事6:記憶體管理器的崩潰問題 228
10.5.1 症狀 229
10.5.2 分析和調試 229
10.6 本章小結 235
第11章 Core Analyzer 236
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.1 strace 247
12.1.1 常用功能 247
12.1.2 常用附加選項 248
12.2 實戰故事7:殭屍進程 248
12.2.1 遇到難題 248
12.2.2 揭示bug的真相 249
12.3 Perf 249
12.4 eBPF 250
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.1 C++協程 277
15.2 協程的切分點 279
15.3 協程之諾 281
15.4 本章小結 283
第16章 遠程調試 284
16.1 GDB遠程調試 285
16.2 Visual Studio遠程調試 286
16.3 本章小結 287
第17章 容器世界 288
17.1 容器示例 288
17.2 容器套用 289
17.3 C/C++容器調試 291
17.4 實戰故事10:CrashLoopBackOff 292
17.5 實戰故事11:liveness failure 292
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.1 PE檔案格式 301
B.2 Windows Minidump格式 306
附錄C 一個簡單的C++ coroutine程式 309

相關詞條

熱門詞條

聯絡我們