出版時間:2010-2 出版社:人民郵電出版社 作者:Thorsten Grotker,Ulrich Holtmann,Holger Keding,Markus Wloka 頁數(shù):190 譯者:趙俐
Tag標(biāo)簽:無
前言
在所有軟件開發(fā)工作中,調(diào)試或許是最令人苦惱的。調(diào)試工作極易受到指責(zé),因為技術(shù)失敗即意味著做人失敗,而且矛頭直指調(diào)試人員,昭示出他們所犯下的錯誤。由于必須反復(fù)思考每個假設(shè),反復(fù)斟酌從需求到實現(xiàn)的每個步驟,因此調(diào)試將耗費大量時間。最糟糕的是,調(diào)試還無法預(yù)測,我們永遠(yuǎn)無法知道修復(fù)一個bug需要多長時間,甚至根本不知道是否能夠修復(fù)它。問一下開發(fā)人員他們生活中最沮喪的時刻,大多數(shù)回答將與調(diào)試有關(guān)。也許現(xiàn)在正是深夜11點,你仍在忙著調(diào)試,正當(dāng)對程序進行走查時,你的家人打電話給你,問你到底什么時候才能回家,而你只希望盡快放下電話,因為好不容易得到的觀察結(jié)果和推斷正要從腦中溜走。此時,你可能最后有兩種選擇:一是重新調(diào)試,二是過后再試圖重修舊好。據(jù)我個人估計,調(diào)試是導(dǎo)致程序員離婚的第一大原因。然而,調(diào)試也蘊含著樂趣,就像解出難題、猜出謎語或破獲謀殺案一樣令人激動,但前提條件是必須采用系統(tǒng)性的方式并配備正確的工具。這正是本書的用武之地。本書四位作者直接與那些固持己見的開發(fā)者對話,直截了當(dāng)?shù)靥岢鼋鉀Q調(diào)試問題的建議,并給出了真正快速的解決方案。無論是解決內(nèi)存問題,調(diào)試并行程序,還是處理工具鏈引入的問題,本書都能夠提供“急救措施”,書中的建議都是經(jīng)過反復(fù)嘗試和驗證的。如果我最初開始調(diào)試程序時就能有這樣一本書,該多好?。∥蚁胛視料⒆⒁?,看看這些調(diào)試工具將帶給我什么驚喜,而且采納書中的建議,必然會節(jié)省大量手工調(diào)試的時間,并可將這些時間投入到其他工作中。譬如說,可以使代碼更可靠,這樣最后可能根本不必做任何調(diào)試了。當(dāng)然,這是專業(yè)編程的長期目標(biāo),即從一開始就編寫正確的代碼,通過某種確認(rèn)或驗證方法來杜絕所有錯誤(或至少檢測到錯誤)。目前,斷言和單元測試已經(jīng)在提高程序可信度方面提供了很多幫助。未來可能會有一些用于行業(yè)級系統(tǒng)的成熟驗證方法。我們現(xiàn)在尚未實現(xiàn)這樣的方法,這可能需要很多年,而且當(dāng)達(dá)到這個目標(biāo)時,所實現(xiàn)的方法肯定不會適用于現(xiàn)在的編程語言。在處理當(dāng)今的程序,特別是那些C和C++程序時,我們?nèi)詫⒃谡{(diào)試上花費一定時間——這正是本書的寶貴價值所在。
內(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 等 譯者:趙俐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)試方法32.1 為什么要遵循結(jié)構(gòu)化的過程32.2 充分利用機會32.3 13條黃金規(guī)則52.3.1 理解需求52.3.2 制造失敗62.3.3 簡化測試用例62.3.4 讀取恰當(dāng)?shù)腻e誤消息62.3.5 檢查顯而易見的問題62.3.6 從解釋中分離出事實72.3.7 分而治之72.3.8 工具要與bug匹配82.3.9 一次只做一項更改92.3.10 保持審計跟蹤92.3.11 獲得全新觀點92.3.12 bug不會自己修復(fù)92.3.13 用回歸測試來檢查bug修復(fù)102.4 構(gòu)建一個好的工具包102.4.1 工具箱112.4.2 每天運行測試,防止出現(xiàn)bug112.5 認(rèn)清敵人——遇到bug家族132.5.1 常見bug132.5.2 偶發(fā)性bug132.5.3 Heisenbug132.5.4 隱藏在bug背后的bug142.5.5 秘密bug——調(diào)試與機密性142.5.6 更多讀物15第3章 查找根源——源代碼調(diào)試器173.1 可視化程序行為173.2 準(zhǔn)備簡單的可預(yù)測的示例183.3 使調(diào)試器與程序一起運行183.4 學(xué)習(xí)在程序崩潰時執(zhí)行棧跟蹤213.5 學(xué)習(xí)使用斷點213.6 學(xué)習(xí)在程序中導(dǎo)航223.7 學(xué)習(xí)檢查數(shù)據(jù):變量和表達(dá)式223.8 一個簡單示例的調(diào)試會話23第4章 修復(fù)內(nèi)存問題274.1 C/C++中的內(nèi)存管理——功能強大但很危險274.1.1 內(nèi)存泄漏274.1.2 內(nèi)存管理的錯誤使用284.1.3 緩沖區(qū)溢出284.1.4 未初始化的內(nèi)存bug284.2 有效的內(nèi)存調(diào)試器284.3 示例1:檢測內(nèi)存訪問錯誤294.3.1 檢測無效的寫訪問304.3.2 檢測對未初始化的內(nèi)存的讀取操作304.3.3 檢測內(nèi)存泄漏314.4 示例2:對內(nèi)存分配/釋放的不完整調(diào)用314.5 結(jié)合使用內(nèi)存調(diào)試器和源代碼測試器334.6 減少干擾,排查錯誤334.7 何時使用內(nèi)存調(diào)試器344.8 約束344.8.1 測試用例應(yīng)該有很好的代碼覆蓋率344.8.2 提供更多計算機資源354.8.3 可能不支持多線程354.8.4 對非標(biāo)準(zhǔn)內(nèi)存處理程序的支持35第5章 剖析內(nèi)存的使用375.1 基本策略——主要步驟375.2 示例:分配數(shù)組385.3 第1步:查找泄漏385.4 第2步:設(shè)置期望值385.5 第3步:測量內(nèi)存使用395.5.1 使用多個輸入395.5.2 在固定時間間隔停止程序395.5.3 用簡單工具測量內(nèi)存使用405.5.4 使用top405.5.5 使用WindowsTaskManager415.5.6 為testmalloc選擇相關(guān)輸入值425.5.7 確定機器上的內(nèi)存是如何被釋放的425.5.8 使用內(nèi)存剖析工具435.6 第4步:查明大部分內(nèi)存被哪些數(shù)據(jù)結(jié)構(gòu)占用了445.7 綜合練習(xí)——genindex示例455.7.1 核實沒有大的內(nèi)存泄漏465.7.2 估計內(nèi)存使用465.7.3 測量內(nèi)存使用465.7.4 查找使用內(nèi)存的數(shù)據(jù)結(jié)構(gòu)47第6章 解決性能問題516.1 分步查找性能bug516.1.1 執(zhí)行前期分析516.1.2 使用簡單的時間測量方法526.1.3 創(chuàng)建測試用例526.1.4 使測試用例具有可再現(xiàn)性536.1.5 檢查程序的正確性536.1.6 創(chuàng)建可擴展的測試用例536.1.7 排除對測試用例的干擾546.1.8 用time命令測量時可能會發(fā)生錯誤和偏差546.1.9 選擇一個能夠揭示運行時間瓶頸的測試用例556.1.10 算法與實現(xiàn)之間的差異566.2 使用剖析工具586.2.1 不要編寫自己的剖析工具586.2.2 剖析工具的工作原理586.2.3 了解gprof596.2.4 了解Quantify636.2.5 了解Callgrind646.2.6 了解VTune666.3 分析I/O性能68第7章 調(diào)試并行程序717.1 用C/C++編寫并行程序717.2 調(diào)試競爭條件727.2.1 使用基本調(diào)試器功能來查找競爭條件737.2.2 使用日志文件來查找競爭條件747.3 調(diào)試死鎖767.3.1 如何確定正在運行的是哪個線程777.3.2 分析程序的線程787.4 了解線程分析工具787.5 異步事件和中斷處理程序80第8章 查找環(huán)境和編譯器問題838.1 環(huán)境變更——問題的根源838.1.1 環(huán)境變量838.1.2 本地安裝依賴848.1.3 當(dāng)前工作目錄依賴848.1.4 進程ID依賴848.2 如何查看程序正在做什么848.2.1 用top來查看進程848.2.2 用ps來查找應(yīng)用程序的多個進程858.2.3 使用/proc/來訪問進程858.2.4 使用strace跟蹤對操作系統(tǒng)的調(diào)用858.3 編譯器和調(diào)試器也有bug878.3.1 編譯器bug878.3.2 調(diào)試器和編譯器兼容性問題88第9章 處理鏈接問題899.1 鏈接器的工作原理899.2 構(gòu)建并鏈接對象899.3 解析未定義的符號919.3.1 丟失鏈接器參數(shù)919.3.2 搜索丟失的符號919.3.3 鏈接順序問題929.3.4 C++符號和名稱改編939.3.5 符號的反改編949.3.6 鏈接C和C++代碼949.4 具有多個定義的符號959.5 信號沖突969.6 識別編譯器和鏈接器版本不匹配969.6.1 系統(tǒng)庫不匹配979.6.2 對象文件不匹配979.6.3 運行時崩潰989.6.4 確定編譯器版本989.7 解決動態(tài)鏈接問題1009.7.1 鏈接或載入DLL1009.7.2 無法找到DLL文件1019.7.3 分析載入器問題1029.7.4 在DLL中設(shè)置斷點1039.7.5 提供DLL問題的錯誤消息104第10章 高級調(diào)試10710.1 在C++函數(shù)、方法和操作符中設(shè)置斷點10710.2 在模板化的函數(shù)和C++類中設(shè)置斷點10910.3 進入C++方法11010.3.1 用step-into命令進入到隱式函數(shù)中11210.3.2 用step-out命令跳過隱式函數(shù)11210.3.3 利用臨時斷點跳過隱式函數(shù)11310.3.4 從隱式函數(shù)調(diào)用返回11310.4 條件斷點和斷點命令11410.5 調(diào)試靜態(tài)構(gòu)造/析構(gòu)函數(shù)11610.5.1 由靜態(tài)初始化程序的順序依賴性引起的bug11710.5.2 識別靜態(tài)初始化程序的棧跟蹤11810.5.3 在靜態(tài)初始化之前連接調(diào)試器11810.6 使用觀察點11910.7 捕捉信號12010.8 捕獲異常12210.9 讀取棧跟蹤12410.9.1 帶調(diào)試信息編譯的源代碼的棧跟蹤12410.9.2 不帶調(diào)試信息編譯的源代碼的棧跟蹤12410.9.3 不帶任何調(diào)試信息的幀12510.9.4 實際工作中的棧跟蹤12510.9.5 改編后的函數(shù)名稱12610.9.6 被破壞的棧跟蹤12610.9.7 核心轉(zhuǎn)儲12710.10 操縱正在運行的程序12810.10.1 修改變量13010.10.2 調(diào)用函數(shù)13110.10.3 修改函數(shù)的返回值13210.10.4 中止函數(shù)調(diào)用13210.10.5 跳過或重復(fù)執(zhí)行個別語句13310.10.6 輸出和修改內(nèi)存內(nèi)容13310.11在沒有調(diào)試信息時進行調(diào)試13510.11.1 從棧讀取函數(shù)參數(shù)13710.11.2 讀取局部/全局變量和用戶定義的數(shù)據(jù)類型13810.11.3 在源代碼中查找語句的大概位置13910.11.4 走查匯編代碼140第11章 編寫可調(diào)試的代碼14311.1 注釋的重要性14311.1.1 函數(shù)簽名的注釋14411.1.2 對折中辦法的注釋14411.1.3 為不確定的代碼加注釋14411.2 采用一致的編碼風(fēng)格14411.2.1 仔細(xì)選擇名稱14511.2.2 不要使用“聰明過頭”的結(jié)構(gòu)14511.2.3 不要壓縮代碼14511.2.4 為復(fù)雜表達(dá)式使用臨時變量14511.3 避免使用預(yù)處理器宏14611.3.1 使用常量或枚舉來替代宏14611.3.2 使用函數(shù)來替代預(yù)處理器宏14811.3.3 調(diào)試預(yù)處理器輸出14911.3.4 使用功能更強的預(yù)處理器15011.4 提供更多調(diào)試函數(shù)15111.4.1 顯示用戶定義的數(shù)據(jù)類型15111.4.2 自檢查代碼15211.4.3 為操作符創(chuàng)建一個函數(shù),以便幫助調(diào)試15311.5 為事后調(diào)試做準(zhǔn)備153第12章 靜態(tài)檢查的作用15512.1 使用編譯器作為調(diào)試工具15512.1.1 不要認(rèn)為警告是無害的15612.1.2 使用多個編譯器來檢查代碼15812.2 使用lint15812.3 使用靜態(tài)分析工具15812.3.1 了解靜態(tài)檢查器15812.3.2 將靜態(tài)檢查器檢測到的錯誤減至(接近)零16012.3.3 完成代碼清理后重新運行所有測試用例16012.4 靜態(tài)分析的高級應(yīng)用161第13章 結(jié)束語163附錄A 調(diào)試命令165附錄B 工具資源167附錄C 源代碼179參考文獻189
章節(jié)摘錄
插圖:有了源代碼調(diào)試器(以下簡稱調(diào)試器)以后,就可以逐行地走查源代碼,查看程序的條件語句和循環(huán)語句都經(jīng)過了哪些路徑,顯示哪些函數(shù)被調(diào)用了,以及顯示目前正處于函數(shù)調(diào)用棧的什么位置。我們可以檢查變量值,并在個別的代碼行中設(shè)置斷點,然后讓程序運行,直至到達(dá)此行。這是在復(fù)雜程序中進行導(dǎo)航的便利方法。調(diào)試器將顯示程序都執(zhí)行了哪些操作,這是修復(fù)任何bug的先決條件。如果代碼是自己編寫的,調(diào)試器可以幫助實現(xiàn)預(yù)期行為,即代碼的功能。如果是別人編寫的,調(diào)試將呈現(xiàn)出代碼執(zhí)行的動態(tài)視圖,以補充靜態(tài)代碼檢查。本章將介紹基本的源代碼調(diào)試器功能,并講述如何用它們來查找C和C++程序中的bug。同時介紹獨立于特定的計算機平臺或工具。示例中將使用兩個非常常見的調(diào)試器:GDB和VisualStudio。同時列出GDB和VisualStudio訪問每個被討論的特性的命令。為了節(jié)省篇幅,這里只展示節(jié)選的GDB輸出并簡要介紹Visual Studio如何輸出結(jié)果,不會給出屏幕截圖。GNU調(diào)試器GDB代表從具有命令行接口的命令行解釋器(command shell)運行的調(diào)試器。GDB與GCC編譯器一起使用,已經(jīng)被植入很多操作系統(tǒng)中,如Windows、Solaris、15NIX、Linux和用于嵌入式系統(tǒng)的操作系統(tǒng)。有關(guān)GDB的下載信息和文檔,參見附錄B.2.3。
媒體關(guān)注與評論
“如果我最初開始調(diào)試程序時就能有這樣一本書,該多好??!我想我會屏息注視,看看這些調(diào)試工具將帶給我什么驚喜,而且采納書中的建議必然會節(jié)省大量手工調(diào)試的時間,可以將這些時間投入到其他工作中。譬如說,我可以使代碼更可靠,這樣最后可能根本不必做任何調(diào)試了?!薄 狝ndreas Zeller,GNU DDD創(chuàng)始人“逐頁閱讀完本書之后,我必須承認(rèn)這是我讀過的最好的一本軟件調(diào)試圖書,在很多方面都是其他書不能匹敵的……強烈推薦軟件調(diào)試人員閱讀?!薄 獁ww.dumpanalysis.org(崩潰轉(zhuǎn)儲分析和調(diào)試門戶網(wǎng)站)
編輯推薦
《軟件調(diào)試實戰(zhàn)》是4位深諳軟件調(diào)試之道的資深開發(fā)人員的實戰(zhàn)經(jīng)驗總結(jié),不僅講述了簡單的源代碼調(diào)試,還涵蓋了各個領(lǐng)域的最常見的實際問題,包括程序鏈接、內(nèi)存存取、并行處理和性能分析。最后幾章討論了靜態(tài)檢查器,介紹了一些較好地運用了調(diào)試技巧的代碼編寫方法。書中講述的調(diào)試技術(shù)不僅可以用于C/C++程序,還可以用于其他語言編寫的程序。軟件調(diào)試是軟件開發(fā)中最令人苦惱的環(huán)節(jié)。反復(fù)思考每個假設(shè),反復(fù)斟酌從需求到實現(xiàn)的每個步驟,將耗費大量時間。最糟糕的是,調(diào)試根本無法預(yù)測,我們永遠(yuǎn)無法知道修復(fù)一個bug需要多長時間,甚至根本不知道是否還能修復(fù)它。然而,如果采用系統(tǒng)的方式并配備合適的工具,調(diào)試也會充滿樂趣,成功的調(diào)試就像解出難題、猜出謎語或破獲奇案一樣令人激動。這本書就能幫你實現(xiàn)這一驚天逆轉(zhuǎn)。Amazon五星圖書Synopsys公司專家的調(diào)試經(jīng)驗總結(jié)軟件調(diào)試權(quán)威指南
圖書封面
圖書標(biāo)簽Tags
無
評論、評分、閱讀與下載