欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

Just-My-Code調(diào)試技術(shù)的制作方法

文檔序號(hào):6399481閱讀:176來(lái)源:國(guó)知局
專利名稱:Just-My-Code調(diào)試技術(shù)的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及軟件開(kāi)發(fā)。
背景技術(shù)
調(diào)試一般都涉及到調(diào)試器的使用,允許軟件開(kāi)發(fā)者能夠觀察計(jì)算機(jī)程序的運(yùn)行時(shí)間的行為并定位語(yǔ)法錯(cuò)誤。諸如停止命令之類(lèi)的某些調(diào)試命令允許程序員可以任何時(shí)間暫停執(zhí)行一個(gè)正在運(yùn)行的進(jìn)程。然而,在已經(jīng)到達(dá)代碼中的預(yù)定位置時(shí),程序員所人工插入的斷點(diǎn)允許暫停該進(jìn)程。被調(diào)試程序可以自由地運(yùn)行,直至它碰到在指令流中的斷點(diǎn)操作代碼,在該斷點(diǎn)上,操作系統(tǒng)(OS)將會(huì)暫停被調(diào)試程序,直至調(diào)試器繼續(xù)該被調(diào)試程序。于是,當(dāng)調(diào)試一個(gè)計(jì)算機(jī)程序時(shí),程序可以是運(yùn)行的(例如,作為一個(gè)進(jìn)程在執(zhí)行),也可以是暫停的。一些調(diào)試命令,例如,單步進(jìn)入、單步跳過(guò)和單步退出的命令,只有在斷點(diǎn)模式中才是已作用(即,當(dāng)被調(diào)試程序停時(shí)),并且允許程序員步進(jìn)通過(guò)程序狀態(tài),來(lái)觀察和/或更改變量、指針和/或其它類(lèi)似的內(nèi)容。
傳統(tǒng)的步驟是通過(guò)在經(jīng)過(guò)指令流的靜態(tài)分析中所獲得的戰(zhàn)略點(diǎn)上設(shè)置斷點(diǎn)操作代碼并隨后自由運(yùn)行直至遇上(碰上)相應(yīng)的插入碼來(lái)完成的。例如,單步進(jìn)入把插入碼放在被單步進(jìn)入的函數(shù)的開(kāi)始處,單步跳過(guò)把插入碼放置在正需跳過(guò)的一行之后,以及單步退出將插入碼放置在一旦將被執(zhí)行當(dāng)前函數(shù)就返回的指令處上。不幸的是,這類(lèi)常規(guī)單步命令并不允許程序員自動(dòng)跨越“不感興趣的代碼”的。相反,正如以上所討論的那樣,程序員需要在所感興趣的代碼中人工插入斷點(diǎn)并且執(zhí)行直至碰到一個(gè)斷點(diǎn),和/或人工單步通過(guò)所不感興趣的代碼以得到所感興趣的代碼。換句話說(shuō),程序員可以需要迭代(一行又一行)單步進(jìn)入和單步通過(guò)所不感興趣的代碼,單步跳過(guò)在不感興趣代碼中的一個(gè)函數(shù)和可能區(qū)域,和/或單步退出在不感興趣代碼中的一個(gè)函數(shù)和可能區(qū)域。
例如,單步進(jìn)入和單步跳過(guò)命令只是在它們處理函數(shù)調(diào)用方面是不同的。這兩個(gè)命令都可以指令調(diào)試器執(zhí)行源代碼的下一行。如果該行包含一函數(shù)調(diào)用,則單步進(jìn)入命令就只執(zhí)行調(diào)用其本身,隨后在該函數(shù)中代碼的第一行處暫停,且與代碼的第一行是否為不感興趣的代碼無(wú)關(guān)。單步退出命令可執(zhí)行整個(gè)功能,隨后在出走該函數(shù)外的第一行處暫停,且與該第一行是否為不感興趣的代碼無(wú)關(guān)。在嵌套的函數(shù)調(diào)用中,單步進(jìn)入命令可使步驟進(jìn)入到最深的嵌套函數(shù)中。例如,如果單步進(jìn)入命令用于像F1(F2())的調(diào)用,則調(diào)試器就步進(jìn)入功能F2。單步退出命令可用于通過(guò)繼續(xù)程序執(zhí)行直到函數(shù)返回來(lái)單步退出該函數(shù),并隨后在調(diào)用函數(shù)中的返回點(diǎn)處中斷執(zhí)行,這與該返回點(diǎn)是否對(duì)應(yīng)于不感興趣的代碼無(wú)關(guān)。
另外,盡管可以指令調(diào)試器對(duì)代碼中每個(gè)相應(yīng)行迭代執(zhí)行單步進(jìn)入命令,以能夠單次通過(guò)代碼中的一部分代碼,這一過(guò)程實(shí)際上降低了調(diào)試過(guò)程的性能,以及實(shí)際上也增加了過(guò)程的死鎖(即,由于調(diào)試而引起的同一緩存線的競(jìng)爭(zhēng))的風(fēng)險(xiǎn)。例如,為了仿真多級(jí)迭代單步進(jìn)入的操作,調(diào)試器,對(duì)代碼的各個(gè)行,都在下一指令的位置上插入一個(gè)斷點(diǎn),運(yùn)行過(guò)程,緩存有關(guān)執(zhí)行,并隨后檢查指令指針,以確定預(yù)先配置的停止點(diǎn)是否已經(jīng)到達(dá)(或者直至調(diào)試器已被人工停止)。應(yīng)該意識(shí)的是,這類(lèi)迭代操作,如果調(diào)試器在另一例外退出之前不能執(zhí)行多于一個(gè)單行的代碼(即,代碼只允許在一個(gè)非常短的時(shí)間內(nèi)“自由運(yùn)行”),則就會(huì)相當(dāng)妨礙調(diào)試器的性能并增加過(guò)程死鎖的可能性。為了討論的目的,自由運(yùn)行的代碼可以是一個(gè)代碼的邏輯塊,例如,一種允許無(wú)妨礙執(zhí)行到遇上斷點(diǎn)的方法或遇上所不感興趣代碼的方法。
當(dāng)正在調(diào)試的計(jì)算機(jī)程序設(shè)計(jì)成集成了大量代碼且程序員對(duì)調(diào)試不感興趣的復(fù)雜環(huán)境中操作時(shí),這類(lèi)調(diào)試器的限制就變得特別成問(wèn)題。這類(lèi)不感興趣的代碼可以包括,例如,程序員不能寫(xiě)入、已經(jīng)調(diào)試過(guò)的代碼,其它共享的代碼、網(wǎng)絡(luò)的服務(wù)代碼、互用性框架代碼,和/或類(lèi)似其它等等。在這種情況下,現(xiàn)有技術(shù)調(diào)試不允許程序員輕易跳過(guò)不感興趣代碼的程序就需要花費(fèi)時(shí)間和密集的人力,這對(duì)新手或有經(jīng)驗(yàn)程序員來(lái)說(shuō),同樣都是非常困難的。
因此,就非常希望允許用戶只調(diào)試感興趣的代碼,而無(wú)需人為地在感興趣的代碼中設(shè)置斷點(diǎn),和/或人工地步進(jìn)通過(guò)不感興趣代碼以達(dá)到感興趣的代碼的系統(tǒng)和方法。

發(fā)明內(nèi)容
本發(fā)明討論了適用于Just-My-Code代碼(JMC)調(diào)試的系統(tǒng)和方法。一個(gè)方面,調(diào)試探頭可以自動(dòng)插入在表示感興趣代碼的各個(gè)程序結(jié)構(gòu)中。調(diào)試探頭是在計(jì)算機(jī)產(chǎn)生原始代碼的計(jì)算機(jī)程序編譯操作過(guò)程中插入的。原始代碼隨后作為一個(gè)過(guò)程來(lái)執(zhí)行。該過(guò)程可以包括一個(gè)或多個(gè)在一個(gè)JMC步進(jìn)操作過(guò)程中自由運(yùn)行通過(guò)不感興趣代碼的執(zhí)行線程。只有當(dāng)線程遇到一個(gè)有效的調(diào)試探頭時(shí),一個(gè)或多個(gè)線程中的一個(gè)線程才能在感興趣的代碼中暫停,同時(shí)該線程是JMC單步通過(guò)該過(guò)程。
附圖的簡(jiǎn)要說(shuō)明以下詳細(xì)描述將參考附圖進(jìn)行討論。在附圖中,每個(gè)組件標(biāo)號(hào)數(shù)的最左邊的數(shù)表示該組件第一次出現(xiàn)的特定的附圖。


