注冊 | 登錄讀書好,好讀書,讀好書!
讀書網(wǎng)-DuShu.com
當(dāng)前位置: 首頁出版圖書科學(xué)技術(shù)計算機/網(wǎng)絡(luò)軟件工程及軟件方法學(xué)軟件調(diào)試實戰(zhàn)

軟件調(diào)試實戰(zhàn)

軟件調(diào)試實戰(zhàn)

定 價:¥45.00

作 者: (德)格勒特克 等著,趙俐 譯
出版社: 人民郵電出版社
叢編項: 圖靈程序設(shè)計叢書
標(biāo) 簽: 軟件工程/開發(fā)項目管理

ISBN: 9787115218858 出版時間: 2010-02-01 包裝: 平裝
開本: 16開 頁數(shù): 190 字?jǐn)?shù):  

內(nèi)容簡介

  《軟件調(diào)試實戰(zhàn)》主要講述C/C++程序的調(diào)試和分析,書中的調(diào)試技術(shù)也可以應(yīng)用于其他語言編寫的程序。《軟件調(diào)試實戰(zhàn)》在講述簡單的源代碼分析和測試的基礎(chǔ)上,講述了現(xiàn)實的程序中經(jīng)常遇到的一些問題(如程序鏈接、內(nèi)存訪問、并行處理和性能分析)并給出了解決方案?!盾浖{(diào)試實戰(zhàn)》適合軟件開發(fā)人員、調(diào)試人員閱讀和使用。

作者簡介

  Thorsten Grotker,Ulrich Holtmann,Holger Keding,Markus Wloka4位作者均擁有德國或美國著名高等學(xué)府的博士學(xué)位,目前都任職于EDA(電子設(shè)計自動化)軟件領(lǐng)導(dǎo)廠商Synopsys(新思)公司,分別擔(dān)任研發(fā)主管、資深軟件工程師等職位,負(fù)責(zé)開發(fā)編譯器和調(diào)試工具,具有解決各種調(diào)試問題的豐富經(jīng)驗。

圖書目錄

第1章 誰編寫軟件,誰制造bug(為什么需要本書)1
第2章 系統(tǒng)性調(diào)試方法3
2.1 為什么要遵循結(jié)構(gòu)化的過程3
2.2 充分利用機會3
2.3 13條黃金規(guī)則5
2.3.1 理解需求5
2.3.2 制造失敗6
2.3.3 簡化測試用例6
2.3.4 讀取恰當(dāng)?shù)腻e誤消息6
2.3.5 檢查顯而易見的問題6
2.3.6 從解釋中分離出事實7
2.3.7 分而治之7
2.3.8 工具要與bug匹配8
2.3.9 一次只做一項更改9
2.3.10 保持審計跟蹤9
2.3.11 獲得全新觀點9
2.3.12 bug不會自己修復(fù)9
2.3.13 用回歸測試來檢查bug修復(fù)10
2.4 構(gòu)建一個好的工具包10
2.4.1 工具箱11
2.4.2 每天運行測試,防止出現(xiàn)bug11
2.5 認(rèn)清敵人——遇到bug家族13
2.5.1 常見bug13
2.5.2 偶發(fā)性bug13
2.5.3 Heisenbug13
2.5.4 隱藏在bug背后的bug14
2.5.5 秘密bug——調(diào)試與機密性14
2.5.6 更多讀物15
第3章 查找根源——源代碼調(diào)試器17
3.1 可視化程序行為17
3.2 準(zhǔn)備簡單的可預(yù)測的示例18
3.3 使調(diào)試器與程序一起運行18
3.4 學(xué)習(xí)在程序崩潰時執(zhí)行棧跟蹤21
3.5 學(xué)習(xí)使用斷點21
3.6 學(xué)習(xí)在程序中導(dǎo)航22
3.7 學(xué)習(xí)檢查數(shù)據(jù):變量和表達式22
3.8 一個簡單示例的調(diào)試會話23
第4章 修復(fù)內(nèi)存問題27
4.1 C/C++中的內(nèi)存管理——功能強大但很危險27
4.1.1 內(nèi)存泄漏27
4.1.2 內(nèi)存管理的錯誤使用28
4.1.3 緩沖區(qū)溢出28
4.1.4 未初始化的內(nèi)存bug28
4.2 有效的內(nèi)存調(diào)試器28
4.3 示例1:檢測內(nèi)存訪問錯誤29
4.3.1 檢測無效的寫訪問30
4.3.2 檢測對未初始化的內(nèi)存的讀取操作30
4.3.3 檢測內(nèi)存泄漏31
4.4 示例2:對內(nèi)存分配/釋放的不完整調(diào)用31
4.5 結(jié)合使用內(nèi)存調(diào)試器和源代碼測試器33
4.6 減少干擾,排查錯誤33
4.7 何時使用內(nèi)存調(diào)試器34
4.8 約束34
4.8.1 測試用例應(yīng)該有很好的代碼覆蓋率34
4.8.2 提供更多計算機資源35
4.8.3 可能不支持多線程35
4.8.4 對非標(biāo)準(zhǔn)內(nèi)存處理程序的支持35
第5章 剖析內(nèi)存的使用37
5.1 基本策略——主要步驟37
5.2 示例:分配數(shù)組38
5.3 第1步:查找泄漏38
5.4 第2步:設(shè)置期望值38
5.5 第3步:測量內(nèi)存使用39
5.5.1 使用多個輸入39
5.5.2 在固定時間間隔停止程序39
5.5.3 用簡單工具測量內(nèi)存使用40
5.5.4 使用top40
5.5.5 使用WindowsTaskManager41
5.5.6 為testmalloc選擇相關(guān)輸入值42
5.5.7 確定機器上的內(nèi)存是如何被釋放的42
5.5.8 使用內(nèi)存剖析工具43
5.6 第4步:查明大部分內(nèi)存被哪些數(shù)據(jù)結(jié)構(gòu)占用了44
5.7 綜合練習(xí)——genindex示例45
5.7.1 核實沒有大的內(nèi)存泄漏46
5.7.2 估計內(nèi)存使用46
5.7.3 測量內(nèi)存使用46
5.7.4 查找使用內(nèi)存的數(shù)據(jù)結(jié)構(gòu)47
第6章 解決性能問題51
6.1 分步查找性能bug51
6.1.1 執(zhí)行前期分析51
6.1.2 使用簡單的時間測量方法52
6.1.3 創(chuàng)建測試用例52
6.1.4 使測試用例具有可再現(xiàn)性53
6.1.5 檢查程序的正確性53
6.1.6 創(chuàng)建可擴展的測試用例53
6.1.7 排除對測試用例的干擾54
6.1.8 用time命令測量時可能會發(fā)生錯誤和偏差54
6.1.9 選擇一個能夠揭示運行時間瓶頸的測試用例55
6.1.10 算法與實現(xiàn)之間的差異56
6.2 使用剖析工具58
6.2.1 不要編寫自己的剖析工具58
6.2.2 剖析工具的工作原理58
6.2.3 了解gprof59
6.2.4 了解Quantify63
6.2.5 了解Callgrind64
6.2.6 了解VTune66
6.3 分析I/O性能68
第7章 調(diào)試并行程序71
7.1 用C/C++編寫并行程序71
7.2 調(diào)試競爭條件72
7.2.1 使用基本調(diào)試器功能來查找競爭條件73
7.2.2 使用日志文件來查找競爭條件74
7.3 調(diào)試死鎖76
7.3.1 如何確定正在運行的是哪個線程77
7.3.2 分析程序的線程78
7.4 了解線程分析工具78
7.5 異步事件和中斷處理程序80
第8章 查找環(huán)境和編譯器問題83
8.1 環(huán)境變更——問題的根源83
8.1.1 環(huán)境變量83
8.1.2 本地安裝依賴84
8.1.3 當(dāng)前工作目錄依賴84
8.1.4 進程ID依賴84
8.2 如何查看程序正在做什么84
8.2.1 用top來查看進程84
8.2.2 用ps來查找應(yīng)用程序的多個進程85
8.2.3 使用/proc/來訪問進程85
8.2.4 使用strace跟蹤對操作系統(tǒng)的調(diào)用85
8.3 編譯器和調(diào)試器也有bug87
8.3.1 編譯器bug87
8.3.2 調(diào)試器和編譯器兼容性問題88
第9章 處理鏈接問題89
9.1 鏈接器的工作原理89
9.2 構(gòu)建并鏈接對象89
9.3 解析未定義的符號91
9.3.1 丟失鏈接器參數(shù)91
9.3.2 搜索丟失的符號91
9.3.3 鏈接順序問題92
9.3.4 C++符號和名稱改編93
9.3.5 符號的反改編94
9.3.6 鏈接C和C++代碼94
9.4 具有多個定義的符號95
9.5 信號沖突96
9.6 識別編譯器和鏈接器版本不匹配96
9.6.1 系統(tǒng)庫不匹配97
9.6.2 對象文件不匹配97
9.6.3 運行時崩潰98
9.6.4 確定編譯器版本98
9.7 解決動態(tài)鏈接問題100
9.7.1 鏈接或載入DLL100
9.7.2 無法找到DLL文件101
9.7.3 分析載入器問題102
9.7.4 在DLL中設(shè)置斷點103
9.7.5 提供DLL問題的錯誤消息104
第10章 高級調(diào)試107
10.1 在C++函數(shù)、方法和操作符中設(shè)置斷點107
10.2 在模板化的函數(shù)和C++類中設(shè)置斷點109
10.3 進入C++方法110
10.3.1 用step-into命令進入到隱式函數(shù)中112
10.3.2 用step-out命令跳過隱式函數(shù)112
10.3.3 利用臨時斷點跳過隱式函數(shù)113
10.3.4 從隱式函數(shù)調(diào)用返回113
10.4 條件斷點和斷點命令114
10.5 調(diào)試靜態(tài)構(gòu)造/析構(gòu)函數(shù)116
10.5.1 由靜態(tài)初始化程序的順序依賴性引起的bug117
10.5.2 識別靜態(tài)初始化程序的棧跟蹤118
10.5.3 在靜態(tài)初始化之前連接調(diào)試器118
10.6 使用觀察點119
10.7 捕捉信號120
10.8 捕獲異常122
10.9 讀取棧跟蹤124
10.9.1 帶調(diào)試信息編譯的源代碼的棧跟蹤124
10.9.2 不帶調(diào)試信息編譯的源代碼的棧跟蹤124
10.9.3 不帶任何調(diào)試信息的幀125
10.9.4 實際工作中的棧跟蹤125
10.9.5 改編后的函數(shù)名稱126
10.9.6 被破壞的棧跟蹤126
10.9.7 核心轉(zhuǎn)儲127
10.10 操縱正在運行的程序128
10.10.1 修改變量130
10.10.2 調(diào)用函數(shù)131
10.10.3 修改函數(shù)的返回值132
10.10.4 中止函數(shù)調(diào)用132
10.10.5 跳過或重復(fù)執(zhí)行個別語句133
10.10.6 輸出和修改內(nèi)存內(nèi)容133
10.11在沒有調(diào)試信息時進行調(diào)試135
10.11.1 從棧讀取函數(shù)參數(shù)137
10.11.2 讀取局部/全局變量和用戶定義的數(shù)據(jù)類型138
10.11.3 在源代碼中查找語句的大概位置139
10.11.4 走查匯編代碼140
第11章 編寫可調(diào)試的代碼143
11.1 注釋的重要性143
11.1.1 函數(shù)簽名的注釋144
11.1.2 對折中辦法的注釋144
11.1.3 為不確定的代碼加注釋144
11.2 采用一致的編碼風(fēng)格144
11.2.1 仔細(xì)選擇名稱145
11.2.2 不要使用“聰明過頭”的結(jié)構(gòu)145
11.2.3 不要壓縮代碼145
11.2.4 為復(fù)雜表達式使用臨時變量145
11.3 避免使用預(yù)處理器宏146
11.3.1 使用常量或枚舉來替代宏146
11.3.2 使用函數(shù)來替代預(yù)處理器宏148
11.3.3 調(diào)試預(yù)處理器輸出149
11.3.4 使用功能更強的預(yù)處理器150
11.4 提供更多調(diào)試函數(shù)151
11.4.1 顯示用戶定義的數(shù)據(jù)類型151
11.4.2 自檢查代碼152
11.4.3 為操作符創(chuàng)建一個函數(shù),以便幫助調(diào)試153
11.5 為事后調(diào)試做準(zhǔn)備153
第12章 靜態(tài)檢查的作用155
12.1 使用編譯器作為調(diào)試工具155
12.1.1 不要認(rèn)為警告是無害的156
12.1.2 使用多個編譯器來檢查代碼158
12.2 使用lint158
12.3 使用靜態(tài)分析工具158
12.3.1 了解靜態(tài)檢查器158
12.3.2 將靜態(tài)檢查器檢測到的錯誤減至(接近)零160
12.3.3 完成代碼清理后重新運行所有測試用例160
12.4 靜態(tài)分析的高級應(yīng)用161
第13章 結(jié)束語163
附錄A 調(diào)試命令165
附錄B 工具資源167
附錄C 源代碼179
參考文獻189

本目錄推薦

掃描二維碼
Copyright ? 讀書網(wǎng) www.talentonion.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號 鄂公網(wǎng)安備 42010302001612號