專利名稱:使用基于時間的斷點調(diào)試計算機程序的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及在調(diào)試器中使用斷點,特別涉及使用調(diào)試器啟動基于時間的中斷。
背景技術(shù):
調(diào)試器是對于開發(fā)人員進行編寫程序代碼和維護現(xiàn)有的代碼至關(guān)重要的工具?,F(xiàn)有的調(diào)試器為程序員提供了許多功能,幫助程序員消除現(xiàn)有的缺陷,或了解程序的操作。一個現(xiàn)有的調(diào)試器功能是插入被稱為“斷點”的裝置。
表1顯示了不同類型的斷點的列表,以及它們是如何操作的。程序的執(zhí)行在斷點處停止,以便程序員可以一行一行地單步執(zhí)行代碼,或者根據(jù)需要恢復(fù)程序的執(zhí)行。當(dāng)斷點有效時,程序員可以確定所執(zhí)行的每一行代碼中的程序變量的值。
斷點是任何調(diào)試器中最常用的功能。當(dāng)前的調(diào)試器提供了許多種斷點。取決于到達的斷點的類型,調(diào)試器一般來說停止程序的執(zhí)行。
表1
與現(xiàn)有的調(diào)試器關(guān)聯(lián)的一個缺點是,沒有在一定的時間消逝之后使程序停止執(zhí)行的斷點。即,沒有只是在一定的時間段消逝之后生效的斷點。有兩個解決辦法用于獲得相同的效果。下面將簡要概述一下這兩種方法。
第一個解決辦法涉及人工跟蹤時間,然后當(dāng)指定的時間段消逝之后將程序中斷。此技術(shù)不準(zhǔn)確,特別是當(dāng)時間延遲非常小時。此外,還需要程序員人工跟蹤時間。因此,此技術(shù)相對比較麻煩,并且易于出錯。對于時間延遲較大的情況,如果程序員未能中斷程序執(zhí)行,那么整個過程就可能需要再次重復(fù)。
第二個解決辦法涉及用附加代碼(如表2中顯示的代碼)對原始代碼進行重新編程。
表2if(time_has_elapsed())int x=5;/*Dummy Statement*/如果用表2中顯示的附加語句重新編譯代碼,并在“DummyStatement”處設(shè)置斷點,則獲得相同的效果。
然而,此技術(shù)的一個特定的缺點是,需要更改源文件。如果生成過程要花較長的時間,那么,更改代碼和重新生成的過程是不受歡迎的。此外,程序員還必須確保刪除上面的代碼,以便進行發(fā)布或用于“準(zhǔn)備好制作”的版本。
鑒于上述情況,顯而易見,需要一種改進的提供基于時間的斷點的方式,供在調(diào)試計算機程序時使用。
發(fā)明內(nèi)容
在調(diào)試器中提供一種基于時間的斷點功能,讓程序員在任何一行代碼設(shè)置基于時間的斷點。如果該行在執(zhí)行,而指定的時間消逝,那么程序會因此而停止執(zhí)行。調(diào)試器為每一個這樣的斷點跟蹤消逝的時間??梢杂性S多條件用于為每一個斷點計算時間。
斷點的計時器可以在程序開始執(zhí)行時啟動。斷點的計時器可以在包含斷點的行首次到達時啟動。斷點的計時器也可以基于一個進程獲得的CPU時間。
每當(dāng)程序的執(zhí)行由于另一個斷點而停止時,調(diào)試器都處理每一斷點的時間計算。斷點在一定的時間消逝之后生效,而在生效之前不起作用。
基于時間的斷點可以與現(xiàn)有的斷點結(jié)合使用,以向程序員提供更強大的功能和靈活性。和諸如特定條件或者存儲更改之類的其他參數(shù)相比,如果“時間”是用于中斷程序執(zhí)行的優(yōu)選參數(shù),則基于時間的斷點比較有用。
圖1是顯示如何在存儲器中的程序的可執(zhí)行映像中插入基于時間的斷點的步驟的流程圖。
圖2是顯示當(dāng)程序的可執(zhí)行映像在調(diào)試器中運行時如何在其中插入基于時間的斷點的略圖。
圖3是顯示如何在存儲器中的程序的可執(zhí)行映像中插入觸發(fā)器的流程圖。
圖4是當(dāng)在程序執(zhí)行期間遇到觸發(fā)器時調(diào)試器所采取的步驟的流程圖。
圖5是當(dāng)在程序執(zhí)行期間遇到觸發(fā)器時調(diào)試器所采取的步驟的流程圖,包括涉及安裝重現(xiàn)觸發(fā)器的步驟。
圖6是其中相對于時間顯示了程序執(zhí)行和單個基于時間的斷點的示例的略圖。
圖7是其中相對于時間顯示了程序執(zhí)行和單個基于時間的斷點以及多個調(diào)試操作的示例的略圖。
圖8是其中相對于時間顯示了程序執(zhí)行和多個基于時間的斷點的示例的略圖。
圖9是適合于執(zhí)行參考圖1到8描述的技術(shù)的計算機系統(tǒng)的略圖。
具體實施例方式
調(diào)試是一個通過觀察存儲器內(nèi)容或者通過觀察程序的執(zhí)行流來從程序中消除缺陷的過程。調(diào)試過程幫助查找和糾正在源文件的編譯期間未被發(fā)現(xiàn)的邏輯錯誤。調(diào)試器是幫助完成此過程并在代碼中的程序員指示的位置中斷程序執(zhí)行的工具。這種類型的調(diào)試技術(shù)叫做“交互調(diào)試”,其中,調(diào)試器中斷正在被調(diào)試的程序的執(zhí)行,并讓程序員通過用戶界面與調(diào)試器進行交互。
該技術(shù)還叫做“斷點調(diào)試”,因為調(diào)試器通過讓程序員在程序中設(shè)置斷點,并讓程序員觀察和改變程序的狀態(tài)來中止程序執(zhí)行。
在任何時刻,程序狀態(tài)都包括寄存器值和用于存儲程序的數(shù)據(jù)的存儲器內(nèi)容。為提高速度并確保簡單,調(diào)試器允許程序員直接在源代碼中設(shè)置斷點。源代碼通過使用存儲在程序文件中的附加信息(被稱為“調(diào)試信息”)被映射到機器指令。此調(diào)試信息可以包括在同一個文件,也可以作為一個單獨的文件存在。
用適當(dāng)?shù)倪x項編譯源文件通常會生成此調(diào)試信息。因此,調(diào)試器能夠?qū)⒃创a信息映射到對應(yīng)的機器級指令。源代碼包含在源文件中,而機器指令存儲在程序的可執(zhí)行文件中。編譯過程,后面接著是鏈接,可以將源代碼指令轉(zhuǎn)換為機器指令。由編譯過程生成的一部分調(diào)試信息用于將源級指令映射到機器指令,或執(zhí)行相反的操作。
調(diào)試器從該文件中讀取此信息并將該信息放入諸如結(jié)構(gòu)陣列、樹、散列表等等之類的適當(dāng)數(shù)據(jù)結(jié)構(gòu)中。當(dāng)調(diào)試器在存儲器中的程序的可執(zhí)行映像中插入斷點時,此數(shù)據(jù)結(jié)構(gòu)用于將機器代碼與源代碼進行關(guān)聯(lián)。
斷點不是在編譯時設(shè)置的,而是在調(diào)試器執(zhí)行過程當(dāng)程序位于存儲器中時設(shè)置的。斷點是在程序啟動時在存儲器中設(shè)置的。當(dāng)程序暫停執(zhí)行并等待程序員完成調(diào)試操作(如檢查存儲器或設(shè)置新斷點)時,也可以插入新斷點。此設(shè)置斷點的過程是通過用戶界面執(zhí)行的,該用戶界面還可以在程序員退出調(diào)試器時存儲斷點列表,以便當(dāng)在下一會話期間對程序進行調(diào)試時斷點不會丟失。
調(diào)試過程涉及控制另一個程序的執(zhí)行的一個程序??刂瞥绦蚴钦{(diào)試器,而被控制的程序是正在被調(diào)試的程序。這是一種主從關(guān)系的形式,調(diào)試器根據(jù)程序員的需要來控制執(zhí)行流。因此,調(diào)試器應(yīng)該能夠訪問、讀取和寫入到子程序的存儲器。調(diào)試器可能希望讀取或?qū)懭胱映绦虻臋C器指令、寄存器值或變量。除讀取存儲器、向程序員報告程序的狀態(tài)之外,調(diào)試器還可能希望改變子程序的存儲器的內(nèi)容。此能力對設(shè)置斷點,或者當(dāng)程序員使用用戶界面請求調(diào)試器寫入到一些變量或寄存器時改變存儲器是必不可少的。
現(xiàn)代的操作系統(tǒng)在一種叫做“保護模式”的特殊模式下操作處理器。保護模式的一個重要功能是,不允許一個程序訪問另一個程序的存儲器,以避免存儲器損壞。操作系統(tǒng)提供了程序間相互進行通信的機制。這種讓兩個進程相互通信的功能叫做“進程間通信”,程序使用它的場合相當(dāng)廣泛??赡艽嬖谛枰粋€程序向另一個程序通知發(fā)生了某一個事件的情況。事件可以是窗口縮放,資源被釋放等等。
這些事件通過操作系統(tǒng)信號或消息進行傳達。信號是進程間通信的一種模式。一個重要事件是通知子進程立即暫停執(zhí)行。任何過程都可以產(chǎn)生信號,但這對可能需要在任何已知時間點立即中止程序執(zhí)行的調(diào)試器有用處。當(dāng)程序執(zhí)行由于引發(fā)異常的中斷指令而中止時,這是不同的?;诋惓5倪M程的中止允許斷點按如下所述的方法來實現(xiàn)。
在基于Unix的操作系統(tǒng)中,產(chǎn)生一個叫做SIGSTOP的信號將在那一瞬間停止進程。一旦信號被傳輸給進程,該進程就立即暫停執(zhí)行。不同的操作系統(tǒng)中也存在對應(yīng)的消息。如上所述,信號是兩個進程借以可以相互進行通信的機制。因此,由一個進程發(fā)送信號,另一個進程接受信號。信號通常通過操作系統(tǒng)進行路由,而操作系統(tǒng)又必須確保該信號被發(fā)送到正確的進程。內(nèi)核程序還向進程發(fā)送信號,以向它們通知諸如無效存儲器存取、輸入輸出錯誤之類的各種事件。因此,當(dāng)前操作系統(tǒng)提供了一個進程借以可以通知另一個進程直到進一步通知之前中止其執(zhí)行的機制。
操作系統(tǒng)在硬件時鐘的幫助下維護系統(tǒng)時間。在內(nèi)部,操作系統(tǒng)內(nèi)核使用硬件時鐘預(yù)定多重處理系統(tǒng)中的進程的時間。內(nèi)核程序還提供到程序的系統(tǒng)調(diào)用,以獲得任何與時間相關(guān)的功能。用戶可以使用這些調(diào)用來設(shè)置時間或者獲得系統(tǒng)時間,或者在一定的時間間隔之后定期獲得通知。
為了精確,操作系統(tǒng)還可以提供一個到主板硬件上的實時時鐘(RTC)的接口。程序可以直接與RTC進行通信,以獲得較高的精確度。因此,程序可以請求操作系統(tǒng)或者RTC當(dāng)指定的時間段消逝之后通知它們。這些計時器可以是“一次性的”計時器,只通知進程一次,或者是周期性的計時器,當(dāng)指定的時間間隔消逝之后每隔一定間隔向進程發(fā)送信號。
如上所述,調(diào)試器控制正在被調(diào)試的子進程。調(diào)試器還截獲發(fā)送給子進程的信號,以獲得對子進程的完全控制。調(diào)試器接收發(fā)送給子進程的所有信號,并依據(jù)程序員是否指示而將它們路由到子進程。當(dāng)一些指令在子進程中生成異常時,首先向調(diào)試器發(fā)送對應(yīng)的信號。此機制檢測是否到達了中斷指令。中斷異常通知調(diào)試器,說子進程已經(jīng)暫停執(zhí)行,因為子進程已經(jīng)執(zhí)行了一個程序員使用調(diào)試器在其中設(shè)置了斷點的指令。
斷點可以用硬件和軟件兩種方式來實施。調(diào)試器通常使用這兩種統(tǒng)稱為斷點的實施方式。一些硬件提供了通過利用作為芯片的組成部分的調(diào)試寄存器來設(shè)置斷點的功能。這些類型的斷點被稱為硬件斷點,并可以是兩種類型之一(i)數(shù)據(jù)斷點或(ii)指令斷點。
當(dāng)訪問指定的存儲器位置或輸入輸出端口時,數(shù)據(jù)斷點中斷程序執(zhí)行。每當(dāng)?shù)竭_代碼中的指定位置時,指令斷點都停止程序執(zhí)行。中斷執(zhí)行將把控制轉(zhuǎn)移到調(diào)試器過程。這是使用硬件來實現(xiàn)的。
例如,在Intel x86中央處理單元體系結(jié)構(gòu)中,有八個調(diào)試寄存器(D0到D7)。有四個寄存器(即,D0、D1、D2、D3)用于設(shè)置斷點。這些寄存器存儲了將為其設(shè)置斷點的32位線性地址。寄存器D4和D5用于進行高級調(diào)試。寄存器D6和D7分別用作狀態(tài)和控制調(diào)試寄存器。
為設(shè)置指令斷點,指令的地址存儲在任何未使用的調(diào)試寄存器D0到D3。相應(yīng)地設(shè)置D7,以指出斷點是指令斷點。當(dāng)處理器試圖在指定的地址執(zhí)行指令時,硬件引發(fā)一個調(diào)試異常。異常是在執(zhí)行指令之前引發(fā)的,需要調(diào)試過程,以清除斷點,以便不會再次產(chǎn)生異常。
相形之下,對于數(shù)據(jù)斷點,只是在訪問存儲器位置或輸入/輸出端口之后才會生成陷阱異常。硬件還提供機器指令以單步執(zhí)行子程序。
硬件斷點所存在的一個問題是,此功能依賴于硬件,一些體系結(jié)構(gòu)可能不支持硬件斷點。硬件斷點在數(shù)量方面受到限制,因此,調(diào)試器還要實施軟件斷點。軟件斷點是通過更改正在被調(diào)試的程序的可執(zhí)行代碼來實施的斷點。這是在存儲器中進行的,而不是在可執(zhí)行文件中進行的。正在被調(diào)試的程序的代碼由調(diào)試器“修補”。
圖1用流程圖顯示了當(dāng)程序在調(diào)試器中運行時在存儲器中的程序的可執(zhí)行映像中插入斷點所涉及的步驟。
當(dāng)在一行代碼中設(shè)置斷點時,調(diào)試器執(zhí)行下面的表1中顯示的下列步驟。
表1步驟110 調(diào)試器確定為其請求斷點的指令。
步驟110 調(diào)試器將此原始指令存儲在計算機存儲器中一個位置,以便可以隨后檢索原始指令。
步驟110 調(diào)試器將原始指令的地址存儲在一個基于專用硬件的調(diào)試寄存器中(在硬件支持這樣的寄存器的情況下)。如果硬件不支持這樣的寄存器,則調(diào)試器在存儲器中的程序代碼中插入一個指令,當(dāng)執(zhí)行時將引發(fā)異常。在這兩種情況下,都會產(chǎn)生異常,控制將轉(zhuǎn)到調(diào)試器線程。
每當(dāng)中斷指令引發(fā)異常時都會命中或到達斷點。然后控制轉(zhuǎn)到調(diào)試器過程。調(diào)試器通知用戶,說明斷點已經(jīng)到達。當(dāng)用戶繼續(xù)執(zhí)行時,調(diào)試器用原始指令(如上所述,調(diào)試器以前存儲的)替換中斷指令,然后執(zhí)行指令。在執(zhí)行指令之后,調(diào)試器再次存儲原始指令,并用中斷指令替換原始指令,以便斷點不會丟失。這相當(dāng)于為一個指令禁用斷點,然后一旦原始指令執(zhí)行完畢再啟用斷點。通常,一旦斷點被命中,所有斷點都保留中斷指令,但此行為對于各種不同的斷點可能會有所不同。例如,當(dāng)斷點被命中時,臨時斷點不用中斷指令替換原始指令,因為臨時斷點是一次性使用的斷點,因此,它們不需要保留中斷指令。
圖2概要顯示了圖1用流程圖顯示的過程的示例。程序代碼片段210包括一個斷點。隨后,調(diào)試器確定在對應(yīng)的機器指令220中的什么位置放置斷點。在圖2中,為便于理解,使用了一個匯編指令示例。然后,調(diào)試器用斷點230替換相關(guān)的計算機指令240,并將原始指令240保存在存儲器中。
如上所述,調(diào)試器需要修補代碼并插入會引發(fā)異常的代碼。這可以直接由調(diào)試器來完成。許多操作系統(tǒng)不允許一個進程訪問另一個進程的地址空間。操作系統(tǒng)通常提供一個系統(tǒng)調(diào)用(這是一個從內(nèi)核程序請求服務(wù)的接口),以允許調(diào)試器修補代碼并讀取正在被調(diào)試的程序的變量。系統(tǒng)調(diào)用充當(dāng)控制在調(diào)試器中運行的子程序的機制。這允許調(diào)試器截取異常和信號以獲得對程序的完全控制。
調(diào)試器使用幾乎所有Unix克隆所提供的ptrace()系統(tǒng)調(diào)用,ptrace()系統(tǒng)調(diào)用允許調(diào)試器讀取或?qū)懭氪鎯ζ?、寄存器、監(jiān)視子程序的地址空間中的點(硬件中的數(shù)據(jù)斷點)。調(diào)試器可以通過更改存儲器中的代碼來設(shè)置軟件斷點,或者,調(diào)試器可以通過設(shè)置子進程的寄存器來設(shè)置硬件斷點。
當(dāng)一個程序在調(diào)試器中運行時,調(diào)試器充當(dāng)父程序,并將正在被調(diào)試的程序衍生為其子程序。因此,調(diào)試器和正在被調(diào)試的程序具有父子關(guān)系。調(diào)試器的主要用途是控制和觀察子程序。因此,在衍生子進程之后,在子程序正在運行時,調(diào)試器處于等待狀態(tài)。每當(dāng)一個信號被傳輸給子程序時,操作系統(tǒng)都停止子程序。然后,操作系統(tǒng)通知父程序(在此情況下,為調(diào)試器),說明子程序已經(jīng)停止。調(diào)試器可以查詢子程序停止的原因。
當(dāng)程序員插入斷點并在調(diào)試器中運行程序時,調(diào)試器將程序衍生為其子程序,并等待接收操作系統(tǒng)的通知。當(dāng)?shù)竭_一個斷點時,程序引發(fā)異常,子程序轉(zhuǎn)到停止?fàn)顟B(tài)。操作系統(tǒng)通知調(diào)試器,說明子程序已經(jīng)停止。因此,在到達斷點時,控制被從子程序轉(zhuǎn)到調(diào)試器。當(dāng)子程序在運行時,調(diào)試器無限期地等待在子程序中發(fā)生一些事件。當(dāng)控制轉(zhuǎn)到調(diào)試器之后,子進程始終處于停止?fàn)顟B(tài)。
總之,存在可以借以實現(xiàn)下列功能的機制。
1.調(diào)試器可以通過使用在編譯期間生成的調(diào)試信息來將機器指令映射到源代碼,或執(zhí)行相反的操作。
2.一個進程能夠暫停另一個進程的執(zhí)行,只要進程選擇這樣做。為達到此目的,進程使用一個機制來通知另一個進程。例如,一個進程可以通過使用由操作系統(tǒng)提供的信號來通知另一個進程。
3.調(diào)試器能夠完全控制子進程。這是對任何交互調(diào)試器的基本要求。
4.操作系統(tǒng)通過接口調(diào)用的系統(tǒng)調(diào)用,或者通過允許進程與硬件時鐘直接進行通信來向進程提供定時信息。
5.調(diào)試器可以通過訪問和改變子進程的地址空間或寄存器來在硬件或軟件中插入和禁用斷點。這可以通過直接改變子程序的存儲器(或寄存器)來完成,或通過請求操作系統(tǒng)這樣做。
當(dāng)程序員需要時,所描述的調(diào)試器允許程序在一定的時間停止執(zhí)行。這樣的使用時間作為停止程序執(zhí)行的參數(shù)的斷點類型,在這里叫做“基于時間的斷點”。
基于時間的斷點如上所述,斷點用于在交互調(diào)試器中中止程序執(zhí)行,以便程序員可以查詢程序的狀態(tài)和執(zhí)行流。這是通過在硬件中設(shè)置專用寄存器或者通過在軟件修補存儲器來完成的。插入基于時間的斷點涉及檢測何時啟動計時器,跟蹤已經(jīng)消逝的時間,然后在適當(dāng)?shù)臅r候中斷子程序的執(zhí)行。
和大多數(shù)其他斷點一樣,基于時間的斷點與一行代碼關(guān)聯(lián)。當(dāng)執(zhí)行相關(guān)的一行代碼時,啟動對應(yīng)的計時器。一行代碼的執(zhí)行充當(dāng)計時器的觸發(fā)器。一旦執(zhí)行該行,觸發(fā)器就被激活,計時器被啟動。一旦指定時間已經(jīng)消逝,程序就停止執(zhí)行。下面將講述獲得這樣的效果的細(xì)節(jié)。
觸發(fā)器當(dāng)程序員通過用戶界面向調(diào)試器提供一個命令時,一個程序在調(diào)試器中“運行”。此命令可以是在調(diào)試器提供的命令行上鍵入的“run”或“go”,也可以采用快捷鍵或鼠標(biāo)點擊操作的形式。當(dāng)程序即將運行時,調(diào)試器通過上文描述的機制在存儲器中的可執(zhí)行映像中設(shè)置斷點。
用戶在源文件中設(shè)置基于時間的斷點,調(diào)試器確定充當(dāng)啟動計時器的觸發(fā)器的指令。檢查在子進程中執(zhí)行的指令的位置,然后將此位置與觸發(fā)器位置進行比較,這一過程相對比較耗時,并且效率低下。
相應(yīng)地,使用替代方法。不是判斷是否到達觸發(fā)器,只要子進程到達設(shè)置了觸發(fā)器的指令,子進程就通知父進程。
圖3用流程圖顯示了如何在存儲器中的程序的可執(zhí)行映像插入觸發(fā)器所涉及的步驟。所使用的技術(shù)類似于用于斷點的技術(shù),因此,插入觸發(fā)器所使用的步驟類似于插入斷點所使用的步驟。圖3的這些步驟使用帶有相應(yīng)的編號的步驟在下面的表2中列出。
表2步驟310程序員使用調(diào)試器的用戶界面設(shè)置基于時間的斷點,然后如果程序正在被首次啟動,則啟動程序執(zhí)行。如果程序由于斷點而被中止,則程序繼續(xù)執(zhí)行。
步驟320基于時間的斷點在源代碼設(shè)置,調(diào)試器在可執(zhí)行程序的映像中確定對應(yīng)的指令。此指令充當(dāng)斷點的觸發(fā)器,被稱為“觸發(fā)器指令”,負(fù)責(zé)啟動計時器。
步驟330當(dāng)程序繼續(xù)或者在運行時,調(diào)試器將存儲在觸發(fā)器的位置的指令保存在其自己的存儲器中。然后,調(diào)試器用中斷指令替換該指令。可選地,調(diào)試器還可以使用硬件寄存器來存儲觸發(fā)器指令的地址。在這種情況下,每當(dāng)觸發(fā)器指令即將執(zhí)行時,硬件就通知調(diào)試器的過程。
步驟340判斷是否還有其他斷點存在。如果還有其他斷點存在,則執(zhí)行步驟350。如果沒有其他斷點,則進入步驟360。
步驟350如果還有其他基于時間的斷點,則調(diào)試器確定下一個基于時間的斷點,并獲得該基于時間的斷點。然后,處理過程返回到步驟330。
步驟360如果沒有其他基于時間的斷點,則可以設(shè)置其他類型的斷點。
步驟370繼續(xù)執(zhí)行程序。
由于上文參考圖3描述的過程非常類似于設(shè)置斷點,調(diào)試器可以毫無困難地設(shè)置觸發(fā)器。當(dāng)在調(diào)試器中執(zhí)行程序的過程中到達觸發(fā)器指令時,程序執(zhí)行中斷,以允許調(diào)試器啟動計時器,而不是讓程序員執(zhí)行調(diào)試操作。程序執(zhí)行的中止是臨時的。使用調(diào)試器的程序員不會注意到程序執(zhí)行過程中的任何差異。
觸發(fā)器指令啟動斷點的計時器,然后恢復(fù)程序執(zhí)行。
圖4用流程圖顯示了當(dāng)在程序執(zhí)行期間遇到觸發(fā)器時調(diào)試器所涉及的步驟。下面的表3使用帶有相應(yīng)的編號的步驟描述了這些步驟。當(dāng)?shù)竭_一個觸發(fā)器時,調(diào)試器引發(fā)中斷異常,與普通斷點的情況相類似。
因此,調(diào)試器判斷中斷異常是由觸發(fā)器產(chǎn)生的還是由斷點產(chǎn)生的。如果是觸發(fā)器引發(fā)的中斷異常,那么就啟動計時器,程序繼續(xù)執(zhí)行。如果是斷點引發(fā)了中斷異常,那么,調(diào)試器就允許程序員執(zhí)行普通的調(diào)試操作。
表3步驟410當(dāng)一個子程序引發(fā)中斷異常時,調(diào)試器會得到有關(guān)異常的通知。
步驟420判斷是否由觸發(fā)器引發(fā)了異常。如果確實是由觸發(fā)器引發(fā)的異常,則執(zhí)行步驟430。如果異常不是由觸發(fā)器引發(fā)的,則執(zhí)行步驟450。
步驟430如果發(fā)生異常的指令是一個觸發(fā)器指令,那么,在使用軟件斷點的情況下中斷指令替換原始指令。在使用硬件斷點的情況下,通過寄存器對于指令禁用斷點。
步驟440對于調(diào)試器中的斷點啟動計時器。進入步驟460。
步驟450如果異常是由于斷點引發(fā)的,那么,允許程序員執(zhí)行普通的調(diào)試操作。
步驟460恢復(fù)程序的執(zhí)行。
調(diào)試器需要在其基于時間的斷點列表中執(zhí)行簡單搜索,以便判斷中斷指令是觸發(fā)器還是斷點。
上文描述的步驟允許程序員只設(shè)置一次性使用的觸發(fā)器。即,一旦到達觸發(fā)器,觸發(fā)器就丟失,除非重新啟動程序。作為上述觸發(fā)器的擴展,可以通過重新插入觸發(fā)器來實施重現(xiàn)觸發(fā)器,如下面的表4所描述,優(yōu)先于上文步驟430中所描述的執(zhí)行。
表4步驟530在使用軟件斷點的情況下,用原始指令替換中斷指令。在使用硬件斷點的情況下,通過寄存器對于指令禁用斷點。使用在程序的可執(zhí)行映像中設(shè)置觸發(fā)器所采用的相同技術(shù),執(zhí)行單指令,然后在觸發(fā)器位置重新插入中斷指令。
圖5用流程圖顯示了安裝重現(xiàn)觸發(fā)器所需要的附加步驟。對于重現(xiàn)觸發(fā)器,實施一個涉及應(yīng)該如何啟動計時器,計時器是否已經(jīng)正在運行的策略。調(diào)試器可以選擇忽略這樣的觸發(fā)器,或者可以重新啟動相應(yīng)的計時器。或者,也可以為每一個觸發(fā)器維護不同的計時器。這樣的策略決策,以及重現(xiàn)觸發(fā)器的實施是所描述的“一次性使用”觸發(fā)器的簡單擴展。
圖5涉及對應(yīng)于參考圖4描述的步驟410到420和440到460的步驟510到520和540到560。即,圖5涉及圖4的所有步驟,但步驟430除外,該步驟替換為如上面的表4所描述的步驟530。
在內(nèi)部,斷點和觸發(fā)器強制正在被調(diào)試的程序引發(fā)異常,以便調(diào)試器可以得到事件的通知。觸發(fā)器和斷點兩者都插入中斷指令以達到此效果。一旦命中中斷指令,觸發(fā)器和斷點就不同。一方面,斷點導(dǎo)致調(diào)試器將控制轉(zhuǎn)到用戶界面線程,以便程序員能夠檢查存儲器內(nèi)容和寄存器值。程序執(zhí)行只有在程序員選擇這樣做的情況下才會恢復(fù)。因此,每當(dāng)命中斷點時,程序員都會知道。
相形之下,觸發(fā)器在內(nèi)部啟動計時器,并繼續(xù)程序執(zhí)行,而不會將控制轉(zhuǎn)到用戶界面線程。一旦基于時間的斷點的計時器啟動,程序就恢復(fù)執(zhí)行。程序是否繼續(xù)執(zhí)行不取決于程序員的輸入,如果在觸發(fā)器被命中沒有通知用戶,觸發(fā)器的功能沒有損失。因此,斷點實際為程序員中斷程序執(zhí)行,而觸發(fā)器立刻中斷程序執(zhí)行,以便計時器可以啟動。
計時器計時器是基于時間的斷點中的跟蹤自從觸發(fā)器首先到達以來消逝的時間的實體。計時器是使用外部時鐘直接地或者通過與時鐘連接的操作系統(tǒng)實施的。
計時器可以提供不同方式,用于計算消逝的時間,計算調(diào)試操作期間的時間,當(dāng)指定的時間消逝之后要執(zhí)行的操作。下面將分別描述這些方面。
程序員選擇他或她希望用來在計時器啟動之后計算時間的技術(shù)。所選技術(shù)完全地取決于程序員的特定需要。
在多道程序設(shè)計環(huán)境中,通常不給程序分配CPU(中央處理單元)的全部處理時間。程序只使用總可用時間的一小部分,被稱為“時間片”。時間分片給人的感覺好像是許多進程正在同時運行,即使只有一個CPU。
用于時間計算的技術(shù)的不同示例如下(i)“掛鐘”時間跟蹤消逝的時間。時間計算是這樣執(zhí)行的,似乎一個外部實體正在使用精確的秒表計算消逝的時間。
(ii)計算是基于程序正在執(zhí)行中時消逝的時間來進行的。這意味著,只有當(dāng)進程正在獲取其自己的那一部分時間片時才進行時間計算。這類似于只有當(dāng)進程(正在被調(diào)試的)被分配了CPU時間時才運行的一個外部精確的秒表。當(dāng)其他進程正在獲取CPU時間時,秒表處于暫停狀態(tài)。
(iii)程序正在執(zhí)行中時消逝的時間和內(nèi)核程序代表進程完成請求所花的時間。內(nèi)核程序執(zhí)行許多低級的工作來完成一個進程的請求。這是代表進程執(zhí)行的,以避免低級的損壞(如存儲器、硬盤上的文件的損壞等等)。此技術(shù)類似于技術(shù)(ii),但還包括內(nèi)核程序被分配給進程的時間。
(iv)基于系統(tǒng)的“運行時間”計算的時間。這是自從系統(tǒng)啟動以來消逝的時間。
調(diào)試器要求操作系統(tǒng)提供一個用于進行時間計算的功能,因為操作系統(tǒng)與時鐘耦合并提供一個到用戶空間程序的接口。內(nèi)核程序可以提供技術(shù)(ii)、(iii)和(iv),因為操作系統(tǒng)負(fù)責(zé)調(diào)度進程或者跟蹤自從系統(tǒng)啟動以來的時間。
定時信息還可以通過除了從操作系統(tǒng)之外的其他技術(shù)來獲得。例如,在硬件中,當(dāng)時間消逝之后,計時器可能向芯片發(fā)送信號。此事件可能實際設(shè)置調(diào)試寄存器中的位,以啟用斷點。
上文描述的四種技術(shù)是使用內(nèi)核程序提供的計時器功能的現(xiàn)有的技術(shù)。這些類型的時間計算方法是現(xiàn)有的操作系統(tǒng)(如Linux)所使用的方法。依據(jù)調(diào)試器的需要和可以用來實施其他時間計算技術(shù)的設(shè)備,也可以包括其他時間計算技術(shù)。
計時器可以是兩種類型之一- “周期性的”或“一次性的”。一次性的計時器只將計時器到期的信息通知進程一次,而周期性的計時器重復(fù)地執(zhí)行相同的操作。計時器類型的選擇取決于將要實現(xiàn)什么。在使用基于時間的斷點的情況下,對消逝的時間,或進程消耗的CPU時間,甚至系統(tǒng)的運行時間進行定時的檢查。
當(dāng)調(diào)試器停止子進程的執(zhí)行時,在調(diào)試器再次運行進程之前,不會給子進程分配時間片。因此,操作系統(tǒng)通常不基于子進程的CPU時間提供警報機制。
警報是當(dāng)計時器到期時發(fā)送給進程的通知。
警報是為“掛鐘”計時器提供的,因為時鐘始終在運行,不管被分配了CPU時間的進程是什么。因此,如果時間計算技術(shù)是“掛鐘”時間計算技術(shù)之外的技術(shù),那么將進行定期檢查以判斷時間是否消逝。
為向程序員提供更大的靈活性,當(dāng)調(diào)試操作正在執(zhí)行時,調(diào)試器可以自動暫停計時器。如果程序員在為斷點的計時器計算消逝的總時間時不想包括花在調(diào)試上的時間,這可能是一個非常有用的功能。對于不同的實施方式,這樣的計算的精確度可能不同。
如這里所描述的,對于這樣的計算,可以使用周期性的計時器。當(dāng)消逝的時間是基于給進程分配的CPU時間時,也可能需要周期性的計時器,因為當(dāng)計時器到期時內(nèi)核程序不通知調(diào)試器。為此,調(diào)試器將定時檢查給進程分配的CPU時間。對于斷點計時器的最優(yōu)解決方案是每一個斷點有一個計時器。每一這樣的計時器應(yīng)能夠調(diào)用其選擇的函數(shù)。
在實踐中,由于多個計時器的局限和開銷,可以使用主周期性的計時器來跟蹤所有斷點的到期時間。此后,這樣的周期性的計時器叫做“增量計時器”,因為每個增量時間單位給增量計時器分配了一個脈沖,以便計時器可以跟蹤調(diào)試器的時間,或者就其他計時器是否到期進行定期檢查。
因此,“啟動斷點的計時器”可以這樣來實施,以便斷點的到期時間向增量計時器注冊,該斷點沒有單獨的計時器。觸發(fā)器是啟動斷點的計時器的機制。一旦計時器到期,調(diào)試器應(yīng)該調(diào)用相應(yīng)的函數(shù)。
調(diào)試器用相應(yīng)的增量值啟動增量計時器來控制計時器的精度。此計時器可以在調(diào)試器初始化時或者當(dāng)?shù)竭_第一個觸發(fā)器時設(shè)置和啟動。當(dāng)設(shè)置了周期性的計時器時,每當(dāng)計時器到期時,操作系統(tǒng)都通知進程。同樣,在使用增量計時器的情況下,內(nèi)核程序在每個增量時間單位之后通知調(diào)試器。
當(dāng)計時器到期時調(diào)用的過程叫做“處理程序過程”。處理程序過程是根據(jù)正在使用計時器的應(yīng)用程序預(yù)期的功能而編程的。
在調(diào)試器的情況下,這可以是計算消逝的時間,或者執(zhí)行計時器是否到期的檢查。可選地,可以指示增量計時器在一定的時段內(nèi)停止計算時間。例如,可以指示增量計時器當(dāng)程序員想在一個斷點被命中時檢查程序的狀態(tài)時停止。因此,增量計時器只有在計時器能夠下跟蹤消逝的時間的情況下才這樣做。
增量計時器的一個實施方式可以涉及調(diào)試器為每個增量時間單位到期的間隔計時器安裝信號處理程序。當(dāng)為計時器指定的間隔到期時,內(nèi)核程序向調(diào)試器發(fā)送信號,此時調(diào)用此處理程序。
圖6概要顯示了程序員選擇放置一個單個基于時間的斷點的簡單示例。在子程序執(zhí)行期間沒有調(diào)試中斷,因此,可以假設(shè),程序員沒有放置任何其他類型的斷點,或者當(dāng)遇到觸發(fā)器時調(diào)試器禁用了任何這樣的斷點。
圖6包括時間軸610。在時間T1 620到達觸發(fā)器,程序員希望程序在時間T1′620′中斷。計時器的到期時間是T秒。即,T=T1′-T1。
由于有一個單個基于時間的斷點,當(dāng)時間是T1時調(diào)試器啟動增量計時器,然后不斷地檢查消逝的時間是否到達T1′。當(dāng)發(fā)生這種情況時,調(diào)試器向子進程發(fā)送一個信號,以通知子進程停止其執(zhí)行。然后,程序員可以檢查程序的狀態(tài)。
此簡單的情況不涉及其他調(diào)試操作。如果調(diào)試器是這樣設(shè)計的,以便所有調(diào)試操作被禁用,基于時間的斷點只限于一個,那么一個簡單的間隔計時器可以替換增量計時器。
當(dāng)遇到觸發(fā)器時間隔計時器開始計算時間,只有在計時器到期的情況下才會通知調(diào)試器。在接收到通知時,調(diào)試器應(yīng)該中止子程序的執(zhí)行。
圖7概要顯示了涉及當(dāng)一個程序正在調(diào)試器中執(zhí)行時的調(diào)試操作的兩種情況。第一種情況在到達觸發(fā)器的時間和程序即將中斷的時間之間只有一個調(diào)試操作。
程序員可能希望忽略在調(diào)試期間花費的時間。在第一種情況下,計算的T1 720和T1′720′之間消逝的時間不簡單是這兩個時間之間的差。這是因為,相關(guān)時間還包括時間TD 725,這是在調(diào)試期間花費的時間。因此,如果程序員選擇忽略時間TD 725,那么增量計時器在執(zhí)行調(diào)試操作期間就會停止。這樣的功能是理想的,特別是在TD 725大于T的情況下。
第二種情況涉及花費時間TD1 735和TD2 740的兩個調(diào)試會話。此第二種情況是與第一種情況相同,只是調(diào)試時間分為兩個部分,并分布在時間軸710上。如果兩個調(diào)試操作替換為單個調(diào)試操作以便TD=TD1+TD2,那么兩種情況基本上相同。如果在調(diào)試操作期間停止增量計時器,然后如果為增量計時器繪制一個時間曲線圖,對于沒有調(diào)試操作的簡單情況,這樣的圖形與圖6中顯示的相同。
圖6和7的時間軸610、710只顯示了計時器計算的虛擬時間,,而不是消逝的實際時間。因此,即使在到達觸發(fā)器的時間和程序員希望中斷程序的時間之間有調(diào)試操作,增量計時器的時間曲線圖相當(dāng)于根本沒有調(diào)試操作的情況。這有停止增量計時器的機制的情況下是可能的。
當(dāng)消耗的CPU時間充當(dāng)?shù)狡跁r間時,內(nèi)核程序計算當(dāng)進程在調(diào)試器的控制下停止的時間。因此,調(diào)試操作不影響這種計算。“掛鐘”計時器是程序員可能希望計時器在調(diào)試操作期間停止計算的計時器。
圖8概要顯示了在程序的執(zhí)行期間有多個基于時間的斷點的另一個示例。沿著時間軸810按照T1 820、T2 830、T3 840和T4850的順序遇到了觸發(fā)器。為計算多個到期時間T1′ 820′、T2′830′、T3′840′和T4′850′,增量計時器代表具有最早的到期時間的觸發(fā)器工作。在圖8中,當(dāng)計時器在時間T1 820首先遇到第一個觸發(fā)器時,計時器在時間T1′820′設(shè)置其到期時間。當(dāng)遇到第二個觸發(fā)器時,到期時間不改變,因為T1′ 820′少于T2′830′。對于第三個觸發(fā)器,當(dāng)計時器在時間T3′ 840′遇到觸發(fā)器時重新調(diào)整其到期時間。這是因為,第三個觸發(fā)器的到期時間(T3′840′) 少于向計時器注冊的到期時間(T1′820′)。第四個觸發(fā)器的到期時間在T4′850′,這是所有到期時間中最高的。當(dāng)?shù)竭_第一個到期時間時,調(diào)試器采取適當(dāng)?shù)牟僮鳌H缓?,計時器將其到期時間重新調(diào)整到T1′820′,現(xiàn)在這是剩余的三個觸發(fā)器的所有到期時間中最小的到期時間。
隨著執(zhí)行的繼續(xù)進行,到期時間被設(shè)置為T2′830′和T4′850′,并且順序也是如此。計時器的到期時間的變化基于這樣的事實T3′840′<T1′820′<T2′830′<T4′ 850′。因此,每當(dāng)遇到觸發(fā)器時,都重新調(diào)整到期時間。如上所述,如果程序中斷執(zhí)行,則增量計時器的圖形與沒有調(diào)試操作的情況相同。如果計時器停止計算這些時段內(nèi)的時間,這是可能的。同樣,如果在這種情況下使用這樣的計時器,那么增量計時器的時間曲線圖與圖8的相同。
基于時間的斷點和計時器的實施方式,可能不同,上述情況可能不同于所描述的實施方式。每一種情況下的最終目標(biāo)是允許調(diào)試器在指定的時間消逝之后暫停執(zhí)行。如果程序員希望計時器停止計算調(diào)試操作期間的時間,那么調(diào)試器應(yīng)該通知計時器何時停止。此通知可以是這樣的形式設(shè)置布爾標(biāo)志或撤消注冊計時器的處理程序過程,然后,一旦程序員選擇繼續(xù)執(zhí)行程序,再重新注冊標(biāo)志。內(nèi)核程序通常不提供暫停計時器的功能。然而,如果內(nèi)核程序提供此功能,那么調(diào)試器就可以使用該功能。
計時器可能需要如上所述改變其到期時間。因此,當(dāng)遇到觸發(fā)器時,應(yīng)該將新到期時間與當(dāng)前的到期時間進行比較,以便判斷應(yīng)該使用這兩個中的哪一個。計時器也可以維護一個到期時間的排序列表,以當(dāng)?shù)竭_當(dāng)前到期時間時選擇新到期時間。在將一個到期時間與另一個到期時間進行比較時,所有到期時間都要基于共同的時間線,并與共同的時間線進行比較。為此,到期時間應(yīng)向計時器注冊。
下面的表5顯示了一個非常簡單的處理程序過程的偽代碼示例。
表5<pre listing-type="program-listing"> Timer_Delta_handler() { if(Expiry Setting==WALL CLOCK) { if timer is disabled then { /*do nothing and exit the handler*/ return; } else { time elapsed-time elapsed+delta+CORRECTION, if time elapsed≥current expiry {<!-- SIPO <DP n="19"> --><dp n="d19"/> Notify the child program to suspend its execution. Timer_Disabled=TRUE; current expiry=get_next_expiry(); } } } else if(Expiry Setting==CPU TIME { if(child′s CPU time,consumed==expiry time) { Notify the child program to suspend its execution. expiry=got_next_expiry(); } } else if/*More case*/ }</pre>觸發(fā)器和計時器是啟動計時器并跟蹤消逝的時間所必需的。時間消逝之后要采取的操作可以改變,以獲得各種類型的基于時間的斷點。不是暫停程序執(zhí)行,而是可以在時間消逝之后插入一個新斷點。這提供了在某一個時段內(nèi)保持睡眠狀態(tài)的延遲斷點的功能。調(diào)試器在子程序的啟動期間或者當(dāng)程序繼續(xù)時插入斷點。為進一步擴展這一思想,通過使用觸發(fā)器-計時器機制,所有或一些斷點可以在不久之后啟用。這就允許程序員定義“無斷點時區(qū)”,在這段時間內(nèi),所有斷點都暫停,或者不起作用。在實踐中,如果在調(diào)試程序時調(diào)試器依賴消逝的時間來執(zhí)行某些任務(wù),則可以使用觸發(fā)器-計時器機制。
計算機硬件和軟件圖9概要顯示了一個計算機系統(tǒng)900,該系統(tǒng)可用于執(zhí)行一個進程中的實施這里描述的技術(shù)的步驟。計算機系統(tǒng)900是為執(zhí)行被編程為執(zhí)行所描述的技術(shù)的計算機軟件而提供的。此計算機軟件在安裝在計算機系統(tǒng)900上的合適的操作系統(tǒng)下執(zhí)行。
計算機軟件涉及一組編程邏輯指令,它們能夠被計算機系統(tǒng)900解釋,以便指示計算機系統(tǒng)900執(zhí)行這些指令指定的預(yù)先確定的功能。計算機軟件可以是以任何語言、代碼或表示法記錄的表達式,包括一組指令,用于使兼容的信息處理系統(tǒng)直接或者在轉(zhuǎn)換到另一種語言、代碼或表示法之后執(zhí)行特定的功能。
計算機軟件是以適當(dāng)?shù)挠嬎銠C語言編寫的包括語句的計算機程序編程的。計算機程序被使用編譯器處理為具有適合于操作系統(tǒng)執(zhí)行的二進制格式的計算機軟件。計算機軟件以涉及各種軟件組件或者代碼裝置的方式編程,可以執(zhí)行所描述的技術(shù)的進程中的特定步驟。
計算機系統(tǒng)900的組件包括計算機920、輸入設(shè)備910、915以及視頻顯示器990。計算機920包括處理器940、存儲模塊950、輸入/輸出(I/O)接口960、965、視頻接口945,以及存儲設(shè)備955。
處理器940是執(zhí)行操作系統(tǒng)以及在操作系統(tǒng)下執(zhí)行的計算機軟件的中央處理單元(CPU)。存儲模塊950包括隨機存取存儲器(RAM)和只讀存儲器(ROM),并在處理器940的指導(dǎo)下使用。
視頻接口945連接到視頻顯示器990,并提供視頻信號,以便顯示在視頻顯示器990上。從由鍵盤910和鼠標(biāo)915構(gòu)成的輸入設(shè)備910、915中提供操作計算機920的用戶輸入。存儲設(shè)備955可以包括磁盤驅(qū)動器或者任何其他合適的非易失性存儲介質(zhì)。
計算機920的每一個組件都連接到總線930,總線930包括數(shù)據(jù)、地址和控制總線,以允許這些組件通過總線930相互進行通信。
計算機系統(tǒng)900可以通過輸入/輸出(I/O)接口965使用到網(wǎng)絡(luò)980(表示為“因特網(wǎng)”)的通信信道985連接到一個或多個其他類似的計算機。
計算機軟件程序可以作為計算機程序產(chǎn)品提供,并記錄在便攜存儲介質(zhì)上。在這種情況下,計算機軟件程序被計算機系統(tǒng)900從存儲設(shè)備955訪問?;蛘?,計算機軟件可以由計算機920直接從網(wǎng)絡(luò)980進行訪問。不論是哪一種情況,用戶都可以使用鍵盤910和鼠標(biāo)915與計算機系統(tǒng)900進行交互,以操作在計算機920上執(zhí)行的編程計算機軟件。
所描述的計算機系統(tǒng)900只用于說明計算機系統(tǒng)的其他配置或類型也同樣可以用于實施所描述的技術(shù)。前述的內(nèi)容只是適合于實施所描述的技術(shù)的示例或特定類型的計算機系統(tǒng)。
應(yīng)用一些程序在執(zhí)行了比較長的時間之后會表現(xiàn)出性能問題。程序員可能希望為某一個函數(shù)放置斷點,以便當(dāng)?shù)竭_指定的時間之后程序停止執(zhí)行。在這樣的情況下,基于時間的斷點是理想的。
在其它情況下,由于產(chǎn)品的邏輯中出現(xiàn)錯誤,每當(dāng)消逝一定的時間之后,程序就可能需要調(diào)試。一個示例可以一個這樣的程序,因為在3個小時的執(zhí)行之后不能輸出任何數(shù)據(jù),因此需要調(diào)試。在這樣的情況下,基于時間的斷點也可以有用。
另一個示例是在某一個時間段內(nèi)被命中多次而在此之后命中次數(shù)變少的任何函數(shù)。如果所需的效果是在低命中次數(shù)期間調(diào)試函數(shù),以及如果高命中次數(shù)的時間是已知的,那么基于時間的斷點可以只在低命中次數(shù)期間開始生效。例如,假設(shè)一個應(yīng)用程序,從應(yīng)用程序開始執(zhí)行的最初10秒鐘期間經(jīng)常訪問一個特定文件。這10秒鐘代表應(yīng)用程序初始化所花的時間。
初始化完成之后,對文件的訪問不頻繁,而是基于用戶事件。現(xiàn)在,假設(shè)程序的某一“有缺陷的”部分可能正在不正確地讀取文件,并且這是在調(diào)查中的需要解決的缺陷。此缺陷在應(yīng)用程序完成初始化之后仍存在。在這種情況下,程序員可以在文件訪問例程中設(shè)置一個斷點,以便斷點只在10秒鐘之后生效,即,在應(yīng)用程序初始化一完成即生效。這里,斷點在10秒鐘的延遲之后設(shè)置,程序員不必在初始化期間的函數(shù)中中斷,而只有在用戶事件導(dǎo)致應(yīng)用程序訪問文件的情況下才中斷。
假設(shè)一個必須在預(yù)先確定的時間段內(nèi)(如T秒鐘)不中斷地(甚至通過斷點)執(zhí)行的程序,因為這樣的不中斷的操作對于程序的邏輯正確地執(zhí)行至關(guān)重要。在執(zhí)行T秒鐘之后,程序的執(zhí)行可以中斷。在這樣的情況下,使用基于時間的斷點是理想的,因為一個人可能不能判斷T秒鐘的變量的值。相應(yīng)地,在這種情況下,和諸如變量計數(shù)之類的其他可能的參數(shù)相比,時間對于設(shè)置斷點是更合適的參數(shù)。
所描述的實施方式自動地操作,無需程序員人工干預(yù),與現(xiàn)有的方法相比,準(zhǔn)確,不容易出錯。
其他變化所描述的提供基于時間的斷點的技術(shù)擴展了當(dāng)用戶指定的時間段消逝之后斷點的期限。所涉及的時間計算類似于上文描述的方法。如果用戶可以確定,到達斷點之后,從當(dāng)程序恢復(fù)執(zhí)行時的時間開始消逝某一個時段之后不需要該斷點,那么這樣的功能是理想的。在這種情況下,計時器是恢復(fù)執(zhí)行時啟動的,而不是在首次遇到斷點時啟動的。計時器跟蹤自從程序恢復(fù)執(zhí)行以來消逝的時間,如果在指定的時間內(nèi)斷點沒有被命中,那么斷點將被禁用。這就允許程序員通過使用時間作為參數(shù)來禁用斷點,利用該參數(shù)在調(diào)試會話期間訪問斷點。這樣的斷點的使用取決于正在被調(diào)試的程序的邏輯。
例如,如果程序員知道,斷點沒有用,除非斷點自從程序恢復(fù)執(zhí)行以來在十秒鐘內(nèi)到達,那么程序員可以選擇在十秒鐘消逝之后讓斷點到期。在計時器到期之前如果斷點被命中要執(zhí)行的操作依據(jù)實施方式而有所不同。例如,一個實施方式可以選擇即使斷點被命中斷點到期之后仍繼續(xù)。同樣,另一種實施方式可以選擇重置計時器,當(dāng)執(zhí)行恢復(fù)之后再次啟動計時器。第三種實施方式可以選擇將斷點作為任何普通斷點,如果該斷點在指定的時間消逝之前被命中。在任何情況下,斷點基于時間的度量到期,而不是基于計數(shù)值。
上述方法還可以擴展到一種特殊類型的斷點,如果在受監(jiān)視的時間段內(nèi)一直沒有用戶干預(yù)(即,輸入),則繼續(xù)執(zhí)行。例如,如果用戶自從斷點到達以來三秒鐘內(nèi)沒有按下任何鍵,那么程序應(yīng)該繼續(xù),而不是等待用戶輸入。如果程序員希望觀察程序的執(zhí)行,并希望在一個函數(shù)暫停以確定是否到達該函數(shù),那么此功能可以提供幫助。計時器跟蹤自從斷點被命中以來的時間。如果時間消逝,而沒有程序員提供任何用戶輸入,則調(diào)試器自動恢復(fù)程序的執(zhí)行。
有了這種類型的斷點,程序員就不必通過提供基于鍵盤或基于鼠標(biāo)的輸入來強制調(diào)試器繼續(xù)執(zhí)行。
這種功能對于那些使用調(diào)試器作為理解程序的功能的學(xué)習(xí)工具的程序員特定有幫助。這樣的功能還允許程序員專心于其他任務(wù),如記錄有關(guān)程序的執(zhí)行的筆記,或者,參考類別圖表,或者要求提供用戶輸入對程序員造成不便的任何其他任務(wù)。
結(jié)束語這里在提供基于時間的斷點的調(diào)試器的上下文中描述了一種方法、計算機系統(tǒng)和計算機軟件。
那些精通相關(guān)技術(shù)的人員將知道,可以對這里描述的技術(shù)和方案進行各種變更和修改。
權(quán)利要求
1.一種適合于幫助調(diào)試計算機軟件程序的、使用基于時間的斷點調(diào)試計算機程序的方法,該方法包括下列步驟遇到與正在被調(diào)試的代碼的執(zhí)行關(guān)聯(lián)的斷點;激活計時器以監(jiān)視時間的度量;監(jiān)視計時器以確定受監(jiān)視的時間何時超過預(yù)先確定的時間段;一旦受監(jiān)視的時間超過預(yù)先確定的時間段,執(zhí)行預(yù)先確定的操作。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,受監(jiān)視的計時器測量自從遇到斷點以來消逝的時間。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,受監(jiān)視的計時器測量自從遇到斷點以來消逝的時間,在該時間內(nèi),中央處理單元執(zhí)行相關(guān)進程。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,受監(jiān)視的計時器測量自從遇到斷點以來消逝的時間,在該時間內(nèi),中央處理單元執(zhí)行相關(guān)進程和操作系統(tǒng)內(nèi)核。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于,預(yù)先確定的操作包括暫停執(zhí)行相關(guān)進程的步驟,該進程涉及正在被調(diào)試的代碼。
6.根據(jù)權(quán)利要求1所述的方法,其特征在于預(yù)先確定的操作包括在正在被調(diào)試的代碼中插入其他斷點的步驟。
7.根據(jù)權(quán)利要求1所述的方法,進一步包括下列步驟一旦遇到斷點,暫停執(zhí)行相關(guān)進程,該進程涉及正在被調(diào)試的代碼。
8.根據(jù)權(quán)利要求7所述的方法,其特征在于,預(yù)先確定的操作包括恢復(fù)執(zhí)行被中止的進程的步驟,該進程涉及正在被調(diào)試的代碼。
9.根據(jù)權(quán)利要求7所述的方法,進一步包括在所說的暫停執(zhí)行相關(guān)進程的步驟之后恢復(fù)執(zhí)行被中止的相關(guān)進程的步驟。
10.根據(jù)權(quán)利要求9所述的方法,其特征在于,受監(jiān)視的計時器測量自從恢復(fù)相關(guān)進程的執(zhí)行以來消逝的時間。
11.根據(jù)權(quán)利要求10所述的方法,其特征在于,預(yù)先確定的操作包括下列步驟重新暫停執(zhí)行相關(guān)進程;停用正在被調(diào)試的代碼中的遇到的斷點;以及在停用遇到的斷點之后,恢復(fù)重新暫停的相關(guān)進程的執(zhí)行。
12.根據(jù)權(quán)利要求10所述的方法,其特征在于,預(yù)先確定的操作包括下列步驟重新暫停執(zhí)行相關(guān)進程;刪除正在被調(diào)試的代碼中的遇到的斷點;以及在停用遇到的斷點之后,恢復(fù)重新暫停的相關(guān)進程的執(zhí)行。
13.根據(jù)權(quán)利要求8所述的方法,其特征在于,只有在用戶輸入在受監(jiān)視的時間內(nèi)沒有被接收的情況下才執(zhí)行預(yù)先確定的操作。
14.一種適合于幫助調(diào)試計算機軟件程序的、使用基于時間的斷點調(diào)試計算機程序的記錄在介質(zhì)上的計算機軟件,該計算機軟件包括用于遇到與正在被調(diào)試的代碼的執(zhí)行關(guān)聯(lián)的斷點的代碼裝置;用于激活計時器以監(jiān)視時間的度量的代碼裝置;用于監(jiān)視計時器以確定受監(jiān)視的時間何時超過預(yù)先確定的時間段的代碼裝置;用于一旦受監(jiān)視的時間超過預(yù)先確定的時間段便執(zhí)行預(yù)先確定的操作的代碼裝置。
15.一種適合于幫助調(diào)試計算機軟件程序的、使用基于時間的斷點調(diào)試計算機程序的計算機系統(tǒng),該計算機系統(tǒng)包括用于遇到與正在被調(diào)試的代碼的執(zhí)行關(guān)聯(lián)的斷點的裝置;用于激活計時器以監(jiān)視時間的度量的裝置;用于監(jiān)視計時器以確定受監(jiān)視的時間何時超過預(yù)先確定的時間段的裝置;用于一旦受監(jiān)視的時間超過預(yù)先確定的時間段便執(zhí)行預(yù)先確定的操作的裝置。
全文摘要
在調(diào)試器中提供一種基于時間的斷點功能,以允許程序員在任何一行代碼設(shè)置基于時間的斷點。如果該行在執(zhí)行,而指定時間的消逝,那么程序執(zhí)行會因此而停止。調(diào)試器為每一個這樣的基于時間的斷點跟蹤消逝的時間??梢杂性S多條件用于為每一個斷點計算時間。
文檔編號G06F11/28GK1487415SQ0315495
公開日2004年4月7日 申請日期2003年8月25日 優(yōu)先權(quán)日2002年8月26日
發(fā)明者莫赫特·凱爾拉, 莫赫特 凱爾拉 申請人:國際商業(yè)機器公司