圖1顯示了一例示例性計(jì)算環(huán)境,在該計(jì)算環(huán)境中可以實(shí)現(xiàn)適用于調(diào)試Just-My-Code代碼的系統(tǒng)和方法。
圖2顯示了圖1所示的系統(tǒng)存儲(chǔ)器的另一示例性方面,它包括適用于調(diào)試Just-My-Code代碼的應(yīng)用程序和程序數(shù)據(jù)。
圖3顯示了一例適用于調(diào)試Just-My-Code代碼的示例性流程。
詳細(xì)描述概述針對(duì)常規(guī)調(diào)試技術(shù)中上述討論的限制,本發(fā)明討論了適用于調(diào)試Just-My-Code代碼的系統(tǒng)和方法,它可以在調(diào)試操作過(guò)程中自動(dòng)地跳過(guò)不感興趣的代碼。為了討論的目的,不感興趣的代碼是一種代碼,但是無(wú)論怎樣的原因,這一代碼都不能認(rèn)為是在調(diào)試時(shí)參與程序員調(diào)試工作有關(guān)的代碼(例如,程序員不能寫(xiě)入的代碼,已經(jīng)調(diào)試過(guò)的代碼,等等)?!案信d趣的代碼”是相對(duì)于不感興趣的代碼的,因?yàn)樗浅绦騿T在調(diào)試操作過(guò)程中所感興趣的。
特別是,本發(fā)明的各個(gè)實(shí)施例都允許一個(gè)調(diào)試應(yīng)用(一個(gè)調(diào)試器)可以將任意方法標(biāo)記在所感興趣的匯編程序中。在從該匯編程序產(chǎn)生原始代碼的Just-In-Time(JIT)編譯器操作的過(guò)程中,調(diào)試探頭自動(dòng)地插入到所感興趣的方法中。使用該調(diào)試器,用戶可以將原始代碼下載到過(guò)程中,以便于調(diào)試。響應(yīng)JMC步進(jìn)的操作,只有在JMC單步線程遇到了所感興趣的方法時(shí),過(guò)程執(zhí)行才可以自動(dòng)暫停。所有非JMC步進(jìn)線程都可以通過(guò)所感興趣的和所不感興趣的代碼自由運(yùn)行。這意味著用戶不再需要在所感興趣的代碼中人工設(shè)置斷點(diǎn),也不再需要程序員費(fèi)力地通過(guò)(即,執(zhí)行常規(guī)的單步操作)所不感興趣的代碼而達(dá)到所感興趣的代碼。
示例性操作系統(tǒng)回到附圖,在該附圖中,相同的標(biāo)號(hào)數(shù)指示著相同的元件,并以一個(gè)適當(dāng)?shù)挠?jì)算環(huán)境的實(shí)現(xiàn)來(lái)說(shuō)明本發(fā)明。盡管這并不是所必需的,但是本發(fā)明的討論采用了計(jì)算機(jī)可執(zhí)行指令的主要內(nèi)容,例如,由一臺(tái)個(gè)人計(jì)算機(jī)執(zhí)行的程序模塊。程序模塊一般可包括,例程、程序、對(duì)象、元件、數(shù)據(jù)結(jié)構(gòu)、等等,它們可用于執(zhí)行特殊的任務(wù)或?qū)崿F(xiàn)特殊的抽象數(shù)據(jù)類(lèi)型。
圖1說(shuō)明了一例適當(dāng)?shù)挠?jì)算環(huán)境100實(shí)例,該實(shí)例依次討論了所能夠(全部或部分)實(shí)現(xiàn)的適用于Just-My-Code代碼(JMC)的系統(tǒng)、裝置和方法。示例性計(jì)算環(huán)境100僅僅只是一例適當(dāng)?shù)挠?jì)算環(huán)境的實(shí)例,并不試圖建議對(duì)本文所討論的系統(tǒng)和方法的使用及功能作出任何限制。計(jì)算環(huán)境100不應(yīng)該解釋成其具有與計(jì)算環(huán)境100所說(shuō)明的元件的任何一個(gè)或其組合有關(guān)的獨(dú)立性或必要性。
本文所討論的方法和系統(tǒng)可以眾多其它通用或?qū)S糜?jì)算系統(tǒng)環(huán)境或配置進(jìn)行操作。眾所周知,適用于用戶的計(jì)算系統(tǒng)、環(huán)境和/或配置的實(shí)例可以包括,但并不限制于,個(gè)人計(jì)算機(jī)、服務(wù)器計(jì)算機(jī)、微處理器系統(tǒng)、基于微處理器的系統(tǒng)、網(wǎng)絡(luò)PC、小型計(jì)算機(jī)、大型計(jì)算機(jī)、包括任何上述系統(tǒng)或設(shè)備的分布式計(jì)算環(huán)境,以及其它等等。也可以在有限資源的客戶機(jī)中實(shí)現(xiàn)框架緊縮型的或其子集的方式,例如,手持計(jì)算機(jī)或者其它計(jì)算設(shè)備。本發(fā)明也可以分布式計(jì)算環(huán)境來(lái)實(shí)現(xiàn),在這類(lèi)計(jì)算環(huán)境中,可以由通過(guò)通訊網(wǎng)絡(luò)連接的遠(yuǎn)程處理設(shè)備來(lái)執(zhí)行任務(wù)。在一個(gè)分布式計(jì)算環(huán)境中,程序模塊可以放置于本機(jī)和遠(yuǎn)程存儲(chǔ)器存儲(chǔ)設(shè)備中。
正如圖1所示,計(jì)算環(huán)境100包括一個(gè)采用計(jì)算機(jī)102形式的通用計(jì)算設(shè)備。計(jì)算機(jī)102的元件可以包括,但并不限制于,一個(gè)或多個(gè)處理器或處理器單元104,一個(gè)系統(tǒng)存儲(chǔ)器106,以及一個(gè)總線108,其中,該總線將包括系統(tǒng)存儲(chǔ)器106的各種不同的系統(tǒng)元件與處理器104相耦合。系統(tǒng)總線108表示幾種類(lèi)型的總線結(jié)構(gòu)中的任何一種或多種,它包括,一種存儲(chǔ)器總線或存儲(chǔ)器控制器,一種外圍總線,一種加速圖形端口,以及使用多種總線結(jié)構(gòu)中任一種的一個(gè)處理器或本機(jī)總線。舉例來(lái)說(shuō),但并不限制于,這類(lèi)架構(gòu)可以包括工業(yè)標(biāo)準(zhǔn)結(jié)構(gòu)(ISA)總線、微通道結(jié)構(gòu)(MCA)總線、視頻電子標(biāo)準(zhǔn)協(xié)會(huì)(VESA)本機(jī)總線、以及外圍元件互連(PCI)總線(也稱之為Mezzanine總線)。
計(jì)算機(jī)102典型地包括多種計(jì)算機(jī)可讀介質(zhì)。這類(lèi)介質(zhì)可以是計(jì)算機(jī)102可以訪問(wèn)的任何一種有效介質(zhì),并且它可以包括易失性或非易失性介質(zhì),可移動(dòng)或不可移動(dòng)的介質(zhì)。在圖1中,系統(tǒng)存儲(chǔ)器106包括易失性存儲(chǔ)器形式,例如,隨機(jī)存取存儲(chǔ)器(RAM)110;以及非易失性存儲(chǔ)器形式,例如,只讀存儲(chǔ)器(ROM)112,的計(jì)算機(jī)可讀介質(zhì)?;据斎?輸出系統(tǒng)(BIOS)114存儲(chǔ)于ROM 112中,它包含著諸如在啟動(dòng)過(guò)程中有助于在計(jì)算機(jī)102各元件之間傳遞信息的例程。RAM110一般包含著數(shù)據(jù)和/或程序模塊,它可以由處理器104進(jìn)行即時(shí)訪問(wèn)和/或當(dāng)前正被操作。
計(jì)算機(jī)102還可以包括其它可移動(dòng)/非移動(dòng)性,易失性/非易失性計(jì)算機(jī)存儲(chǔ)介質(zhì)。例如,圖1說(shuō)明了一個(gè)適用于讀寫(xiě)的非移動(dòng)且非易失性的磁性介質(zhì)的硬盤(pán)驅(qū)動(dòng)器116(未顯示且一般可稱之為“硬盤(pán)驅(qū)動(dòng)器”),一個(gè)適用于讀寫(xiě)的可移動(dòng)且非易失性磁盤(pán)120的磁盤(pán)驅(qū)動(dòng)器118(即,軟盤(pán)),以及一個(gè)適用于讀寫(xiě)的可移動(dòng)且非易失性光盤(pán)124的光盤(pán)驅(qū)動(dòng)器122,光盤(pán)可包括CD-ROM/R/RW,DVD-ROM/R/RW/+R/RAM或者其它光介質(zhì)。硬盤(pán)驅(qū)動(dòng)器116,磁盤(pán)驅(qū)動(dòng)器118和光盤(pán)驅(qū)動(dòng)器122每一個(gè)采用一個(gè)或多個(gè)接口126與總線108相連接。
驅(qū)動(dòng)器和相關(guān)的計(jì)算機(jī)可讀介質(zhì)提供了計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊、以及其它適用于計(jì)算機(jī)102的數(shù)據(jù)的非易失性存儲(chǔ)。雖然本文所討論的示例性環(huán)境采用了一個(gè)硬盤(pán),一個(gè)可移動(dòng)的磁盤(pán)120以及一個(gè)可移動(dòng)的光盤(pán)124,但是,本領(lǐng)域的熟練技術(shù)人士應(yīng)該理解的是,在該示例性計(jì)算環(huán)境中也可以使用其它類(lèi)型能夠存儲(chǔ)計(jì)算機(jī)所能訪問(wèn)數(shù)據(jù)的計(jì)算機(jī)可讀介質(zhì),例如,磁帶盒、閃存存儲(chǔ)卡、數(shù)字視頻光盤(pán)、隨機(jī)存取存儲(chǔ)器(RAMs)、只讀存儲(chǔ)器(ROM),以及其它類(lèi)似等等。
用戶可以通過(guò)輸入設(shè)備,例如,鍵盤(pán)140和定位設(shè)備142(例如,“鼠標(biāo)器”)向計(jì)算機(jī)102提供命令和信息。其它輸入設(shè)備(未顯示)可以包括麥克風(fēng)、操縱桿、游戲墊、碟型衛(wèi)星天線、串行端口、掃描儀、攝像機(jī)、等等。這些和其它輸入設(shè)備都可以通過(guò)與總線108相耦合的用戶輸入界面144連接著處理單元104,但是也可以通過(guò)其它接口和總線結(jié)構(gòu)來(lái)連接,例如,并行端口、游戲端口或通用串行總線(USB)。
監(jiān)視器146或者其它類(lèi)型的顯示設(shè)備也通過(guò)一個(gè)接口(例如,視頻適配器148)與總線108相連接。除了監(jiān)視器146之外,個(gè)人計(jì)算機(jī)一般包括其它外圍輸出設(shè)備(未顯示),例如,揚(yáng)聲器和打印機(jī),它們可以通過(guò)輸出外圍接口150相連接。
計(jì)算機(jī)102可以在使用與一個(gè)或多個(gè)遠(yuǎn)程計(jì)算機(jī)(例如,遠(yuǎn)程計(jì)算機(jī)152)邏輯連接的網(wǎng)絡(luò)環(huán)境中操作。遠(yuǎn)程計(jì)算機(jī)152可以包括與計(jì)算機(jī)102有關(guān)的本文所討論的許多或所有元件和性能。在圖1中所顯示的邏輯連接可以是一個(gè)局域網(wǎng)(LAN)154和一般的廣域網(wǎng)(WAN)156。這類(lèi)網(wǎng)絡(luò)環(huán)境在辦公室中是常見(jiàn)的,包括企業(yè)內(nèi)部范圍的計(jì)算機(jī)網(wǎng)絡(luò),企業(yè)內(nèi)的互聯(lián)網(wǎng)和因特網(wǎng)。
當(dāng)在LAN網(wǎng)絡(luò)環(huán)境中使用時(shí),計(jì)算機(jī)102通過(guò)網(wǎng)絡(luò)接口或適配器158與LAN154相連接。當(dāng)在WAN網(wǎng)絡(luò)環(huán)境中使用時(shí),計(jì)算機(jī)一般可包括一個(gè)調(diào)制解調(diào)器160或者適用于建立通過(guò)WAN 156通訊的其它部件。調(diào)制解調(diào)器160可以是內(nèi)置的或者是外置的,它可以通過(guò)用戶輸入界面144或者其它合適的機(jī)制與系統(tǒng)總線108相連接。圖1中所說(shuō)明的是一個(gè)通過(guò)因特網(wǎng)的WAN的特殊實(shí)現(xiàn)。這里,計(jì)算機(jī)102采用調(diào)制解調(diào)器160來(lái)建立通過(guò)因特網(wǎng)162與至少一個(gè)遠(yuǎn)程計(jì)算機(jī)152的通訊。
在一個(gè)網(wǎng)絡(luò)環(huán)境中,所表示的程序模塊與計(jì)算機(jī)102有關(guān)或者部分與計(jì)算機(jī)102有關(guān),該程序模塊存儲(chǔ)一個(gè)遠(yuǎn)程存儲(chǔ)器存儲(chǔ)設(shè)備中。即,正如圖1所說(shuō)明的那樣,遠(yuǎn)程應(yīng)用程序164可以駐留在遠(yuǎn)程計(jì)算機(jī)152的一個(gè)遠(yuǎn)程設(shè)備中。應(yīng)該理解的是,所顯示和所討論的網(wǎng)絡(luò)連接都是示例性的,也可以使用在計(jì)算機(jī)之間建立通訊鏈路的其它裝置。
大量的程序模塊可以存儲(chǔ)于硬盤(pán)、磁盤(pán)120、光盤(pán)124、ROM 112、或者RAM110,還可包括一個(gè)提供一個(gè)運(yùn)行時(shí)間的環(huán)境、適用于Just-My-Code代碼(JMC)調(diào)試的應(yīng)用程序130、其它程序模塊132(例如,設(shè)備驅(qū)動(dòng)器等等),以及諸如源代碼的程序數(shù)據(jù)134、中間匯編、等等的操作系統(tǒng)。
圖2是一個(gè)進(jìn)一步顯示圖1所示系統(tǒng)存儲(chǔ)器106的示例性方面的方框圖,它可以包括適用于Just-My-Code代碼(JMC)調(diào)試應(yīng)用程序130和程序數(shù)據(jù)134。應(yīng)用程序130和程序模塊134包括,例如,一個(gè)過(guò)程202,一個(gè)初級(jí)編譯器204,一個(gè)適用于調(diào)試該過(guò)程202的調(diào)試程序(“調(diào)試器”)206,以及一個(gè)共享的運(yùn)行時(shí)間組件(“運(yùn)行時(shí)間”)208。過(guò)程202是已經(jīng)編譯成匯編程序(未顯示)的源代碼(未顯示),并依次已經(jīng)編譯成原始代碼210;年個(gè)202表示通過(guò)調(diào)試器206所執(zhí)行的原始代碼210。
源代碼可以表示成以任何類(lèi)型的計(jì)算機(jī)編程語(yǔ)言寫(xiě)成的計(jì)算機(jī)編程代碼。具有調(diào)試開(kāi)關(guān)(即,“/debug”)被打開(kāi)的初級(jí)編譯器204,將源代碼編譯成匯編程序(未顯示)。這樣一個(gè)初級(jí)變壓器可以是任何類(lèi)型的計(jì)算機(jī)程序語(yǔ)言編譯器,例如,C、C++、C#,VB,和/或已經(jīng)改進(jìn)成了實(shí)現(xiàn)JMC調(diào)試的其它類(lèi)型編譯器。匯編程序是眾所周知,并且可表示成在源代碼變換成平臺(tái)所指定的適用于執(zhí)行的原始代碼中的一個(gè)中間階段。為此,這樣一個(gè)匯編程序可以包括,例如,獨(dú)立于中間語(yǔ)言(IL)和相關(guān)元數(shù)據(jù)的平臺(tái)/處理器。
用戶可以將匯編程序下載到調(diào)試器206。適用于將一個(gè)匯編程序下載到一個(gè)應(yīng)用的技術(shù)是眾所周知的。例如,一個(gè)匯編程序可以通過(guò)指定(即,通過(guò)命令行或者UI)匯編程序的名稱或者通過(guò)選擇匯編程序下載到調(diào)試器206。在匯編程序下載的操作過(guò)程中,調(diào)試器206在匯編程序的不同位置上產(chǎn)生一列表感興趣的代碼212,這感興趣代碼是與不感興趣代碼相比較而言。用戶代碼(迭代源代碼變換成一個(gè)匯編程序,以及,最后,正如以下所討論的,變換成原始代碼,該原始代碼可作為一個(gè)過(guò)程來(lái)執(zhí)行)一般都包括某些感興趣代碼和不感興趣代碼的組合。然而,用戶代碼并不包括屬于運(yùn)行時(shí)間208的主機(jī)代碼。在一個(gè)實(shí)施例中,感興趣的代碼212可以通過(guò)用戶輸入到用戶輸入界面144的任何一個(gè)方面來(lái)產(chǎn)生(圖1)。例如,用戶可以選擇(即,通過(guò)一個(gè)定位設(shè)備、鍵盤(pán)、語(yǔ)音激勵(lì)技術(shù),等等)來(lái)指定在調(diào)試服務(wù)的對(duì)話框中所顯示的多種方法中的一種方法,或者用戶可以將編程結(jié)構(gòu)的名稱打入到命令行的界面,和/或其它等等。調(diào)試器206通過(guò)所暴露的調(diào)試API 216通知所識(shí)別的感興趣代碼212的調(diào)試服務(wù)214,而調(diào)試API 216也可以兩個(gè)部分來(lái)實(shí)現(xiàn),一個(gè)部分可以作為一個(gè)運(yùn)行時(shí)間208的服務(wù),而另一部分可以作為執(zhí)行216的公共部分組件且可以由調(diào)試器206來(lái)消費(fèi)。
在該點(diǎn)上,用戶可指示調(diào)試器206開(kāi)始JMC調(diào)試操作,例如,可通過(guò)使能一個(gè)JMC菜單項(xiàng)目、命令行,或者其它JMC使能指令,以及發(fā)布一個(gè)運(yùn)行或啟動(dòng)命令。這就使得調(diào)試器206指示JIT編譯器220將匯編程序變換成原始代碼210,以便于以后能作為過(guò)程202來(lái)執(zhí)行。
在匯編程序變換的操作過(guò)程中,JIT編譯器220將JMC使能元件、標(biāo)志222和調(diào)試探頭224插入原始代碼210的編程結(jié)構(gòu)中(即,執(zhí)行文件/二進(jìn)制文件、動(dòng)態(tài)連接庫(kù)、分類(lèi)目標(biāo)和方法、靜態(tài)函數(shù),和/或其它類(lèi)似)。在該實(shí)施例中,在分類(lèi)方法和/或靜態(tài)函數(shù)的前言之后立即插入該JIT使能元件。JIT編譯器220通過(guò)分解感興趣的代碼列表/標(biāo)識(shí)212來(lái)識(shí)別這類(lèi)分類(lèi)方法和/或靜態(tài)函數(shù),正如以上所討論的,感興趣的代碼列表/標(biāo)識(shí)212是由調(diào)試器206產(chǎn)生的。
調(diào)試器探頭224參考一個(gè)相關(guān)的標(biāo)志222,并通過(guò)一個(gè)編譯時(shí)間常數(shù)指針值,來(lái)確定是否請(qǐng)求調(diào)試服務(wù)器214來(lái)仿真已經(jīng)遇上有效探頭224所執(zhí)行的特殊線程是否執(zhí)行一個(gè)JMC單步操作,并且如果是的話,則暫停該過(guò)程202。正如我們現(xiàn)在所討論的,這樣的確定對(duì)干不激活的標(biāo)志是不會(huì)產(chǎn)生,而是僅對(duì)激活的標(biāo)志產(chǎn)生的。一個(gè)典型的調(diào)試探頭24可以下列方式來(lái)表示If(*pFlag){call JMC_Probe},式中,pFlag是一個(gè)指向?qū)?yīng)標(biāo)志222的編譯時(shí)間常數(shù)指針(*表示該地址將再作為運(yùn)行時(shí)間的間接引用以產(chǎn)生相關(guān)標(biāo)志222的數(shù)值)。探頭224的“JMC_Probe”部分是一個(gè)對(duì)JMC_Probe函數(shù)226的調(diào)用。通過(guò)指針間接指向的使用,與所插入的編程結(jié)構(gòu)有關(guān)的多個(gè)編程的PFlags可以全都指向相同的標(biāo)志222。
正如所說(shuō)明的,調(diào)用JMC_Probe 226是一個(gè)條件,它取決于參考標(biāo)志222是否激活或者不激活。為了討論的目的,一個(gè)激活的標(biāo)志222具有一個(gè)非零的數(shù)值,其中一個(gè)不激活的標(biāo)志具有一個(gè)零數(shù)值或空數(shù)值。當(dāng)標(biāo)志222是激活的,我們就說(shuō)該調(diào)試探頭224是激活的(即,是一個(gè)有效的探頭),反之亦然。例如,當(dāng)執(zhí)行的一個(gè)線程遇上了一個(gè)有效的探頭224,則產(chǎn)生對(duì)JMC_Probe的調(diào)用。相類(lèi)似,遇上一個(gè)不激活的探頭224就不會(huì)產(chǎn)生這類(lèi)調(diào)用。這就意味著翻轉(zhuǎn)觸發(fā)一個(gè)信號(hào)標(biāo)志222可以分別激活或不激活各個(gè)相關(guān)的探頭224?,F(xiàn)在,我們討論這些新穎的JMC調(diào)試探頭224在調(diào)試過(guò)程中是怎樣使用的。
當(dāng)過(guò)程202已經(jīng)暫停(通過(guò)任何傳統(tǒng)的單步機(jī)制,例如,通過(guò)采用一個(gè)傳統(tǒng)的斷點(diǎn))時(shí),調(diào)試器206允許用戶通過(guò)JMC單步命令228使得JMC步進(jìn)通過(guò)過(guò)程202(即,JMC單步進(jìn)入,JMC單步退出,和JMC單步跳過(guò)命令)。這類(lèi)命令可以由用戶來(lái)選擇,例如,通過(guò)命令行和/或用戶界面144的UI部分(圖1)。響應(yīng)于由調(diào)試器206對(duì)調(diào)試服務(wù)214發(fā)出的一個(gè)JMC單步命令228(即,JMC單步進(jìn)入,單步退出,和單步跳過(guò)命令228的任何一個(gè)),調(diào)試服務(wù)器大量使能標(biāo)志222,并從而激活相關(guān)的探頭224。用戶不需要知道那一個(gè)探頭是激活的。
激活調(diào)試探頭224允許過(guò)程202的執(zhí)行線程可以自由運(yùn)行通過(guò)不感興趣的代碼(即,可以基本上全速和不需要暫停)。遇上一個(gè)激活探頭224的任何線程,只要它是處于感興趣代碼中的,就只有在所遇到的探頭224通過(guò)對(duì)JMC_Probe 226的調(diào)用才能暫停(通過(guò)TriggerMethodEntry 230),以確定該線程是JMC單步通過(guò)代碼的。為了能達(dá)到這一點(diǎn),JMC_Probe 226通過(guò)對(duì)調(diào)用堆棧的解碼來(lái)濾去不能進(jìn)行JMC單步操作的線程(見(jiàn),其它數(shù)據(jù)232),從而識(shí)別與所遇到的(“已觸發(fā)的”)調(diào)試探頭224相關(guān)方法的指令指針(ip)和幀指針(fp)。如果當(dāng)前的線程是進(jìn)行JMC單步操作,則JMC_Probe 226就將ip和jp參數(shù)發(fā)送給TriggerMethodEntry 230,它可以隨后將ip映射回該方法以確定該方法是否是感興趣的方法,正如在感興趣代碼列表/標(biāo)識(shí)212中所指示的。(運(yùn)行時(shí)間208能夠?yàn)镴IT編譯器220作充分的薄記工作,以完全保證一個(gè)調(diào)試探頭224可以通過(guò)一個(gè)查找表的操作來(lái)確定該探頭是否處于所感興趣的代碼中)。如果該方法是感興趣的,則JMC_Probe 226就可以在調(diào)試探頭224之后插入一個(gè)中斷的操作碼(即,一個(gè)斷點(diǎn)234,JMC_Probe可以注入所有的斷點(diǎn)234),并且繼續(xù)過(guò)程的執(zhí)行,使得執(zhí)行的線程將會(huì)擊中斷點(diǎn)234以及在所感興趣的代碼中停止下來(lái)。
另外,如果JMC單步命令228是·JMC單步進(jìn)入,調(diào)試服務(wù)器214可激活所有的JMC_Probe 224并且在調(diào)用了單步進(jìn)入的方法之后設(shè)置一個(gè)斷點(diǎn)(不是JMC_Probe被插入的斷點(diǎn))。因?yàn)镴MC_Probe 224是處在所有感興趣代碼的起始位置上,并且激活探頭,如果調(diào)用最后調(diào)用了任何“感興趣”代碼(也許非直接地,通過(guò)調(diào)用最終包括“感興趣”代碼的不感興趣/框架代碼),則該線程將擊中一個(gè)激活的探頭,該探頭將調(diào)用TriggerMethodEntry 230一停止該線程,在感興趣的代碼中單步完成。如果該調(diào)用未調(diào)用任何感興趣的代碼,則該線程將擊中所插入的斷點(diǎn),它插入在單步進(jìn)入方法的調(diào)用之后(即,不是JMC_Probe插入的斷點(diǎn)234),并且JMC單步進(jìn)入的操作將完成。采用這樣的方法,進(jìn)程202可以在JMC單步進(jìn)入起始和它結(jié)束之間的時(shí)間內(nèi)全速運(yùn)行(即,不會(huì)被中間斷點(diǎn)操作碼中斷)。
·JMC單步退出,JMC_Probe 226自動(dòng)對(duì)一個(gè)感興趣的方法將一個(gè)斷點(diǎn)234插入在由第一堆棧幀所標(biāo)識(shí)的返回地址上。于是,斷點(diǎn)就沒(méi)有插入在調(diào)試探頭224能夠遇上的相同方法中。為了將具有一個(gè)返回地址的第一堆棧幀放置于一個(gè)感興趣的方法中,則調(diào)試服務(wù)器214就完全走過(guò)過(guò)程堆棧(即,展開(kāi)堆棧)。由于“其它數(shù)據(jù)”232的“感興趣方法的數(shù)據(jù)”部分,調(diào)試服務(wù)器214可采用一個(gè)或多個(gè)運(yùn)行時(shí)間208的服務(wù),以確定一個(gè)堆棧幀的地址是否為一個(gè)感興趣方法的返回地址。這類(lèi)感興趣方法數(shù)據(jù)包括,例如,適用于各種感興趣方法的各自基本上唯一的ID(即,一個(gè)GUID)。在一個(gè)實(shí)施例中,在調(diào)試探頭224插入操作的過(guò)程中,由JIT編譯器220產(chǎn)生感興趣方法的數(shù)據(jù)。
·JMC單步跳過(guò)和線程不在該方法結(jié)束的地方執(zhí)行一個(gè)指令的話,就會(huì)引起JMC_Probe 226產(chǎn)生類(lèi)似于一個(gè)傳統(tǒng)單步跳過(guò)的行為。如果該線程是在該方法結(jié)束的地方,則JMC_Probe 226就會(huì)產(chǎn)生類(lèi)似于單步進(jìn)入和單步退出的行為,使得該線程將停止在所執(zhí)行的感興趣代碼的第一個(gè)實(shí)例(第一行)中。
響應(yīng)JMC單步命令228的完成,這是由正在暫停的這個(gè)JMC單步線程所證明的,調(diào)試服務(wù)器214禁止所有的探頭(調(diào)試器206僅理解JMC單步操作;它不知道有關(guān)探頭的其它事情)。不激活探頭224是避免對(duì)JMC_Probe 226不必要調(diào)用的性能最優(yōu)化,否則這種調(diào)用就可能在沒(méi)有執(zhí)行的線程是JMC單步指令的情況下發(fā)生。
在本實(shí)施例中,標(biāo)志222是一個(gè)按模塊基礎(chǔ)上的使能/禁止(即,每個(gè)模塊中被插入一個(gè)(1)標(biāo)志)。采用這樣的方式,在該模塊中的各種方式都對(duì)pFlag具有相同的數(shù)值。這一特殊的實(shí)施例是基于代碼是在按模塊的基礎(chǔ)上的感興趣和不感興趣的合理性的。應(yīng)該意識(shí)到,不同的合理性可以以不同的實(shí)施例作為一個(gè)特殊實(shí)施例設(shè)計(jì)的一個(gè)函數(shù)來(lái)加以實(shí)現(xiàn)。例如,標(biāo)志222也可能插入在按方法的基礎(chǔ)上;可以對(duì)更多的標(biāo)志222作些折中,可以通過(guò)改變/觸發(fā)一單個(gè)標(biāo)志222的值來(lái)使能較少的探頭。
因此,遇到一個(gè)有效探頭224的所有線程都會(huì)產(chǎn)生對(duì)JMC_Probe 226的調(diào)用,即使當(dāng)前的線程不是JMC單步執(zhí)行。只有當(dāng)JMC_Probe 226確定該線程時(shí)一個(gè)JMC單步時(shí),該線程才被暫停。類(lèi)似的,如果所遇上的線程調(diào)試探頭224不是有效的,則對(duì)JMC_Probe 226的調(diào)用就完全可以跳過(guò),并且該線程可以正常(即,自由地運(yùn)行)地繼續(xù)執(zhí)行通過(guò)該進(jìn)程。
在該實(shí)施例中,對(duì)JMC_Probe功能的調(diào)用226可以在尺寸上得到充分的優(yōu)化,因?yàn)樗鼪](méi)有采用任何參數(shù)且沒(méi)有返回?cái)?shù)值。這就提供了用于優(yōu)化所有的“調(diào)用位置”(產(chǎn)生對(duì)JMC_Probe函數(shù)226的各個(gè)調(diào)用的位置)。于是,如果對(duì)來(lái)自調(diào)試探頭224的JMC_Probe的調(diào)用是來(lái)自探頭的(即,當(dāng)*pFlag!=0),則該調(diào)用就將不再是一個(gè)重的加權(quán)調(diào)用。這就意味著該調(diào)用并不需要對(duì)堆棧進(jìn)行壓入和彈出函數(shù)參數(shù)。這依次意味著與需要壓入和彈出參數(shù)的函數(shù)相比較,JMC_Probe調(diào)用位置的加權(quán)要輕得多。一線程在遇到一個(gè)無(wú)效探頭224要經(jīng)受的唯一處理開(kāi)銷(xiāo)是它要進(jìn)行處理以評(píng)估標(biāo)志222(通過(guò)一個(gè)*pFlag)以及跳到插入的調(diào)試探頭224之后的下一個(gè)指令。采用這一方式,所討論的JMC調(diào)試操作允許線程以基本全速的方式自由運(yùn)行,以通過(guò)所有不感興趣的代碼直至遇上所感興趣的代碼。
在本實(shí)施例中,運(yùn)行時(shí)間208是基于一種公用語(yǔ)言基礎(chǔ)結(jié)構(gòu)(CLI),該公用語(yǔ)言基礎(chǔ)結(jié)構(gòu)提供了適用于可執(zhí)行代碼的規(guī)范以及它所運(yùn)行的虛擬執(zhí)行環(huán)境。于是,盡管在圖2中分別進(jìn)行了說(shuō)明,但是過(guò)程208和運(yùn)行時(shí)間202都是相同執(zhí)行環(huán)境中的一個(gè)部分(即,過(guò)程202控制著運(yùn)行時(shí)間208)。
示實(shí)例過(guò)程圖3顯示了一例適用于JMC調(diào)試的示例性過(guò)程。為了討論的目的,這些過(guò)程操作都可以參考圖1和圖9所示的程序模塊和數(shù)據(jù)特性來(lái)討論。在方框302,調(diào)試器206(圖2)識(shí)別所感興趣的計(jì)算機(jī)程序編程結(jié)構(gòu)(即,對(duì)象方法和/或靜態(tài)功能)。在一個(gè)實(shí)施例中,這是通過(guò)用戶輸入到用戶輸入界面144的任何方面來(lái)完成的(圖1)。例如,用戶可以選擇(即,通過(guò)一個(gè)指點(diǎn)設(shè)備、鍵盤(pán)、語(yǔ)音激勵(lì)技術(shù),等等)來(lái)指定在調(diào)試服務(wù)器的對(duì)話方框中所顯示的多種方法中的一種方法,或者用戶可以將編程結(jié)構(gòu)的名稱鍵入一個(gè)命令行的界面上,和/或類(lèi)似的。這些用戶輸入可以存儲(chǔ)于所感興趣的代碼列表/標(biāo)識(shí)212中(圖2),它可以由運(yùn)行時(shí)間編譯器220讀取(圖2),以識(shí)別感興趣的編程結(jié)構(gòu)(即,感興趣的代碼)。
在方框304,調(diào)試器206(圖2)指令一個(gè)編譯器,例如,圖2所示的Just-In-Time(JIM)編譯器220,以便于在編譯操作過(guò)程中將JMC使能元件222和224自動(dòng)插入計(jì)算機(jī)程序的各個(gè)獨(dú)立的編程結(jié)構(gòu)(即,方法)。在本實(shí)施例中,JIT編譯器220編譯一個(gè)匯編程序,以產(chǎn)生原始代碼210(圖2),并自動(dòng)地將各個(gè)標(biāo)志222和調(diào)試探頭224插入到原始代碼210中。在方框306,在調(diào)試器206的控制下作為進(jìn)程202(圖2)來(lái)執(zhí)行原始代碼210(圖2)。該進(jìn)程202包括任何數(shù)量的作為該進(jìn)程的特殊實(shí)施的函數(shù)的執(zhí)行線程。
在方框308,調(diào)試器206(圖2)允許用戶輸入一個(gè)JMC單步命令228來(lái)JMC單步步進(jìn)的一個(gè)線程以通過(guò)該進(jìn)程202。因?yàn)樵摼€程是JMC單步步進(jìn)的,所以該線程可稱之為一個(gè)“感興趣的線程”。該進(jìn)程202可以是多線程的并且包括一個(gè)不是JMC單步步進(jìn)的線程,該線程可以稱之為一個(gè)“不感興趣的線程”。一個(gè)感興趣的線程可以自由運(yùn)行(無(wú)暫停的)通過(guò)不感興趣的代碼(即,與在方框302中所選擇的編程結(jié)構(gòu)中的所選擇的/單獨(dú)的結(jié)構(gòu)所識(shí)別的感興趣代碼不相對(duì)應(yīng)的任何代碼)。感興趣線程可由調(diào)試服務(wù)器214自動(dòng)暫停,無(wú)論何時(shí)只要它首次遇上一個(gè)有效的調(diào)試探頭224。確定過(guò)程202的一個(gè)線程(圖2)是否為一個(gè)感興趣的線程以及所感興趣的線程是否為一個(gè)在所選擇的編程結(jié)構(gòu)中的執(zhí)行/訪問(wèn)的代碼是由所遇上的調(diào)試探頭224在運(yùn)行時(shí)間確定的。于是,所有非JMC單步線程都可以自由運(yùn)行通過(guò)在感興趣代碼和不感興趣代碼中所有遇上的調(diào)試探頭224。
結(jié)論所討論的系統(tǒng)和方法提供了JMC調(diào)試。盡管已經(jīng)討論的系統(tǒng)和方法在語(yǔ)言上特定于結(jié)構(gòu)性能和操作方法,但是在權(quán)利要求中所限定的主題內(nèi)容并不一定要限制于上述的特定的性能和操作。相反,只是以實(shí)現(xiàn)權(quán)利要求的主題內(nèi)容的示例性形式披露了特定的性能和操作。
權(quán)利要求
1.一種適用于Just-My-Code代碼調(diào)試的計(jì)算機(jī)程序指令的計(jì)算機(jī)可讀介質(zhì),該計(jì)算機(jī)程序指令可以由一個(gè)處理器來(lái)執(zhí)行自動(dòng)將調(diào)試探頭插入到表示感興趣代碼的各個(gè)編程結(jié)構(gòu)中,所述調(diào)試探頭在計(jì)算機(jī)的計(jì)算機(jī)程序編譯操作期間被插入,以產(chǎn)生原始代碼;和,作為一個(gè)進(jìn)程執(zhí)行原始代碼,該進(jìn)程包括在一個(gè)JMC單步操作期間自由運(yùn)行通過(guò)不感興趣代碼的執(zhí)行的一個(gè)或多個(gè)線程,在一個(gè)或多個(gè)線程中的一個(gè)線程只能在調(diào)試探頭的一個(gè)有效探頭被該線程遇上且該線程是以JMC單步通過(guò)該進(jìn)程時(shí)才可在感興趣的代碼中暫停。
2.如權(quán)利要求1所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,所述各個(gè)編程結(jié)構(gòu)是類(lèi)方法和/或靜態(tài)函數(shù)。
3.如權(quán)利要求1所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,JMC單步步進(jìn)的包括由一個(gè)調(diào)試器的發(fā)布的一個(gè)JMC單步進(jìn)入,一個(gè)JMC單步退出,或者一個(gè)JMC單步跳過(guò)的命令。
4.如權(quán)利要求1所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,各個(gè)調(diào)試探頭包括一個(gè)編譯時(shí)間常數(shù)和一個(gè)對(duì)調(diào)試服務(wù)的調(diào)用,以及所述計(jì)算機(jī)程序指令還包括指令用于響應(yīng)于遇上有效的探頭,間接引用對(duì)應(yīng)于有效探頭的編譯時(shí)間常數(shù),以確定所執(zhí)行的一個(gè)或多個(gè)線程中的任何一個(gè)是否為JMC單步步進(jìn)的;如果至少一個(gè)線程是JMC單步步進(jìn)的,則調(diào)用調(diào)試服務(wù)來(lái)確定該線程是否為JMC單步步進(jìn)的;響應(yīng)于確定的線程是JMC單步步進(jìn)的,使線程暫停在有效探頭之后一行代碼處;和,響應(yīng)于確定該線程不是JNC單步步進(jìn)的,不將斷點(diǎn)自動(dòng)插入在代碼中來(lái)暫停該線程。
5.如權(quán)利要求1所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,所述各個(gè)調(diào)試探頭包括一個(gè)編譯時(shí)間常數(shù)和一個(gè)對(duì)調(diào)試服務(wù)的調(diào)用,以及所述計(jì)算機(jī)程序指令還包括指令用于響應(yīng)于遇上有效的探頭,間接引用對(duì)應(yīng)于有效探頭的編譯時(shí)間常數(shù),以確定所執(zhí)行的一個(gè)或多個(gè)線程中的任何一個(gè)是否為JMC單步步進(jìn)的;如果至少一個(gè)線程是JMC單步步進(jìn)的,則調(diào)用調(diào)試服務(wù)來(lái)確定該線程是否為JMC單步步進(jìn)的;響應(yīng)于確定的線程是JMC單步步進(jìn)的將線程暫停在有效探頭之后一行代碼處;去除一個(gè)相對(duì)應(yīng)的斷點(diǎn);和,不激活所述調(diào)試探頭的各個(gè)探頭。
6.如權(quán)利要求1所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,所述各個(gè)調(diào)試探頭包括一個(gè)編譯時(shí)間常數(shù)和一個(gè)對(duì)調(diào)試服務(wù)的調(diào)用,以及所述計(jì)算機(jī)程序指令還包括指令用于響應(yīng)于遇上有效的探頭,間接引用對(duì)應(yīng)于有效探頭的編譯時(shí)間常數(shù),以確定所執(zhí)行的一個(gè)或多個(gè)線程中的任何一個(gè)是否為JMC單步步進(jìn)的;如果至少一個(gè)線程是JMC單步步進(jìn)的,則調(diào)用調(diào)試服務(wù)來(lái)確定該線程是否為JMC單步步進(jìn)的;響應(yīng)于確定的線程是JMC單步步進(jìn)的將一個(gè)斷點(diǎn)設(shè)置在緊跟著對(duì)該線程是JMC單步進(jìn)入的程序結(jié)構(gòu)的調(diào)用后的一行代碼中。
7.如權(quán)利要求1所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,所述各個(gè)調(diào)試探頭包括一個(gè)編譯時(shí)間常數(shù)和一個(gè)對(duì)調(diào)試服務(wù)的調(diào)用,以及所述計(jì)算機(jī)程序指令還包括指令用于響應(yīng)于遇上有效的探頭,間接引用對(duì)應(yīng)于有效探頭的編譯時(shí)間常數(shù),以確定所執(zhí)行的一個(gè)或多個(gè)線程中的任何一個(gè)是否為JMC單步步進(jìn)的;如果至少一個(gè)線程是JMC單步步進(jìn)的,則調(diào)用調(diào)試服務(wù)來(lái)確定該線程是否為JMC單步步進(jìn)的;和響應(yīng)于確定該線程是JMC單步退出將一個(gè)第一堆棧幀的一個(gè)返回地址識(shí)別為一個(gè)感興趣編程結(jié)構(gòu);和,將一個(gè)斷點(diǎn)插入在所述返回地址上。
8.如權(quán)利要求1所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,所述各個(gè)調(diào)試探頭包括一個(gè)編譯時(shí)間常數(shù)和一個(gè)對(duì)調(diào)試服務(wù)的調(diào)用,以及所述計(jì)算機(jī)程序指令還包括指令用于響應(yīng)于遇上有效的探頭,間接引用對(duì)應(yīng)于有效探頭的編譯時(shí)間常數(shù),以確定所執(zhí)行的一個(gè)或多個(gè)線程中的任何一個(gè)是否為JMC單步步進(jìn)的;如果至少一個(gè)線程是JMC單步步進(jìn)的,則調(diào)用調(diào)試服務(wù)來(lái)確定該線程是否為JMC單步步進(jìn)的;和,響應(yīng)于確定該線程是JMC單步退出確定所述線程是否接近于方法的結(jié)束端;和,響應(yīng)于確定,如果所述線程接近于方法的結(jié)束端,則將所述線程暫停在被執(zhí)行的下一個(gè)感興趣代碼的第一行處。
9.如權(quán)利要求1所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,所述計(jì)算機(jī)程序指令還包括用于將感興趣代碼識(shí)別為編程結(jié)構(gòu)中的特殊結(jié)構(gòu)的指令。
10.如權(quán)利要求10所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,所述編程結(jié)構(gòu)中的特殊結(jié)構(gòu)可通過(guò)用戶界面,命令行,和/或配置文件數(shù)據(jù)輸入來(lái)識(shí)別。
11.一種適用于Just-My-Code代碼調(diào)試的方法,其特征在于,該方法包括自動(dòng)將調(diào)試探頭插入到表示感興趣代碼的各個(gè)編程結(jié)構(gòu)中,所述調(diào)試探頭在計(jì)算機(jī)的計(jì)算機(jī)程序編譯操作期間被插入,以產(chǎn)生原始代碼;作為一個(gè)進(jìn)程執(zhí)行原始代碼,該進(jìn)程包括在一個(gè)JMC單步操作期間自由運(yùn)行通過(guò)不感興趣代碼的執(zhí)行的一個(gè)或多個(gè)線程,在一個(gè)或多個(gè)線程中的一個(gè)線程只能在調(diào)試探頭的一個(gè)有效探頭被該線程遇上且該線程是以JMC單步通過(guò)該進(jìn)程時(shí)才可在感興趣的代碼中暫停;和,其中,JMC單步步進(jìn)的包括一個(gè)JMC單步進(jìn)入,一個(gè)JMC單步退出,或者一個(gè)JMC單步跳過(guò)的操作。
12.如權(quán)利要求11所述的方法,其特征在于,所述各個(gè)編程結(jié)構(gòu)是分類(lèi)方法和/或靜態(tài)函數(shù)。
13.如權(quán)利要求11所述的方法,其特征在于,所述各個(gè)調(diào)試探頭包括一個(gè)編譯時(shí)間常數(shù)和一個(gè)對(duì)調(diào)試服務(wù)器的調(diào)用,以及所述方法還包括響應(yīng)于遇上有效的探頭,間接引用對(duì)應(yīng)于有效探頭的編譯時(shí)間常數(shù),以確定所執(zhí)行的一個(gè)或多個(gè)線程中的任何一個(gè)是否為JMC單步步進(jìn)的;如果至少一個(gè)線程是JMC單步步進(jìn)的,則調(diào)用調(diào)試服務(wù)來(lái)確定該線程是否為JMC單步步進(jìn)的;響應(yīng)于確定該線程是JMC單步步進(jìn)的,將線程暫停在有效探頭之后一行代碼處;和,響應(yīng)于確定的線程不是JNC單步步進(jìn)的,不將斷點(diǎn)自動(dòng)插入在代碼中來(lái)暫停該線程。
14.如權(quán)利要求11所述的方法,其特征在于,所述各個(gè)調(diào)試探頭包括一個(gè)編譯時(shí)間常數(shù)和一個(gè)對(duì)調(diào)試服務(wù)的調(diào)用,以及所述方法還包括響應(yīng)于遇上有效的探頭,間接引用對(duì)應(yīng)于有效探頭的編譯時(shí)間常數(shù),以確定所執(zhí)行的一個(gè)或多個(gè)線程中的任何一個(gè)是否為JMC單步步進(jìn)的;如果至少一個(gè)線程是JMC單步步進(jìn)的,則調(diào)用調(diào)試服務(wù)來(lái)確定該線程是否為JMC單步步進(jìn)的;響應(yīng)于確定該線程是JMC單步步進(jìn)的將線程暫停在有效探頭之后一行代碼處;去除一個(gè)相對(duì)應(yīng)的斷點(diǎn);和,不激活所述調(diào)試探頭的各個(gè)探頭。
15.如權(quán)利要求11所述的方法,其特征在于,所述各個(gè)調(diào)試探頭包括一個(gè)編譯時(shí)間常數(shù)和一個(gè)對(duì)調(diào)試服務(wù)的調(diào)用,以及所述方法還包括響應(yīng)于遇上有效的探頭,間接引用對(duì)應(yīng)于有效探頭的編譯時(shí)間常數(shù),以確定所執(zhí)行的一個(gè)或多個(gè)線程中的任何一個(gè)是否為JMC單步步進(jìn)的;如果至少一個(gè)線程是JMC單步步進(jìn)的,則調(diào)用調(diào)試服務(wù)來(lái)確定該線程是否為JMC單步步進(jìn)的;和,響應(yīng)于確定該線程是JMC單步步進(jìn)入,將一個(gè)斷點(diǎn)設(shè)置在緊跟著對(duì)該線程是JMC單步進(jìn)入的程序結(jié)構(gòu)的調(diào)用后的一行代碼中。
16.如權(quán)利要求1所述的方法,其特征在于,所述各個(gè)調(diào)試探頭包括一個(gè)編譯時(shí)間常數(shù)和一個(gè)對(duì)調(diào)試服務(wù)的調(diào)用,以及所述計(jì)算機(jī)程序指令還包括的指令用于響應(yīng)于遇上有效的探頭,間接引用對(duì)應(yīng)于有效探頭的編譯時(shí)間常數(shù),以確定所執(zhí)行的一個(gè)或多個(gè)線程中的任何一個(gè)是否為JMC單步步進(jìn)的;如果至少一個(gè)線程是JMC單步步進(jìn)的,則調(diào)用調(diào)試服務(wù)來(lái)確定該線程是否為JMC單步步進(jìn)的;和,響應(yīng)于確定該線程是JMC單步退出將一個(gè)第一堆棧幀的一個(gè)返回地址識(shí)別為一個(gè)感興趣編程結(jié)構(gòu);和,將一個(gè)斷點(diǎn)插入在所述返回地址上。
17.如權(quán)利要求11所述的方法,其特征在于,所述各個(gè)調(diào)試探頭包括一個(gè)編譯時(shí)間常數(shù)和一個(gè)對(duì)調(diào)試服務(wù)的調(diào)用,以及所述方法還包括的指令用于響應(yīng)于遇上有效的探頭,間接引用對(duì)應(yīng)于有效探頭的編譯時(shí)間常數(shù),以確定所執(zhí)行的一個(gè)或多個(gè)線程中的任何一個(gè)是否為JMC單步步進(jìn)的;如果至少一個(gè)線程是JMC單步步進(jìn)的,則調(diào)用調(diào)試服務(wù)來(lái)確定該線程是否為JMC單步步進(jìn)的;和,響應(yīng)于確定該線程是JMC單步跳過(guò)確定所述線程是否接近于方法的結(jié)束端;和,響應(yīng)于確定,如果所述線程接近于方法的結(jié)束端,則將所述線程暫定在被執(zhí)行的下一個(gè)感興趣代碼的第一行處。
18.如權(quán)利要求1所述的方法,其特征在于,所述方法還包括適用于將感興趣代碼識(shí)別為編程結(jié)構(gòu)中的一個(gè)特殊結(jié)構(gòu)。
19.一種適用于Just-My-Code代碼調(diào)試的計(jì)算機(jī)設(shè)備,該計(jì)算機(jī)設(shè)備包括一個(gè)處理器;和,一個(gè)與所述處理器相耦合的存儲(chǔ)器,該存儲(chǔ)器包括可以由所述處理器執(zhí)行的一些計(jì)算機(jī)程序指令用于自動(dòng)將調(diào)試探頭插入到表示感興趣代碼的各個(gè)編程結(jié)構(gòu)中,所述調(diào)試探頭在計(jì)算機(jī)的計(jì)算機(jī)程序編譯操作期間被插入,以產(chǎn)生原始代碼,所述程序結(jié)構(gòu)包括類(lèi)方法和/或靜態(tài)函數(shù);和,作為一個(gè)進(jìn)程執(zhí)行原始代碼,該進(jìn)程包括在一個(gè)JMC單步操作期間自由運(yùn)行通過(guò)不感興趣代碼的執(zhí)行的一個(gè)或多個(gè)線程,在一個(gè)或多個(gè)線程中的一個(gè)線程只能在調(diào)試探頭的一個(gè)有效探頭被該線程遇上且該線程是以JMC單步通過(guò)該過(guò)程時(shí)才可在感興趣的代碼中暫停。
20.如權(quán)利要求19所述的計(jì)算機(jī)設(shè)備,其特征在于,所述JMC單步步進(jìn)的包括由一個(gè)調(diào)試器的發(fā)布的一個(gè)JMC單步進(jìn)入,一個(gè)JMC單步退出,或者一個(gè)JMC單步跳過(guò)的命令。
21.如權(quán)利要求19所述的計(jì)算機(jī)設(shè)備,其特征在于,所述各個(gè)調(diào)試探頭包括一個(gè)編譯時(shí)間常數(shù)和一個(gè)對(duì)調(diào)試服務(wù)的調(diào)用,以及所述計(jì)算機(jī)程序指令還包括指令用于響應(yīng)于遇上有效的探頭,間接引用對(duì)應(yīng)于有效探頭的編譯時(shí)間常數(shù),以確定所執(zhí)行的一個(gè)或多個(gè)線程中的任何一個(gè)是否為JMC單步步進(jìn)的;如果至少一個(gè)線程是JMC單步步進(jìn)的,則調(diào)用調(diào)試服務(wù)來(lái)確定該線程是否為JMC單步步進(jìn)的;響應(yīng)于確定該線程是JMC單步步進(jìn)的,將線程暫停在有效探頭之后一行代碼處;和,響應(yīng)于確定該線程不是JNC單步步進(jìn)的,不將斷點(diǎn)自動(dòng)插入在代碼中來(lái)暫停該線程。
22.如權(quán)利要求19所述的計(jì)算機(jī)設(shè)備,其特征在于,所述各個(gè)調(diào)試探頭包括一個(gè)編譯時(shí)間常數(shù)和一個(gè)對(duì)調(diào)試服務(wù)的調(diào)用,以及所述計(jì)算機(jī)程序指令還包括指令用于響應(yīng)于遇上有效的探頭,間接引用對(duì)應(yīng)于有效探頭的編譯時(shí)間常數(shù),以確定所執(zhí)行的一個(gè)或多個(gè)線程中的任何一個(gè)是否為JMC單步步進(jìn)的;如果至少一個(gè)線程是JMC單步步進(jìn)的,則調(diào)用調(diào)試服務(wù)來(lái)確定該線程是否為JMC單步步進(jìn)的;響應(yīng)于確定該線程是JMC單步步進(jìn)的將線程暫停在有效探頭之后一行代碼處;去除一個(gè)相對(duì)應(yīng)的斷點(diǎn);和,不激活所述調(diào)試探頭的各個(gè)探頭。
23.如權(quán)利要求19所述的計(jì)算機(jī)設(shè)備,其特征在于,所述各個(gè)調(diào)試探頭包括一個(gè)編譯時(shí)間常數(shù)和一個(gè)對(duì)調(diào)試服務(wù)的調(diào)用,以及所述計(jì)算機(jī)程序指令還包括指令用于響應(yīng)于遇上有效的探頭,間接引用對(duì)應(yīng)于有效探頭的編譯時(shí)間常數(shù),以確定所執(zhí)行的一個(gè)或多個(gè)線程中的任何一個(gè)是否為JMC單步步進(jìn)的;如果至少一個(gè)線程是JMC單步步進(jìn)的,則調(diào)用調(diào)試服務(wù)來(lái)確定該線程是否為JMC單步步進(jìn)的;和,響應(yīng)所確定該線程是JMC單步進(jìn)入,將一個(gè)斷點(diǎn)設(shè)置在緊跟著對(duì)該線程是JMC單步進(jìn)入的程序結(jié)構(gòu)的調(diào)用后的一行代碼中。
24.如權(quán)利要求19所述的計(jì)算機(jī)設(shè)備,其特征在于,所述各個(gè)調(diào)試探頭包括一個(gè)編譯時(shí)間常數(shù)和一個(gè)對(duì)調(diào)試服務(wù)的調(diào)用,以及所述計(jì)算機(jī)程序指令還包括指令用于響應(yīng)于遇上有效的探頭,間接引用對(duì)應(yīng)于有效探頭的編譯時(shí)間常數(shù),以確定所執(zhí)行的一個(gè)或多個(gè)線程中的任何一個(gè)是否為JMC單步步進(jìn)的;如果至少一個(gè)線程是JMC單步步進(jìn)的,則調(diào)用調(diào)試服務(wù)來(lái)確定該線程是否為JMC單步步進(jìn)的;和,響應(yīng)于確定該線程是JMC單步退出將一個(gè)第一堆棧幀的一個(gè)返回地址識(shí)別為一個(gè)感興趣編程結(jié)構(gòu);和,將一個(gè)斷點(diǎn)插入在所述返回地址上。
25.如權(quán)利要求19所述的計(jì)算機(jī)設(shè)備,其特征在于,所述各個(gè)調(diào)試探頭包括一個(gè)編譯時(shí)間常數(shù)和一個(gè)對(duì)調(diào)試服務(wù)的調(diào)用,以及所述計(jì)算機(jī)程序指令還包括指令用于響應(yīng)于遇上有效的探頭,間接引用對(duì)應(yīng)于有效探頭的編譯時(shí)間常數(shù),以確定所執(zhí)行的一個(gè)或多個(gè)線程中的任何一個(gè)是否為JMC單步步進(jìn)的;如果至少一個(gè)線程是JMC單步步進(jìn)的,則調(diào)用調(diào)試服務(wù)來(lái)確定該線程是否為JMC單步步進(jìn)的;和,響應(yīng)于確定該線程是JMC單步跳過(guò)確定所述線程是否接近于方法的結(jié)束端;和,響應(yīng)于確定,如果所述線程接近于方法的結(jié)束端,則將所述線程暫停在被執(zhí)行的下一個(gè)感興趣代碼的第一行處。
26.如權(quán)利要求19所述的計(jì)算機(jī)設(shè)備,其特征在于,所述計(jì)算機(jī)程序指令還包括適用于將所述感興趣代碼識(shí)別為所述編程結(jié)構(gòu)中的特殊結(jié)構(gòu)的指令。
27.一種適用于Just-My-Code代碼調(diào)試的計(jì)算機(jī)設(shè)備,該計(jì)算機(jī)設(shè)備包括用于自動(dòng)將調(diào)試探頭插入到表示感興趣代碼的各個(gè)編程結(jié)構(gòu)中,所述調(diào)試探頭在計(jì)算機(jī)的計(jì)算機(jī)程序編譯操作期間被插入,以產(chǎn)生原始代碼,所述程序結(jié)構(gòu)包括類(lèi)方法和/或靜態(tài)函數(shù)的裝置;和,用于作為一個(gè)進(jìn)程執(zhí)行原始代碼,該進(jìn)程包括在一個(gè)JMC單步操作期間自由運(yùn)行通過(guò)不感興趣代碼的執(zhí)行的一個(gè)或多個(gè)線程,在一個(gè)或多個(gè)線程中的一個(gè)線程只能在調(diào)試探頭的一個(gè)有效探頭被該線程遇上且該線程是以JMC單步通過(guò)該進(jìn)程時(shí)才可在感興趣的代碼中暫停的部件。
28.如權(quán)利要求27所述的計(jì)算機(jī)設(shè)備,其特征在于,所述JMC單步步進(jìn)的包括一個(gè)JMC單步進(jìn)入,一個(gè)JMC單步退出,或者一個(gè)JMC單步跳過(guò)的操作。
29.如權(quán)利要求27所述的計(jì)算機(jī)設(shè)備,其特征在于,還包括響應(yīng)于遇上有效的探頭,用于確定所執(zhí)行的一個(gè)或多個(gè)線程中的任何一個(gè)是否為JMC單步步進(jìn)的裝置;如果至少一個(gè)線程是JMC單步步進(jìn)的,則用于確定所述線程是否為JMC單步步進(jìn)的裝置;響應(yīng)于確定該線程是JMC單步步進(jìn)的,用于將該線程暫停在有效探頭之后一行代碼處的裝置;和,響應(yīng)于確定該線程不是JNC單步步進(jìn)的,用于不自動(dòng)暫停在所述感興趣代碼中的所述線程的裝置。
30.如權(quán)利要求27所述的計(jì)算機(jī)設(shè)備,其特征在于,還包括響應(yīng)于遇上有效的探頭,用于確定所執(zhí)行的一個(gè)或多個(gè)線程中的任何一個(gè)是否為JMC單步步進(jìn)的裝置;如果至少一個(gè)線程是JMC單步步進(jìn)的,則用于確定所述線程是否為JMC單步步進(jìn)的裝置;響應(yīng)于確定該線程是JMC單步進(jìn)入,用于將該線程暫停在緊接著對(duì)所述線程是JMC單步進(jìn)入的一個(gè)編程結(jié)構(gòu)的調(diào)用的之后一行代碼處的裝置。
31.如權(quán)利要求27所述的計(jì)算機(jī)設(shè)備,其特征在于,還包括響應(yīng)于遇上有效的探頭,用于確定所執(zhí)行的一個(gè)或多個(gè)線程中的任何一個(gè)是否為JMC單步步進(jìn)的裝置;如果至少一個(gè)線程是JMC單步步進(jìn)的,則用于確定該線程是否為JMC單步步進(jìn)的裝置;響應(yīng)于確定該線程是JMC單步退出用于將一個(gè)第一堆棧幀的一個(gè)返回地址識(shí)別為一個(gè)感興趣編程結(jié)構(gòu)的裝置;和,用于將該線程暫停在在所述返回地址上的裝置。
32.如權(quán)利要求27所述的計(jì)算機(jī)設(shè)備,其特征在于,還包括響應(yīng)于遇上有效的探頭,用于確定所執(zhí)行的一個(gè)或多個(gè)線程中的任何一個(gè)是否為JMC單步步進(jìn)的裝置;如果至少一個(gè)線程是JMC單步步進(jìn)的,則用于確定該線程是否為JMC單步步進(jìn)的裝置;和響應(yīng)于確定該線程是JMC單步跳過(guò)用于確定所述線程是否接近于方法的結(jié)束端的裝置;和,響應(yīng)于確定,如果所述線程接近于方法的結(jié)束端,則用于將所述線程暫停在被執(zhí)行的下一個(gè)感興趣代碼的第一行處的裝置。
33.如權(quán)利要求27所述的計(jì)算機(jī)設(shè)備,其特征在于,所述計(jì)算機(jī)設(shè)備還包括用于將所述感興趣代碼識(shí)別為所述編程結(jié)構(gòu)中的特殊結(jié)構(gòu)的裝置。
全文摘要
討論了用于Just-My-Code(JMC)調(diào)試的系統(tǒng)和方法。在一個(gè)方面,調(diào)試探頭可自動(dòng)插入在表示感興趣代碼的各個(gè)編程結(jié)構(gòu)中。調(diào)試探頭是在計(jì)算機(jī)產(chǎn)生原始代碼的計(jì)算機(jī)程序編譯操作的期間被插入的。隨后作為一個(gè)進(jìn)程來(lái)執(zhí)行原始代碼。該進(jìn)程可以包括在一個(gè)JMC單步操作期間自由運(yùn)行通過(guò)不感興趣代碼的執(zhí)行的一個(gè)或多個(gè)線程。只能在調(diào)試探頭的一個(gè)有效探頭被線程遇上且該線程是通過(guò)該線程的JMC單步步進(jìn)的時(shí),才能暫停一個(gè)或多個(gè)線程中的一個(gè)線程。
文檔編號(hào)G06F11/28GK1540517SQ20041003516
公開(kāi)日2004年10月27日 申請(qǐng)日期2004年4月21日 優(yōu)先權(quán)日2003年4月21日
發(fā)明者J·M·斯陶爾, M·M·馬格魯?shù)聽(tīng)? J M 斯陶爾, 馬格魯?shù)聽(tīng)?申請(qǐng)人:微軟公司
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
城口县| 谢通门县| 岑溪市| 宁津县| 莱阳市| 兴宁市| 奉化市| 云浮市| 安吉县| 长葛市| 微博| 五台县| 班戈县| 乾安县| 沙雅县| 黎川县| 通道| 措勤县| 万州区| 米脂县| 读书| 富民县| 天全县| 西宁市| 磐安县| 历史| 永丰县| 浑源县| 古浪县| 晋江市| 高要市| 洪江市| 呼和浩特市| 平阳县| 宜州市| 屯留县| 郑州市| 阳曲县| 宝丰县| 启东市| 德令哈市|