姜 文,劉立康
(西安電子科技大學 通信工程學院,陜西 西安 710071)
軟件調試問題研究
姜 文,劉立康
(西安電子科技大學 通信工程學院,陜西 西安 710071)
對于軟件開發,軟件調試是非常重要的環節。尤其是對于多個開發部門一起進行開發的大型軟件系統,如何正確制定調試策略,進行軟件缺陷定位、診斷和糾錯是一項十分重要的工作。結合軟件開發的基本概念和過程,敘述了軟件調試的概念和軟件調試的基本過程。根據軟件規模,應用軟件開發可以分為大、中、小三種模式;針對三種軟件開發模式,分別介紹了軟件開發的角色,給出了用例圖,歸納分析了開發過程中軟件調試的特點。之后歸納出了軟件開發過程中有效調試的先決條件、軟件調試原則和策略、大型軟件調試技術。最后介紹了三個典型的軟件調試案例。工作實踐表明,深入研究軟件調試的理論與技術,有助于提高軟件開發效率和軟件質量,更好地滿足客戶對軟件產品的需求。
軟件測試;軟件調試;軟件配置管理;持續集成;基線
在程序開發過程中,一個公認的事實是編寫代碼并不難,但是排除代碼中的錯誤,卻不是一件容易的事情。排除代碼中的錯誤,涉及到軟件調試。目前軟件調試缺乏實用強大的調試支撐技術和輔助工具,主要以手工方式為主,具有很強的技巧性。隨著計算機技術的發展,需要進一步研究軟件調試的理論與技術。
軟件開發工作內容大致可分為五種:軟件設計、程序編碼、程序構建、軟件測試和軟件調試。
1.1軟件設計
給出可行的設計方案,將客戶的需求轉換成可以實現的設計規格文檔。完成需求設計、架構設計和詳細設計。將設計規格文檔提供給軟件開發人員進行軟件源代碼編碼。
1.2程序編碼
根據設計規格文檔,軟件開發人員進行程序編碼。
1.3程序構建
程序構建通常包括對程序代碼進行編譯和鏈接,從而生成可執行文件。
(1)程序編譯。
編譯器的基本功能就是將一種語言編寫的程序(源代碼)翻譯成用另一種語言表示的等價程序(目標代碼)。編譯器的出現為編程語言的繁榮,軟件產業的形成奠定了基礎。
(2)程序鏈接。
鏈接是將編譯器產生的多個目標文件合成為一個可以在目標平臺上執行的軟件模塊。
1.4軟件測試
1.4.1 軟件測試定義
迄今為止,軟件測試[1-2]沒有一個公認的準確定義,以下是兩個具有代表性的定義。IEEE給出的定義:使用人工和自動手段來運行或測試某個系統的過程,其目的在于檢驗它是否滿足規定的需求或是弄清預期結果與實際結果之間的差別。該定義明確提出了軟件測試以檢驗是否滿足需求為目標;著名的軟件工程專家Glenford J. Myers給出的定義:測試是為了發現程序中的錯誤而執行程序的過程。該定義強調測試的目的是檢測軟件中存在的錯誤。
1.4.2 靜態測試
靜態測試[3]是一種不通過執行程序而進行測試的技術。起初程序開發人員通過編譯器來檢查程序代碼的各種語法錯誤,現在通常采用靜態檢測工具檢查代碼的各種錯誤。靜態檢測工具通常具有編譯器的功能。這種測試能發現60%以上的錯誤。
1.4.3 動態測試
動態測試是通過執行程序,測試一個系統或組件的過程。程序在受控環境下運行,通過運行結果和特定期望結果進行對比,確定軟件程序在檢查狀態下是否正確。此種測試通常發現40%的錯誤。
2.1軟件調試的概念
軟件調試[2.4-7]是泛指重現軟件缺陷問題,定位和查找問題根源,最終解決問題的過程。
軟件調試通常有如下兩種不同的定義:
定義1:軟件調試是為了發現并排除軟件程序中的錯誤,可以通過某種方法控制被調試程序的執行過程,以便隨時查看和修改被調試程序執行狀態的方法。
在該定義中,軟件測試屬于軟件調試的一部分,與牛津詞典中的調試定義類似。在牛津詞典中調試定義為:“識別和排除計算機硬件或軟件中錯誤的過程。”
定義2:調試是執行一次成功的測試之后所要進行的工作。所謂成功的測試,是指它可以證明程序沒有實現預期的功能。調試包含兩個步驟,從執行了一個成功測試用例,發現問題后開始;第一步,確定程序中可疑錯誤的準確性質和位置;第二步,修改錯誤。
在該定義中軟件測試從調試工作中分離出來。
2.2軟件調試的基本過程
按照定義2,軟件系統調試的基本過程如下:
(1)重現問題:重現軟件測試發現的問題;
(2)問題定位:確定可能發生問題的程序段位置;
(3)查找原因:分析相關代碼,確定導致缺陷問題的內在原因;
(4)設計方案:提出軟件缺陷問題解決方案;
(5)修改代碼:根據設計方案修改程序代碼;
(6)驗證和確認:采用審查、分析和測試等技術來確定錯誤是否被排除,是否引入了新的錯誤。
上述6個步驟不斷迭代進行,直至問題解決。
軟件調試基本過程如圖1所示。

