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

出版時(shí)間:2010-2  出版社:人民郵電出版社  作者:Thorsten Grotker,Ulrich Holtmann,Holger Keding,Markus Wloka  頁(yè)數(shù):190  譯者:趙俐  
Tag標(biāo)簽:無(wú)  

前言

在所有軟件開發(fā)工作中,調(diào)試或許是最令人苦惱的。調(diào)試工作極易受到指責(zé),因?yàn)榧夹g(shù)失敗即意味著做人失敗,而且矛頭直指調(diào)試人員,昭示出他們所犯下的錯(cuò)誤。由于必須反復(fù)思考每個(gè)假設(shè),反復(fù)斟酌從需求到實(shí)現(xiàn)的每個(gè)步驟,因此調(diào)試將耗費(fèi)大量時(shí)間。最糟糕的是,調(diào)試還無(wú)法預(yù)測(cè),我們永遠(yuǎn)無(wú)法知道修復(fù)一個(gè)bug需要多長(zhǎng)時(shí)間,甚至根本不知道是否能夠修復(fù)它。問(wèn)一下開發(fā)人員他們生活中最沮喪的時(shí)刻,大多數(shù)回答將與調(diào)試有關(guān)。也許現(xiàn)在正是深夜11點(diǎn),你仍在忙著調(diào)試,正當(dāng)對(duì)程序進(jìn)行走查時(shí),你的家人打電話給你,問(wèn)你到底什么時(shí)候才能回家,而你只希望盡快放下電話,因?yàn)楹貌蝗菀椎玫降挠^察結(jié)果和推斷正要從腦中溜走。此時(shí),你可能最后有兩種選擇:一是重新調(diào)試,二是過(guò)后再試圖重修舊好。據(jù)我個(gè)人估計(jì),調(diào)試是導(dǎo)致程序員離婚的第一大原因。然而,調(diào)試也蘊(yùn)含著樂(lè)趣,就像解出難題、猜出謎語(yǔ)或破獲謀殺案一樣令人激動(dòng),但前提條件是必須采用系統(tǒng)性的方式并配備正確的工具。這正是本書的用武之地。本書四位作者直接與那些固持己見的開發(fā)者對(duì)話,直截了當(dāng)?shù)靥岢鼋鉀Q調(diào)試問(wèn)題的建議,并給出了真正快速的解決方案。無(wú)論是解決內(nèi)存問(wèn)題,調(diào)試并行程序,還是處理工具鏈引入的問(wèn)題,本書都能夠提供“急救措施”,書中的建議都是經(jīng)過(guò)反復(fù)嘗試和驗(yàn)證的。如果我最初開始調(diào)試程序時(shí)就能有這樣一本書,該多好?。∥蚁胛視?huì)屏息注視,看看這些調(diào)試工具將帶給我什么驚喜,而且采納書中的建議,必然會(huì)節(jié)省大量手工調(diào)試的時(shí)間,并可將這些時(shí)間投入到其他工作中。譬如說(shuō),可以使代碼更可靠,這樣最后可能根本不必做任何調(diào)試了。當(dāng)然,這是專業(yè)編程的長(zhǎng)期目標(biāo),即從一開始就編寫正確的代碼,通過(guò)某種確認(rèn)或驗(yàn)證方法來(lái)杜絕所有錯(cuò)誤(或至少檢測(cè)到錯(cuò)誤)。目前,斷言和單元測(cè)試已經(jīng)在提高程序可信度方面提供了很多幫助。未來(lái)可能會(huì)有一些用于行業(yè)級(jí)系統(tǒng)的成熟驗(yàn)證方法。我們現(xiàn)在尚未實(shí)現(xiàn)這樣的方法,這可能需要很多年,而且當(dāng)達(dá)到這個(gè)目標(biāo)時(shí),所實(shí)現(xiàn)的方法肯定不會(huì)適用于現(xiàn)在的編程語(yǔ)言。在處理當(dāng)今的程序,特別是那些C和C++程序時(shí),我們?nèi)詫⒃谡{(diào)試上花費(fèi)一定時(shí)間——這正是本書的寶貴價(jià)值所在。

內(nèi)容概要

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

作者簡(jiǎn)介

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

書籍目錄

第1章 誰(shuí)編寫軟件,誰(shuí)制造bug(為什么需要本書)1第2章 系統(tǒng)性調(diào)試方法32.1 為什么要遵循結(jié)構(gòu)化的過(guò)程32.2 充分利用機(jī)會(huì)32.3 13條黃金規(guī)則52.3.1 理解需求52.3.2 制造失敗62.3.3 簡(jiǎn)化測(cè)試用例62.3.4 讀取恰當(dāng)?shù)腻e(cuò)誤消息62.3.5 檢查顯而易見的問(wèn)題62.3.6 從解釋中分離出事實(shí)72.3.7 分而治之72.3.8 工具要與bug匹配82.3.9 一次只做一項(xiàng)更改92.3.10 保持審計(jì)跟蹤92.3.11 獲得全新觀點(diǎn)92.3.12 bug不會(huì)自己修復(fù)92.3.13 用回歸測(cè)試來(lái)檢查bug修復(fù)102.4 構(gòu)建一個(gè)好的工具包102.4.1 工具箱112.4.2 每天運(yùn)行測(cè)試,防止出現(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)試與機(jī)密性142.5.6 更多讀物15第3章 查找根源——源代碼調(diào)試器173.1 可視化程序行為173.2 準(zhǔn)備簡(jiǎn)單的可預(yù)測(cè)的示例183.3 使調(diào)試器與程序一起運(yùn)行183.4 學(xué)習(xí)在程序崩潰時(shí)執(zhí)行棧跟蹤213.5 學(xué)習(xí)使用斷點(diǎn)213.6 學(xué)習(xí)在程序中導(dǎo)航223.7 學(xué)習(xí)檢查數(shù)據(jù):變量和表達(dá)式223.8 一個(gè)簡(jiǎn)單示例的調(diào)試會(huì)話23第4章 修復(fù)內(nèi)存問(wèn)題274.1 C/C++中的內(nèi)存管理——功能強(qiáng)大但很危險(xiǎn)274.1.1 內(nèi)存泄漏274.1.2 內(nèi)存管理的錯(cuò)誤使用284.1.3 緩沖區(qū)溢出284.1.4 未初始化的內(nèi)存bug284.2 有效的內(nèi)存調(diào)試器284.3 示例1:檢測(cè)內(nèi)存訪問(wèn)錯(cuò)誤294.3.1 檢測(cè)無(wú)效的寫訪問(wèn)304.3.2 檢測(cè)對(duì)未初始化的內(nèi)存的讀取操作304.3.3 檢測(cè)內(nèi)存泄漏314.4 示例2:對(duì)內(nèi)存分配/釋放的不完整調(diào)用314.5 結(jié)合使用內(nèi)存調(diào)試器和源代碼測(cè)試器334.6 減少干擾,排查錯(cuò)誤334.7 何時(shí)使用內(nèi)存調(diào)試器344.8 約束344.8.1 測(cè)試用例應(yīng)該有很好的代碼覆蓋率344.8.2 提供更多計(jì)算機(jī)資源354.8.3 可能不支持多線程354.8.4 對(duì)非標(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步:測(cè)量?jī)?nèi)存使用395.5.1 使用多個(gè)輸入395.5.2 在固定時(shí)間間隔停止程序395.5.3 用簡(jiǎn)單工具測(cè)量?jī)?nèi)存使用405.5.4 使用top405.5.5 使用WindowsTaskManager415.5.6 為testmalloc選擇相關(guān)輸入值425.5.7 確定機(jī)器上的內(nèi)存是如何被釋放的425.5.8 使用內(nèi)存剖析工具435.6 第4步:查明大部分內(nèi)存被哪些數(shù)據(jù)結(jié)構(gòu)占用了445.7 綜合練習(xí)——genindex示例455.7.1 核實(shí)沒(méi)有大的內(nèi)存泄漏465.7.2 估計(jì)內(nèi)存使用465.7.3 測(cè)量?jī)?nèi)存使用465.7.4 查找使用內(nèi)存的數(shù)據(jù)結(jié)構(gòu)47第6章 解決性能問(wèn)題516.1 分步查找性能bug516.1.1 執(zhí)行前期分析516.1.2 使用簡(jiǎn)單的時(shí)間測(cè)量方法526.1.3 創(chuàng)建測(cè)試用例526.1.4 使測(cè)試用例具有可再現(xiàn)性536.1.5 檢查程序的正確性536.1.6 創(chuàng)建可擴(kuò)展的測(cè)試用例536.1.7 排除對(duì)測(cè)試用例的干擾546.1.8 用time命令測(cè)量時(shí)可能會(huì)發(fā)生錯(cuò)誤和偏差546.1.9 選擇一個(gè)能夠揭示運(yùn)行時(shí)間瓶頸的測(cè)試用例556.1.10 算法與實(shí)現(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)試競(jìng)爭(zhēng)條件727.2.1 使用基本調(diào)試器功能來(lái)查找競(jìng)爭(zhēng)條件737.2.2 使用日志文件來(lái)查找競(jìng)爭(zhēng)條件747.3 調(diào)試死鎖767.3.1 如何確定正在運(yùn)行的是哪個(gè)線程777.3.2 分析程序的線程787.4 了解線程分析工具787.5 異步事件和中斷處理程序80第8章 查找環(huán)境和編譯器問(wèn)題838.1 環(huán)境變更——問(wèn)題的根源838.1.1 環(huán)境變量838.1.2 本地安裝依賴848.1.3 當(dāng)前工作目錄依賴848.1.4 進(jìn)程ID依賴848.2 如何查看程序正在做什么848.2.1 用top來(lái)查看進(jìn)程848.2.2 用ps來(lái)查找應(yīng)用程序的多個(gè)進(jìn)程858.2.3 使用/proc/來(lái)訪問(wèn)進(jìn)程858.2.4 使用strace跟蹤對(duì)操作系統(tǒng)的調(diào)用858.3 編譯器和調(diào)試器也有bug878.3.1 編譯器bug878.3.2 調(diào)試器和編譯器兼容性問(wèn)題88第9章 處理鏈接問(wèn)題899.1 鏈接器的工作原理899.2 構(gòu)建并鏈接對(duì)象899.3 解析未定義的符號(hào)919.3.1 丟失鏈接器參數(shù)919.3.2 搜索丟失的符號(hào)919.3.3 鏈接順序問(wèn)題929.3.4 C++符號(hào)和名稱改編939.3.5 符號(hào)的反改編949.3.6 鏈接C和C++代碼949.4 具有多個(gè)定義的符號(hào)959.5 信號(hào)沖突969.6 識(shí)別編譯器和鏈接器版本不匹配969.6.1 系統(tǒng)庫(kù)不匹配979.6.2 對(duì)象文件不匹配979.6.3 運(yùn)行時(shí)崩潰989.6.4 確定編譯器版本989.7 解決動(dòng)態(tài)鏈接問(wèn)題1009.7.1 鏈接或載入DLL1009.7.2 無(wú)法找到DLL文件1019.7.3 分析載入器問(wèn)題1029.7.4 在DLL中設(shè)置斷點(diǎn)1039.7.5 提供DLL問(wèn)題的錯(cuò)誤消息104第10章 高級(jí)調(diào)試10710.1 在C++函數(shù)、方法和操作符中設(shè)置斷點(diǎn)10710.2 在模板化的函數(shù)和C++類中設(shè)置斷點(diǎn)10910.3 進(jìn)入C++方法11010.3.1 用step-into命令進(jìn)入到隱式函數(shù)中11210.3.2 用step-out命令跳過(guò)隱式函數(shù)11210.3.3 利用臨時(shí)斷點(diǎn)跳過(guò)隱式函數(shù)11310.3.4 從隱式函數(shù)調(diào)用返回11310.4 條件斷點(diǎn)和斷點(diǎn)命令11410.5 調(diào)試靜態(tài)構(gòu)造/析構(gòu)函數(shù)11610.5.1 由靜態(tài)初始化程序的順序依賴性引起的bug11710.5.2 識(shí)別靜態(tài)初始化程序的棧跟蹤11810.5.3 在靜態(tài)初始化之前連接調(diào)試器11810.6 使用觀察點(diǎn)11910.7 捕捉信號(hào)12010.8 捕獲異常12210.9 讀取棧跟蹤12410.9.1 帶調(diào)試信息編譯的源代碼的棧跟蹤12410.9.2 不帶調(diào)試信息編譯的源代碼的棧跟蹤12410.9.3 不帶任何調(diào)試信息的幀12510.9.4 實(shí)際工作中的棧跟蹤12510.9.5 改編后的函數(shù)名稱12610.9.6 被破壞的棧跟蹤12610.9.7 核心轉(zhuǎn)儲(chǔ)12710.10 操縱正在運(yùn)行的程序12810.10.1 修改變量13010.10.2 調(diào)用函數(shù)13110.10.3 修改函數(shù)的返回值13210.10.4 中止函數(shù)調(diào)用13210.10.5 跳過(guò)或重復(fù)執(zhí)行個(gè)別語(yǔ)句13310.10.6 輸出和修改內(nèi)存內(nèi)容13310.11在沒(méi)有調(diào)試信息時(shí)進(jìn)行調(diào)試13510.11.1 從棧讀取函數(shù)參數(shù)13710.11.2 讀取局部/全局變量和用戶定義的數(shù)據(jù)類型13810.11.3 在源代碼中查找語(yǔ)句的大概位置13910.11.4 走查匯編代碼140第11章 編寫可調(diào)試的代碼14311.1 注釋的重要性14311.1.1 函數(shù)簽名的注釋14411.1.2 對(duì)折中辦法的注釋14411.1.3 為不確定的代碼加注釋14411.2 采用一致的編碼風(fēng)格14411.2.1 仔細(xì)選擇名稱14511.2.2 不要使用“聰明過(guò)頭”的結(jié)構(gòu)14511.2.3 不要壓縮代碼14511.2.4 為復(fù)雜表達(dá)式使用臨時(shí)變量14511.3 避免使用預(yù)處理器宏14611.3.1 使用常量或枚舉來(lái)替代宏14611.3.2 使用函數(shù)來(lái)替代預(yù)處理器宏14811.3.3 調(diào)試預(yù)處理器輸出14911.3.4 使用功能更強(qiáng)的預(yù)處理器15011.4 提供更多調(diào)試函數(shù)15111.4.1 顯示用戶定義的數(shù)據(jù)類型15111.4.2 自檢查代碼15211.4.3 為操作符創(chuàng)建一個(gè)函數(shù),以便幫助調(diào)試15311.5 為事后調(diào)試做準(zhǔn)備153第12章 靜態(tài)檢查的作用15512.1 使用編譯器作為調(diào)試工具15512.1.1 不要認(rèn)為警告是無(wú)害的15612.1.2 使用多個(gè)編譯器來(lái)檢查代碼15812.2 使用lint15812.3 使用靜態(tài)分析工具15812.3.1 了解靜態(tài)檢查器15812.3.2 將靜態(tài)檢查器檢測(cè)到的錯(cuò)誤減至(接近)零16012.3.3 完成代碼清理后重新運(yùn)行所有測(cè)試用例16012.4 靜態(tài)分析的高級(jí)應(yīng)用161第13章 結(jié)束語(yǔ)163附錄A 調(diào)試命令165附錄B 工具資源167附錄C 源代碼179參考文獻(xiàn)189