圖1 軟件調試的基本過程
在這些步驟中,問題定位和查找原因是軟件調試的關鍵環節,其工作量約占總工作量的90%以上。軟件調試是一項既耗時又費力,同時又富有技巧性的工作。目前軟件調試中的問題定位[8-9]研究的比較多。
2.3軟件調試和版本管理的關系
軟件調試和版本管理[10-11]的關系非常密切,通常采用軟件配置管理工具進行版本管理。
(1)在軟件調試過程中可能有多種算法都可達到預期的目標,但只能選擇其中一種,這時需要保留各種有價值的算法版本;軟件調試完成后,需要進行代碼優化,在代碼優化的過程中需要保留各種不同的版本;軟件調試完成后,需要增加功能和提升性能,在此基礎上開展下一步調試工作,需要保留調試好的軟件版本。
(2)在多人開發同一個軟件系統的過程中,需要通過版本管理調試解決代碼沖突問題。
(3)軟件產品實際上是某個版本的軟件產品,從某種意義上來講,軟件產品打補丁和開發軟件的新版本是更高層次的軟件開發調試工作。
根據軟件代碼規模,應用軟件的開發大致分為三種模式。
3.1程序員個人開發的小軟件
3.1.1 用例圖
這種模式和早期的軟件開發模式類似。小軟件開發用例圖如圖2所示。

圖2 程序員開發的小軟件用例圖
3.1.2 軟件調試的特點
發現問題(測試)、定位問題和提出解決問題方案、修改程序代碼、驗證全部由程序員負責。軟件調試可以分為靜態調試與動態調試。
1)靜態調試。
源程序代碼編譯時同時對源代碼進行靜態檢查,編譯器提供了源代碼各種編程錯誤和錯誤所在的位置。靜態調試就是程序員逐條修改編譯器提示的錯誤,通過代碼編譯這一關。
2)動態調試。
動態調試分為查錯和糾錯。查錯就是對程序進行功能性能測試,查找各種不符合設計要求的各種問題;糾錯就是根據發現的問題,查找原因,修改程序源代碼。這里的軟件調試工作包括軟件測試。動態調試通常采用以下兩種方式:
(1)仔細分析發現的問題,通過推理來查找發生問題的原因。程序員對程序的架構設計、編碼實現十分熟悉,往往能比較快地定位和處理問題。這種方式通常具有全局觀念,可以避免解決問題過程中誘導出現其他問題。
(2)通過調試工具采用人機交互方式調試代碼。這種方式是逐條執行和跟蹤程序代碼,觀察各種狀態和變量的變化,檢查是否符合程序設計的要求來定位問題。這種方式有助于查找程序代碼的微觀錯誤,要求程序員對程序代碼的實現十分熟悉。
這兩種方式是互補的,綜合應用調試程序代碼。
3)版本管理。
版本管理通常采用小型軟件配置管理工具VSS,也可采用文件存儲的方式。
3.2程序組軟件開發
這種模式與軟件開發中期的開發模式類似。通常軟件分為多個軟件模塊,每個程序員僅負責自己開發的軟件模塊。這種開發模式通常用于中、小型軟件的開發。
3.2.1 角色和用例圖
軟件設計人員:負責軟件設計,提供設計規格文檔。
程序開發組:程序代碼編寫和程序調試,負責軟件的版本管理和集成構建。
測試人員:負責軟件功能、性能測試。
程序組開發的軟件用例圖如圖3所示。