章節(jié)摘錄

插圖:有了源代碼調(diào)試器(以下簡(jiǎn)稱調(diào)試器)以后,就可以逐行地走查源代碼,查看程序的條件語(yǔ)句和循環(huán)語(yǔ)句都經(jīng)過(guò)了哪些路徑,顯示哪些函數(shù)被調(diào)用了,以及顯示目前正處于函數(shù)調(diào)用棧的什么位置。我們可以檢查變量值,并在個(gè)別的代碼行中設(shè)置斷點(diǎn),然后讓程序運(yùn)行,直至到達(dá)此行。這是在復(fù)雜程序中進(jìn)行導(dǎo)航的便利方法。調(diào)試器將顯示程序都執(zhí)行了哪些操作,這是修復(fù)任何bug的先決條件。如果代碼是自己編寫的,調(diào)試器可以幫助實(shí)現(xiàn)預(yù)期行為,即代碼的功能。如果是別人編寫的,調(diào)試將呈現(xiàn)出代碼執(zhí)行的動(dòng)態(tài)視圖,以補(bǔ)充靜態(tài)代碼檢查。本章將介紹基本的源代碼調(diào)試器功能,并講述如何用它們來(lái)查找C和C++程序中的bug。同時(shí)介紹獨(dú)立于特定的計(jì)算機(jī)平臺(tái)或工具。示例中將使用兩個(gè)非常常見的調(diào)試器:GDB和VisualStudio。同時(shí)列出GDB和VisualStudio訪問(wèn)每個(gè)被討論的特性的命令。為了節(jié)省篇幅,這里只展示節(jié)選的GDB輸出并簡(jiǎn)要介紹Visual Studio如何輸出結(jié)果,不會(huì)給出屏幕截圖。GNU調(diào)試器GDB代表從具有命令行接口的命令行解釋器(command shell)運(yùn)行的調(diào)試器。GDB與GCC編譯器一起使用,已經(jīng)被植入很多操作系統(tǒng)中,如Windows、Solaris、15NIX、Linux和用于嵌入式系統(tǒng)的操作系統(tǒng)。有關(guān)GDB的下載信息和文檔,參見附錄B.2.3。