圖3 程序組開發的軟件(中、小型軟件)用例圖
3.2.2 軟件調試的特點
1)軟件的設計工作和大部分測試工作從程序組工作中分離出去。設計人員負責軟件設計,程序員負責程序代碼的實現,定位問題和提出解決問題方案往往由設計人員和程序組共同合作處理,程序員負責軟件糾錯(程序代碼修改),測試人員負責測試工作。
2)調試分為兩個階段:
(1)開發組自己測試軟件。
程序員完成程序源代碼的編寫,程序代碼的靜態檢查,使用調試工具對程序代碼進行功能點的調試。所有的功能點都調試完成后,通過組內代碼評審之后,將源代碼合入版本庫。
開發組組長指定某個程序員負責程序代碼的集成構建,編譯過程中發現的問題,反饋給相關的程序員進行處理。源代碼完成集成構建之后,打包提交給測試人員測試。
(2)測試人員測試軟件。
測試人員根據設計規格文檔設計測試用例,測試提交過來的軟件包。測試人員發現的各種問題反饋給程序開發組進行軟件調試處理。程序開發組和設計人員確定發生問題的原因,確定修改方案,分配給相關的程序員進行代碼糾錯處理。對于比較復雜的問題,軟件設計人員需要提供實現編碼的設計文檔。程序代碼修改后,進行驗證和確認。
3)版本管理通常采用軟件配置管理工具SVN。通過版本管理工具對程序員提交的代碼進行沖突檢查,通過調試處理保證代碼的兼容性和一致性。
3.3項目組開發的軟件
軟件通常由多個模塊組成,每個模塊由若干開發單元組成。開發單元分配給程序員編寫程序代碼。這種開發模式通常用于大型軟件的開發。
3.3.1 角色和用例圖
(1)軟件設計組:提供總體和各模塊的設計規格文檔。
(2)軟件開發組:按模塊分為開發小組,開發小組將開發單元分配給程序員進行程序編碼。
(3)軟件配置管理員:負責基線和版本庫的管理。
(4)持續集成工程師:負責軟件的持續集成[10-12]工作,搭建的集成構建工程,通過制定定時任務來自動完成從版本庫更新代碼、靜態檢查、編譯、出包、冒煙測試等任務。冒煙測試也稱為預測試,對集成構建成功的軟件包的主要功能進行快速自動化測試。構建成功,可以獲得最新Build版本,建立新的編碼基線。持續集成工程師進行全量構建生成內部轉測試版本,提交測試組進行的測試工作。
(5)軟件測試組:對軟件轉測試版本進行功能、性能測試,通過后產生測試(Tested)基線。為持續集成工作提供進行冒煙測試的自動化測試用例腳本包,搭建相應的測試環境。
項目組開發軟件(通常為大型軟件)用例圖如圖4所示。

圖4 項目組開發軟件(大型軟件)用例圖
3.3.2 軟件調試的特點
1)軟件設計人員和軟件測試人員增加了,有的軟件項目測試人員比開發人員還要多。軟件測試不僅要發現程序編碼中的問題,而且測試軟件設計中的問題。設計中的問題自然由設計人員處理,程序編碼中的問題由設計人員和開發人員共同處理。
2)軟件的版本管理和集成構建工作由專人負責,實行基線和版本庫的管理。基線管理[13-14]為全體開發人員提供統一的開發基點,統一的程序接口。通過控制集成構建的頻率,有助于及時發現程序代碼問題。
3)軟件調試分為三個階段:
(1)開發人員調試自己開發軟件單元。
程序開發人員每天從版本庫檢出需要的文件,放在本地作為工作副本開始工作。在工作副本上進行查看、修改、編譯、運行、調試等操作。為了提供高質量的代碼,需要對編寫好的代碼進行單元測試,靜態走碼檢查,沖突處理和本地構建工作,處理發現的各種問題。最后將評審過的代碼提交到版本庫。開發人員向版本庫提交時,要添加注釋、說明、CR單號、修改原因等,以保證可追溯。
(2)處理持續集成工程師發現的問題。
通常持續集成工作包括靜態測試、編譯、鏈接和冒煙測試,每一步發現問題都要反饋給相關開發人員處理,直到通過集成構建。
(3)處理測試組發現的問題。
測試組測試轉測試版本,將測試結果反饋給相關人員,對存在的問題逐一定位,查找原因,修改程序,對每個軟件缺陷問題進行跟蹤管理,直到問題解決為止。
4)設計人員和程序員共同處理反饋的各種問題,定位問題和提出解決問題方案。程序員負責程序代碼修改,測試人員負責驗證和確認工作。
5)版本管理可以選擇SVN、ClearCase、Git等軟件配置管理工具。通過版本管理工具進行軟件的版本管理、基線管理和代碼沖突檢查。
6)軟件開發過程中采用持續集成和基線管理技術,可以更有效地進行開發和調試工作。
4.1軟件有效調試的先決條件
開展調試工作前要做好必要的準備工作。
1)了解設計和算法。
調試一個軟件模塊,需要了解它的設計和實現算法,了解各個函數之間的調用關系,該模塊與其他模塊之間的接口關系。
2)高質量的程序代碼。
程序開發者應該提供高質量的程序代碼,包括規范的代碼和必要的注釋,對開發的代碼進行單元測試,經過同行嚴格的代碼評審。一個復雜的模塊,代碼被分成許多子程序,其中大部分不超過10至15行。
3)熟悉軟件運行環境。
隨著網絡技術、云技術、大數據技術的發展,軟件運行環境越來越復雜,調試者只有熟悉這些環境和環境配置,才能實現在線軟件調試。
4)熟悉調試工具。
以Linux環境下C/C++程序為例,調試者需要熟悉GCC編譯器和GDB調試工具。
5)動態軟件調試的條件。
動態調試軟件模塊需要正確配置調試環境,實現兩個功能:可以調用模塊所提供的功能;能夠得到調用結果的信息,模塊內部狀態的變化,當一個錯誤發生時該模塊的動態。
6)軟件開發過程的管理。
對于大型軟件項目調試,管理工作十分重要。
(1)程序代碼和文檔管理:在軟件開發過程中,底層模塊和被多個開發者調用的函數不能修改,對其更新要經過嚴格的程序和審定。完善的軟件文檔可以為軟件調試提供有用的信息。
(2)人員管理:軟件調試過程中,需要查找模塊的設計人員和開發人員,需要他們參與調試工作或者為調試工作提供幫助,因為他們對相關的模塊和程序段最熟悉。
4.2軟件調試原則和策略
(1)熟悉軟件設計和編碼。
讓熟悉軟件設計和編碼的人參與調試工作,修改錯誤也是程序設計的一種形式。在程序設計階段使用的方法都可以應用到程序錯誤的修正工作中。
(2)從軟件模塊的最小集成包開始。
在增量式軟件開發過程中,軟件模塊最初的起始可能是一個最低功能限度的集成包,隨后新的代碼不斷加入到系統中。調試工作可以從最小的集成包開始,不斷增加代碼和模塊來查找、定位問題。
(3)分而治之。
每次只處理一個問題,把被調試組件從其上下文組件之中孤立出來,通過設計驅動模塊和樁模塊進行調試。
(4)發現問題及時反饋和處理。
檢測到的錯誤越早,就越容易找到原因。如果等到問題癥狀出現在客戶端接口,那么可能很難縮小發生問題的原因列表。
(5)兼顧全局。
程序代碼錯誤修改兼顧全局,確保修改錯誤沒有影響軟件的其他部分。
(6)徹底修改。
如果提出的修改方案不能解釋與該錯誤有關的全部線索,那就表明只修改了錯誤的一部分,必須對錯誤進行徹底修改。
(7)關注相關問題。
在查找問題根源時,對可能發現的一些相關問題也要做處理。暫時不能處理的相關問題應該記錄在案,為以后的調試工作保留相關信息。
(8)自頂向下的方法。
通常采用自頂向下或模塊化方法來編寫代碼。采用自頂向下或模塊化的方法來調試代碼,可以縮小軟件問題定位的范圍,提高調試效率。
4.3大型軟件調試技術
大部分文獻資料都是介紹傳統的軟件調試方法,主要關注小型軟件或者軟件模塊中組件的調試方法。文中介紹一些大型軟件開發過程的調試技術。
1)分析和推理。
設計人員和開發人員根據軟件缺陷問題的信息,分析和推理調試軟件。
(1)根據軟件程序架構自頂向下縮小定位范圍,確定可能發生問題的軟件組件。
(2)根據軟件功能,軟件運行時序定位軟件問題。
(3)根據算法原理,分析和確定缺陷問題發生的根源。
2)歸納類比法。
該方法主要是根據積累的工作經驗和案例處理調試工作。
(1)根據工作經驗和比對程序設計中類似問題的處理方式進行調試工作。
(2)咨詢相關部門和有經驗的相關人員。
(3)查找相關文檔和案例,為處理問題提供思路和方法。在大型軟件開發過程中,通常對每個缺陷問題進行跟蹤管理,將解決問題的方案和過程詳細記錄。
3)跟蹤回朔。
大型軟件開發通常采用基線與版本管理。基線為程序代碼開發提供統一的開發基點,基線的建立有助于分清楚各個階段存在的問題,便于對缺陷問題定位。軟件版本在軟件產品的開發過程中生成了一個版本樹。軟件產品實際上是某個軟件版本,新產品的開發通常是在某個軟件版本的基礎上進行開發。
(1)開發過程中發現有問題,可以回退至版本樹上的穩定版本,查找問題根源。
(2)通過基線版本序列可以追蹤產品的各種問題,可以重新建立基于某個版本的配置,可以重現軟件開發過程中的軟件缺陷和各種問題,進行定位并查找問題根源。
4)增量調試。
大型軟件開發大多采用軟件配置管理和持續集成技術。開發人員每天將評代碼提交到版本庫。持續集成人員完成集成構建工作。可以通過控制持續集成的粒度(構建時間間隔),控制開發人員提交到版本庫的程序代碼量,從而便于對缺陷問題定位。通常每天晚上進行持續集成工作,發現問題時,開發人員實際上只需要調試處理當天編寫的代碼。
5)寫出能重現問題的最短代碼。
采用程序切片和插樁技術寫出能重現問題的最短代碼調試軟件模塊。
(1)程序切片[15]。
程序切片是通過在特定位置消除那些不影響表達式計算的所有語句,把程序減少到最小化形式,并仍能產生給定的行為。使用切片技術,可以把一個規模較大并且較復雜的軟件模塊轉換成多個切片程序。這些切片程序相對原來的程序,簡單并且易于調試和測試。
(2)程序插樁。
程序插樁方法是在被測程序中插入某些語句或者程序段來獲取各種信息。通過這些信息進一步了解執行過程中程序的一些動態特性。一個軟件組件的獨立調試和測試需要采用插樁技術,該組件調用或運行需要樁模塊。
在軟件模塊的調試過程中程序切片和程序插樁可以結合起來使用。
6)日志追蹤技術。
日志是一種記錄機制,軟件模塊持續集成構建過程中,日志文件記錄了有用信息。若構建失敗,通過查看日志文件,將信息反饋給相關人員進行軟件調試。
7)調試和測試融合的技術。
(1)測試驅動開發[16]。
測試驅動開發是一種不同于傳統軟件開發流程的開發方法。在編寫某個功能的代碼之前先編寫測試代碼,然后編寫測試通過的功能代碼,這有助于編寫簡潔可用和高質量的代碼。
(2)開發與測試融合。
程序開發人員除了進行程序代碼的編寫,白盒測試,也要完成基本的功能測試設計和執行。這樣有助于程序開發人員更好地開展調試工作。程序開發人員可以通過交叉測試來解決測試心理學的問題(不能自己測試自己)。
采用這種模式測試人員的數量會減少,專業的測試人員去做其他復雜的測試工作。研發中的很多低級缺陷會盡早在開發過程中被發現,從而減少缺陷后期發現的成本。
5.1手寫體維文字符識別算法研究
該軟件程序由研究人員個人開發和調試。軟件注重算法的實現,研究人員在設計完成算法設計后,采用C++語言進行編程和跟蹤調試。
5.2工具軟件的開發
在軟件產品開發過程中,需要開發各種專用工具,這些工作通常由工具組來完成。工具組的開發模式類似于3.2節的中、小型軟件開發。
5.3大型軟件產品開發
某公司的一個大型軟件開發項目,涉及50多人的軟硬件設計、開發和測試工作。軟件開發過程中使用的軟件配置管理工具為SVN,持續集成工具為ICP-CI。開發模式類似于3.3節的大型軟件開發。
軟件調試作為軟件開發的重要組成部分,對于大型軟件系統,不僅需要做好軟件代碼的調試工作,也要做好軟件模塊集成的調試工作。需要開展大量的研究工作,從而提高軟件產品的開發效率,提高軟件的質量,以及軟件的安全性與穩定性,更好地滿足客戶對軟件產品的需求。
[1] Myers G J,Badgett T,Sandler C.Art of software testing[M].3rd ed.[s.l.]:John Wiley & Sons, Inc.,2012.
[2] 林科學.軟件測試/調試技術應用研究[D].南京:南京氣象學院,2004.
[3] 姜 文,劉立康.基于持續集成的PC-Lint靜態檢查[J].計算機技術與發展,2016,26(11):31-36.
[4] 張銀奎.軟件調試[M].北京:電子工業出版社,2008.
[5] Metzger R C.軟件調試思想[M].尹曉峰,馬振萍,譯.北京:電子工業出版社,2004.
[6] Telles M,Hsieh Y.The science of debugging[M].[s.l.]:Coriolis Group,2001.
[7] 蔡 銘,程 勝,王 瑞.航天型號高可靠軟件系統調試原理與技術[M].北京:中國宇航出版社,2008.
[8] 曹鶴玲,姜淑娟,鞠小林.軟件錯誤定位研究綜述[J].計算機科學,2014,41(2):1-6.
[9] Huang Linzhi, Ai Jun. Automatic software fault localization based on artificial bee colony[J].系統工程與電子技術:英文版,2015,26(6):1325-1332.
[10] 姜 文,劉立康.基于ClearCase的軟件配置管理與持續集成[J].計算機技術與發展,2016,26(1):10-17.
[11] 姜 文,劉立康.基于SVN的軟件配置管理和持續集成[J].電子設計工程,2016,24(2):1-5.
[12] Duvall P M,Matyas S,Glover A.持續集成軟件質量改進和風險降低之道[M].北京:電子工業出版社,2012.
[13] Tykal J.Best practices for using composite baselines in UCM[R].[s.l.]:[s.n.],2004.
[14] 姜 文,劉立康.軟件配置管理中的基線問題研究[J].計算機技術與發展,2016,26(6):6-10.
[15] 李必信.程序切片技術及其應用[M].北京:科學出版社,2006.
[16] Beck K.測試驅動開發(注釋版)[M].孫 方,譯.北京:電子工業出版社,2007.
ResearchonSoftwareDebugging
JIANG Wen,LIU Li-kang
(School of Telecommunication Engineering,Xidian University,Xi’an 710071,China)
Software debugging is very important for software development.Especially for large software system developed by many development departments together,how to make correct debugging strategy for fixing,diagnosing and recovering of the software defect is very important work.In combination with the basic concept and process of the software development,the concept and the basic process of software debugging are described.According to the scale of software,the application software can be divided into three types,the large,the middle and the small.For them,the roles in software developing are introduced,the case charts are given respectively,and the features of software debugging during developing are inducted and analyzed.Then the preconditions of effective debugging,the principle and strategy of software debugging,the debugging technique for large software are concluded during the software development.At last,three typical cases of software debugging are introduced.Practice shows that deep research of the technique and theory of software debugging is contributed to improve the developing efficiency and quality of software and make the customer satisfied the demand of software better.
software testing;software debugging;software configuration management;continuous integration;baseline
2016-12-10
2017-04-13 < class="emphasis_bold">網絡出版時間
時間:2017-08-01
國家部委基礎科研計劃:國防預研基金項目(A1120110007)
姜 文(1986-),女,工程師,碩士,CCF會員(E200032324M),研究方向為圖像處理、模式識別、數據庫應用和軟件工程等;劉立康,副教授,研究方向為數字通信、圖像處理與傳輸等。
http://kns.cnki.net/kcms/detail/61.1450.TP.20170801.1555.058.html
TP391.41
A
1673-629X(2017)11-0001-06
10.3969/j.issn.1673-629X.2017.11.001