媒體關(guān)注與評(píng)論

“如果我最初開始調(diào)試程序時(shí)就能有這樣一本書,該多好??!我想我會(huì)屏息注視,看看這些調(diào)試工具將帶給我什么驚喜,而且采納書中的建議必然會(huì)節(jié)省大量手工調(diào)試的時(shí)間,可以將這些時(shí)間投入到其他工作中。譬如說(shuō),我可以使代碼更可靠,這樣最后可能根本不必做任何調(diào)試了?!薄  狝ndreas Zeller,GNU DDD創(chuàng)始人“逐頁(yè)閱讀完本書之后,我必須承認(rèn)這是我讀過(guò)的最好的一本軟件調(diào)試圖書,在很多方面都是其他書不能匹敵的……強(qiáng)烈推薦軟件調(diào)試人員閱讀?!薄  獁ww.dumpanalysis.org(崩潰轉(zhuǎn)儲(chǔ)分析和調(diào)試門戶網(wǎng)站)

編輯推薦

《軟件調(diào)試實(shí)戰(zhàn)》是4位深諳軟件調(diào)試之道的資深開發(fā)人員的實(shí)戰(zhàn)經(jīng)驗(yàn)總結(jié),不僅講述了簡(jiǎn)單的源代碼調(diào)試,還涵蓋了各個(gè)領(lǐng)域的最常見的實(shí)際問(wèn)題,包括程序鏈接、內(nèi)存存取、并行處理和性能分析。最后幾章討論了靜態(tài)檢查器,介紹了一些較好地運(yùn)用了調(diào)試技巧的代碼編寫方法。書中講述的調(diào)試技術(shù)不僅可以用于C/C++程序,還可以用于其他語(yǔ)言編寫的程序。軟件調(diào)試是軟件開發(fā)中最令人苦惱的環(huán)節(jié)。反復(fù)思考每個(gè)假設(shè),反復(fù)斟酌從需求到實(shí)現(xiàn)的每個(gè)步驟,將耗費(fèi)大量時(shí)間。最糟糕的是,調(diào)試根本無(wú)法預(yù)測(cè),我們永遠(yuǎn)無(wú)法知道修復(fù)一個(gè)bug需要多長(zhǎng)時(shí)間,甚至根本不知道是否還能修復(fù)它。然而,如果采用系統(tǒng)的方式并配備合適的工具,調(diào)試也會(huì)充滿樂(lè)趣,成功的調(diào)試就像解出難題、猜出謎語(yǔ)或破獲奇案一樣令人激動(dòng)。這本書就能幫你實(shí)現(xiàn)這一驚天逆轉(zhuǎn)。Amazon五星圖書Synopsys公司專家的調(diào)試經(jīng)驗(yàn)總結(jié)軟件調(diào)試權(quán)威指南

圖書封面

圖書標(biāo)簽Tags

無(wú)

評(píng)論、評(píng)分、閱讀與下載


    軟件調(diào)試實(shí)戰(zhàn) PDF格式下載


用戶評(píng)論 (總計(jì)1條)

 
 

  •   還行吧 就是貴了點(diǎn)
 

250萬(wàn)本中文圖書簡(jiǎn)介、評(píng)論、評(píng)分,PDF格式免費(fèi)下載。 第一圖書網(wǎng) 手機(jī)版

京ICP備13047387號(hào)-7