專利名稱:使用外部調(diào)試基礎(chǔ)結(jié)構(gòu)的進(jìn)程內(nèi)調(diào)試的制作方法
構(gòu)的進(jìn)程內(nèi)調(diào)試
扭旦 冃豕
在軟件被開發(fā)時(shí),軟件可能不像編程者預(yù)期的那樣工作??墒褂谜{(diào)試器來 分析程序的行為和/或來使用不同的執(zhí)行場(chǎng)景進(jìn)行實(shí)驗(yàn),這可以提供關(guān)于非預(yù)期 行為的來源的線索。
調(diào)試器可以是"進(jìn)程外"或"進(jìn)程內(nèi)"的。進(jìn)程外調(diào)試器是從正被調(diào)試的 程序(被調(diào)試程序)在其中執(zhí)行的進(jìn)程外部作用于該被調(diào)試程序的應(yīng)用程序。 被調(diào)試者向進(jìn)程外調(diào)試器展示檢査和控制模型,這提供了調(diào)試器可從中檢査被 調(diào)試程序的進(jìn)程并操縱該被調(diào)試程序的執(zhí)行的豐富接口 ?,F(xiàn)代執(zhí)行環(huán)境通常提 供便于實(shí)現(xiàn)進(jìn)程外調(diào)試器的基礎(chǔ)結(jié)構(gòu)。進(jìn)程內(nèi)調(diào)試器被內(nèi)置到其中開發(fā)代碼的 開發(fā)軟件中。例如,命令行語言解釋器可以具有被硬編碼到該解釋器中的調(diào)試 命令,以使該調(diào)試命令可從該解釋器的命令行界面來訪問。
進(jìn)程內(nèi)調(diào)試器提供簡(jiǎn)單的用戶體驗(yàn),這表現(xiàn)在用戶可通過一個(gè)用戶界面在 一個(gè)進(jìn)程中編寫并調(diào)試代碼,且調(diào)試支持與執(zhí)行環(huán)境集成在一起。另一方面, 進(jìn)程外調(diào)試器使用若干執(zhí)行環(huán)境提供來支持進(jìn)程外模型的調(diào)試基礎(chǔ)結(jié)構(gòu)。提供 進(jìn)程內(nèi)用戶體驗(yàn)的調(diào)試器未利用此基礎(chǔ)結(jié)構(gòu)。
概述
進(jìn)程內(nèi)調(diào)試用戶體驗(yàn)可使用支持進(jìn)程外調(diào)試的調(diào)試基礎(chǔ)結(jié)構(gòu)來實(shí)現(xiàn)。提供 用于各種調(diào)試任務(wù)(例如,檢查符號(hào)、設(shè)置斷點(diǎn)等)的命令的調(diào)試模塊可被加 載到諸如針對(duì)一語言的命令行解釋器等開發(fā)程序中。該調(diào)試模塊使用在與開發(fā) 程序分開的進(jìn)程中運(yùn)行的助手程序。該助手程序作為進(jìn)程外調(diào)試器附連到開發(fā) 程序在其中運(yùn)行的進(jìn)程。從開發(fā)程序在其中運(yùn)行的進(jìn)程的角度來看,該助手進(jìn)
程就像進(jìn)程外調(diào)試器一樣,且該助手進(jìn)程因此能夠利用進(jìn)程外調(diào)試器會(huì)用來檢 査并操縱被調(diào)試程序的調(diào)試基礎(chǔ)結(jié)構(gòu)。在用戶通過由調(diào)試模塊所提供的功能中 的一個(gè)來發(fā)出調(diào)試命令時(shí),該模塊中的代碼訪問助手進(jìn)程用以協(xié)助實(shí)現(xiàn)所請(qǐng)求的命令。例如,如果用戶發(fā)出設(shè)置斷點(diǎn)的命令,則調(diào)試模塊訪問助手進(jìn)程以使 用來自調(diào)試基礎(chǔ)結(jié)構(gòu)的原語來設(shè)置該斷點(diǎn)。
開發(fā)程序可以提供接收并處理用戶輸入的讀取一求值一打印循環(huán)(REPL
循環(huán))。可被輸入的用戶輸入的一個(gè)示例是調(diào)用要被調(diào)試的程序的命令。當(dāng)在
程序中發(fā)生調(diào)試事件時(shí),助手程序被通知并調(diào)用開發(fā)程序中的REPL循環(huán)的第 二實(shí)例。將該循環(huán)壓入被調(diào)試程序的框架之上的執(zhí)行棧,這保留了被調(diào)試程序 的狀態(tài)以供檢査和操縱。此外,REPL循環(huán)的第二實(shí)例提供用戶可用于繼續(xù)錄 入輸入并與開發(fā)程序交互的機(jī)制。REPL循環(huán)的第二實(shí)例可通過調(diào)試基礎(chǔ)結(jié)構(gòu) 的諸如函數(shù)求值(func-eval)原語等原語、或調(diào)試器可用于調(diào)用被調(diào)試程序中 的函數(shù)的其它機(jī)制來調(diào)用。
提供本概述是為了以簡(jiǎn)化的形式介紹將在以下詳細(xì)描述中進(jìn)一步描述的 一些概念。本發(fā)明內(nèi)容并不旨在標(biāo)識(shí)出所要求保護(hù)的主題的關(guān)鍵特征或必要特 征,也不旨在用于限定所要求保護(hù)的主題的范圍。
附圖簡(jiǎn)述
圖1是其中可以發(fā)生軟件開發(fā)的執(zhí)行環(huán)境的框圖。
圖2是使用具有陰影外部助手進(jìn)程的進(jìn)程內(nèi)調(diào)試器的過程的流程圖。
圖3是可使用調(diào)試器執(zhí)行的各種動(dòng)作的流程圖。
圖4是示例程序的框圖。
圖5是從調(diào)試器繼續(xù)執(zhí)行程序的過程的流程圖。
圖6是解析符號(hào)名稱的過程的流程圖。
圖7是可用于實(shí)現(xiàn)此處所述的主題的各組件的框圖。
詳細(xì)描述 概覽
進(jìn)程內(nèi)調(diào)試通常提供簡(jiǎn)單的用戶體驗(yàn)用戶可從用于輸入并執(zhí)行代碼的同 一命令行界面來輸入調(diào)試命令。進(jìn)程內(nèi)調(diào)試一般通過將調(diào)試命令或要由調(diào)試功 能所使用的掛鉤硬編碼到實(shí)現(xiàn)命令行處理器的軟件中來實(shí)現(xiàn)。現(xiàn)代執(zhí)行環(huán)境通 常提供可用于實(shí)現(xiàn)進(jìn)程外調(diào)試器的調(diào)試基礎(chǔ)結(jié)構(gòu),且進(jìn)程內(nèi)調(diào)試的實(shí)現(xiàn)一般不利用此現(xiàn)有基礎(chǔ)結(jié)構(gòu)(盡管提供進(jìn)程內(nèi)調(diào)試的系統(tǒng)可能具有其自己的調(diào)試基礎(chǔ) 結(jié)構(gòu))。然而,使用支持進(jìn)程外調(diào)試的基礎(chǔ)結(jié)構(gòu)來實(shí)現(xiàn)進(jìn)程內(nèi)調(diào)試體驗(yàn)是可能 的。
在進(jìn)程外調(diào)試中,調(diào)試器可以是駐留在與正被調(diào)試的程序(被調(diào)試程序) 分開的進(jìn)程中的應(yīng)用程序。因此,進(jìn)程外調(diào)試應(yīng)用程序從外部角度來査看被調(diào) 試程序,且它能夠從被調(diào)試程序的進(jìn)程之外來檢査并操縱該被調(diào)試程序。許多 執(zhí)行環(huán)境所提供的調(diào)試基礎(chǔ)結(jié)構(gòu)可基于調(diào)試器應(yīng)用程序具有此外部角度的假 設(shè)來設(shè)計(jì),這使得使用此類基礎(chǔ)結(jié)構(gòu)來實(shí)現(xiàn)進(jìn)程內(nèi)調(diào)試更復(fù)雜。
為使用該調(diào)試基礎(chǔ)結(jié)構(gòu)來實(shí)現(xiàn)進(jìn)程內(nèi)調(diào)試體驗(yàn),創(chuàng)建一種在與被調(diào)試程序 分開的進(jìn)程中運(yùn)行的助手程序。該助手程序如同其是進(jìn)程外調(diào)試器那樣附連到 被調(diào)試程序的進(jìn)程,且使用相關(guān)環(huán)境的調(diào)試基礎(chǔ)結(jié)構(gòu)來檢査并操縱該被調(diào)試程 序。被加載到被調(diào)試程序運(yùn)行于其中的進(jìn)程中的調(diào)試模塊提供可由用戶調(diào)用的 調(diào)試命令。這些命令使用助手進(jìn)程來執(zhí)行各動(dòng)作中的一部分。例如,如果用戶 指示檢査符號(hào)、設(shè)置斷點(diǎn)等,則調(diào)試模塊可訪問助手進(jìn)程來使用調(diào)試基礎(chǔ)結(jié)構(gòu) 的原語以檢査符號(hào)、設(shè)置斷點(diǎn)等。
命令行處理器通過REPL循環(huán)來接收并處理用戶輸入。在命令行處理器被
啟動(dòng)時(shí),調(diào)用實(shí)現(xiàn)REPL循環(huán)的函數(shù)來創(chuàng)建REPL循環(huán)的實(shí)例。在要被調(diào)試的 程序被啟動(dòng)時(shí)(例如,通過將其名稱作為輸入來輸入到REPL循環(huán)),該程序 被壓入棧中,從而將REPL循環(huán)作為當(dāng)前框架移動(dòng)。如果被調(diào)試的程序引發(fā)異 常,則用戶可能希望將調(diào)試命令輸入到命令行界面——例如,輸入到REPL循 環(huán)的輸入階段中。返回到REPL循環(huán)的現(xiàn)有實(shí)例會(huì)將被調(diào)試的程序彈出棧,進(jìn) 而丟失此程序的狀態(tài)。所以,助手進(jìn)程在得到異常的通知時(shí)使用諸如函數(shù)求值 等調(diào)試原語來啟動(dòng)REPL循環(huán)的第二實(shí)例。用戶隨后可以將調(diào)試命令輸入到 REPL循環(huán)的第二實(shí)例中,同時(shí)被調(diào)試的程序的狀態(tài)可被保留在棧上以供檢查 和操縱。
其中可發(fā)生軟件開發(fā)的示例執(zhí)行環(huán)境
圖1是其中可以發(fā)生軟件開發(fā)的示例執(zhí)行環(huán)境的框圖。環(huán)境100提供可用 于開發(fā)并執(zhí)行軟件的基礎(chǔ)結(jié)構(gòu)。此基礎(chǔ)結(jié)構(gòu)可提供諸如面相對(duì)象編程模型、虛擬機(jī)和相關(guān)聯(lián)的虛擬機(jī)語言、動(dòng)態(tài)鏈接、無用信息收集等各種特征。提供如同
環(huán)境100的執(zhí)行環(huán)境的系統(tǒng)的示例是微軟.NET、 Java、各種操作系統(tǒng)等。
執(zhí)行環(huán)境可提供調(diào)試基礎(chǔ)結(jié)構(gòu)102。調(diào)試基礎(chǔ)結(jié)構(gòu)102通常被設(shè)計(jì)成便于 使用進(jìn)程外模型來調(diào)試。g卩,要被調(diào)試的程序(被調(diào)試程序)可使用特定調(diào)試 符號(hào)和其它信息來插裝(instrument)。調(diào)試基礎(chǔ)結(jié)構(gòu)102能夠通過此類插裝來 與被調(diào)試程序交互。因此,調(diào)試器應(yīng)用程序可使用調(diào)試基礎(chǔ)結(jié)構(gòu)102來檢査并 控制被調(diào)試程序。調(diào)試器應(yīng)用程序和被調(diào)試程序可在分開的進(jìn)程中運(yùn)行。調(diào)試 基礎(chǔ)結(jié)構(gòu)102提供允許調(diào)試器應(yīng)用程序檢査并控制被調(diào)試程序的豐富的檢査和 流程控制模型。例如,調(diào)試基礎(chǔ)結(jié)構(gòu)102可包括檢査被調(diào)試程序中的符號(hào)、設(shè) 置斷點(diǎn)、啟動(dòng)和/或停止被調(diào)試程序、執(zhí)行被調(diào)試程序中的任意選擇的函數(shù)、檢 査棧、將在被調(diào)試程序中引發(fā)的特定事件和/或異常通知給調(diào)試器等功能。應(yīng)該 注意,調(diào)試動(dòng)作可被寬松地表征為那些提供信息的動(dòng)作(例如,符號(hào)的檢査、 棧的檢査等)、以及那些控制程序的流程的動(dòng)作(例如,繼續(xù)執(zhí)行、設(shè)置下一 語句等)。調(diào)試基礎(chǔ)結(jié)構(gòu)102可提供方法104,且可定義數(shù)據(jù)結(jié)構(gòu)106和調(diào)試 事件108,它們可由調(diào)試器應(yīng)用程序使用來檢査和控制被調(diào)試程序。這些項(xiàng)目 可被稱為調(diào)試原語。(可取決于被執(zhí)行的調(diào)試函數(shù)來使用不同的調(diào)試原語一 例如, 一個(gè)原語可用于執(zhí)行任意函數(shù),而另一原語可用于設(shè)置斷點(diǎn)。)調(diào)試器 應(yīng)用程序的典型實(shí)現(xiàn)利用了調(diào)試基礎(chǔ)結(jié)構(gòu)102的這些特征。
開發(fā)軟件101是可在執(zhí)行環(huán)境100中的進(jìn)程112內(nèi)執(zhí)行的程序。進(jìn)程112 是可由操作系統(tǒng)或其它組件提供的構(gòu)造,且通常具有其自己的棧、虛擬地址空 間等。開發(fā)軟件110允許編程者開發(fā)并執(zhí)行代碼。開發(fā)軟件110可采用諸如Iron Python等命令行解釋器的形式和/或包括此類命令行解釋器。開發(fā)軟件112的 其它示例包括Java解釋器、Perl解釋器、各種Unix/Linux外殼(例如,Bourne 外殼、C外殼、Z外殼等)。然而,應(yīng)該理解,此處所述的主題不限于像命令 行的語言的解釋器、或解釋語言。
開發(fā)軟件110通常包括實(shí)現(xiàn)一般被稱為REPL循環(huán)的讀取一求值一打印循 環(huán)的功能。顧名思義,該讀取一求值一打印循環(huán)讀取用戶輸入、對(duì)該輸入求值、 并基于該輸入打印(或以其它方式來顯示)結(jié)果。在開發(fā)軟件110啟動(dòng)時(shí),其 通常調(diào)用REPL循環(huán)的實(shí)例114以接收來自用戶120的輸入116,并向用戶120提供輸出118。例如,輸入116可包括諸如函數(shù)定義、函數(shù)調(diào)用、加載模塊的 指令等代碼行。輸出118可包括由執(zhí)行函數(shù)所得的輸出、錯(cuò)誤消息等。
程序122包括可在開發(fā)軟件110內(nèi)執(zhí)行且可進(jìn)行調(diào)試的程序代碼。程序 122可采用整個(gè)程序,或諸如函數(shù)定義、模塊定義等程序的一部分的形式???將程序122作為輸入116來提供給REPL循環(huán)的實(shí)例114。例如,如果開發(fā)軟 件110是Iron Python解釋器,則用戶120可將以下代碼作為對(duì)REPL循環(huán)的實(shí)
例114的輸入來輸入
*〉 def divBySequence(N,x): … if x < 0 : return N ...result = N/x
...return divBySequence(result, x-1)
承>
如上所述,由于其中它除以零的情況,函數(shù)divBySequence的此定義可以生成 異常,但是這僅是程序122的一示例。除了其中程序122被鍵入到REPL循環(huán) 的實(shí)例114中的上述示例之外,程序122可以用其它方式提供給開發(fā)軟件110, 如從存儲(chǔ)的文件加載模塊、從網(wǎng)絡(luò)下載程序122等。
開發(fā)軟件110內(nèi)的調(diào)試可由兩段軟件來促進(jìn)——調(diào)試模塊124和助手程序 126—它們可以彼此交互以在開發(fā)軟件110中創(chuàng)建調(diào)試體驗(yàn)。(線136表示 調(diào)試模塊124與助手程序126之間的交互,且此交互如下所述可采用各種形 式。)
調(diào)試模塊124提供可被加載到開發(fā)軟件110中的調(diào)試功能。例如,在其中 開發(fā)軟件l 10是Iron Python解釋器的示例中,用戶可發(fā)出諸如"導(dǎo)入調(diào)試器" 等命令(例如,通過將此類命令鍵入到由REPL循環(huán)的實(shí)例114所提供的提示 中),這使得調(diào)試模塊124被加載到開發(fā)軟件110在其中運(yùn)行的進(jìn)程112中。 調(diào)試模塊124可展示用戶可調(diào)用來執(zhí)行各種調(diào)試動(dòng)作(例如,符號(hào)的檢査、棧 的檢査、繼續(xù)程序執(zhí)行等)的函數(shù)。通過將調(diào)試模塊124加載到進(jìn)程112中, 開發(fā)軟件110的用戶能夠調(diào)用這些函數(shù)。例如,為了檢査棧,用戶可以調(diào)用具 有如 "debugger.where()" 的命令的函數(shù)或方法。諸如 "debugger.CatchExceptions()"(指示調(diào)試器在引發(fā)異常時(shí)停止)、 "debugger.show()"(列出當(dāng)前函數(shù))、"debugger.continue()"(在程序停止
11之后繼續(xù)該程序的執(zhí)行)等其它命令可由調(diào)試模塊124來提供。
助手程序126在進(jìn)程128中執(zhí)行。助手程序126提供可由調(diào)試模塊124 使用的一種后端功能。由于調(diào)試基礎(chǔ)結(jié)構(gòu)102服從其中調(diào)試應(yīng)用程序位于與被 調(diào)試程序分開的進(jìn)程中的模型,所以助手程序126提供此進(jìn)程外角度。因此, 如同典型的進(jìn)程外調(diào)試器會(huì)做的那樣,助手程序能夠檢査進(jìn)程112的各方面(例 如,棧、符號(hào)等),且可以控制進(jìn)程112的流程(例如,通過設(shè)置斷點(diǎn)、跳轉(zhuǎn) 到任意語句、執(zhí)行任意函數(shù)等)。盡管典型的進(jìn)程外調(diào)試器可以是與用戶直接 交互的控制臺(tái)應(yīng)用程序,但是助手程序126可以與調(diào)試模塊124交互,而調(diào)試 模塊124進(jìn)而與用戶交互。此安排允許用戶從開發(fā)軟件IIO提供的用戶界面調(diào) 試,而不是從單獨(dú)的調(diào)試器應(yīng)用程序調(diào)試。(然而,此處所述的主題不限于其 中助手程序126避免與用戶的交互的情況。助手程序126可參加與用戶的交 互。)
助手程序126、調(diào)試模塊124、以及進(jìn)程112和128可彼此交互。例如, 調(diào)試基礎(chǔ)結(jié)構(gòu)102如上所述地定義可被傳送到調(diào)試器的、關(guān)于該調(diào)試器所附連 到的進(jìn)程的特定調(diào)試事件108 (例如,棧操作、函數(shù)的開始或結(jié)束、異常等)。 在助手程序126附連到進(jìn)程112時(shí),隨后助手程序126接收此類調(diào)試事件108 的通知。此外,調(diào)試模塊124可向助手程序126發(fā)送各種通信130,且助手程 序126可向調(diào)試模塊124和/或進(jìn)程112提供信息和/或指令132。(由項(xiàng)目108、 130以及132表示的通信是調(diào)試模塊124與助手程序126之間的交互的示例, 由線136來表示。此交互可通過任何機(jī)制來發(fā)生,如通過調(diào)試基礎(chǔ)結(jié)構(gòu)102。) 例如,如果用戶120通過調(diào)試模塊124請(qǐng)求檢査名為"x"的符號(hào),則調(diào)試模 塊124可向助手程序126發(fā)送通信130以請(qǐng)求助手程序126檢査進(jìn)程112的棧 上名為"x"的符號(hào)。助手程序126可隨后使用由調(diào)試基礎(chǔ)結(jié)構(gòu)102所提供的 方法104來檢査進(jìn)程112的棧上的"x"的值,且可以隨后將符號(hào)x的值寫入 進(jìn)程112內(nèi)的數(shù)據(jù)位置中,調(diào)試模塊124可以在該數(shù)據(jù)位置取回該值并將其提 供給用戶120。作為另一示例,用戶120可以使用調(diào)試模塊124中的函數(shù)來請(qǐng) 求設(shè)置斷點(diǎn),其中調(diào)試模塊124可以向助手程序126傳送所請(qǐng)求的斷點(diǎn),且助 手程序126可以使用方法104來設(shè)置該斷點(diǎn)。以下詳細(xì)描述調(diào)試模塊124、助 手程序126、以及進(jìn)程128和112之間的各種類型的交互??捎芍殖绦?26所采取的一個(gè)動(dòng)作是在進(jìn)程112中啟動(dòng)REPL循環(huán)的第 二實(shí)例134。例如,如果程序正在執(zhí)行,則該程序可能引發(fā)停止該程序的異常。 例如,如果對(duì)上文所述的divByS叫uence函數(shù)的調(diào)用導(dǎo)致除以零,則該 divBySequence函數(shù)可以引發(fā)異常。該異常是可向諸如助手程序126等附連的 調(diào)試器通知的調(diào)試事件的示例。在助手程序126收到該異常的通知時(shí),助手程 序126可使用方法104中的一個(gè)(例如,.NET環(huán)境的"函數(shù)求值"原語)來 在進(jìn)程112中調(diào)用REPL循環(huán)的第二實(shí)例134。如以下更詳細(xì)描述的,REPL 循環(huán)的第一實(shí)例114在棧上相對(duì)高;在棧的更下方的是程序122 (諸如 divBySequence函數(shù)),該程序122已經(jīng)被用戶異常停止。(對(duì)于上述示例中 的棧,短語"高"和"更下方"指的是其中棧向下增長(zhǎng)的示例,但此處所述的 主題不限于任何特定的棧增長(zhǎng)方向。)因此,REPL循環(huán)的第一實(shí)例114可能 無法用于用戶輸入(例如,它可能無法用于讓用戶輸入由調(diào)試模塊124所提供 的調(diào)試命令)。通過啟動(dòng)REPL循環(huán)的第二實(shí)例134,用戶可以與開發(fā)軟件110 交互以輸入調(diào)試命令、編輯程序代碼等。此外,在創(chuàng)建REPL循環(huán)的第二實(shí)例 134時(shí),被調(diào)試的程序122的狀態(tài)被保留,并因此可由助手程序126來檢查和 操縱。隨著調(diào)試的進(jìn)展,用戶可以從REPL循環(huán)的實(shí)例134繼續(xù)程序122的執(zhí) 行,這可能導(dǎo)致引發(fā)其它異常。在引發(fā)此類異常時(shí),助手程序126可以創(chuàng)建 REPL循環(huán)的其它實(shí)例以允許用戶繼續(xù)與開發(fā)軟件110交互。因此,在調(diào)試會(huì) 話已經(jīng)進(jìn)行了一些時(shí)間時(shí),進(jìn)程112的棧上可以存在REPL循環(huán)的若干實(shí)例。
因此,調(diào)試模塊124向用戶提供來自開發(fā)軟件110的用戶界面內(nèi)部的調(diào)試 體驗(yàn),且助手程序126提供利用調(diào)試基礎(chǔ)結(jié)構(gòu)102的檢査和控制特征的進(jìn)程外 角度。調(diào)試模塊124與助手程序126之間的通信允許調(diào)試模塊124利用與進(jìn)程 外調(diào)試器程序一起工作的調(diào)試基礎(chǔ)結(jié)構(gòu)的特征,且還允許助手程序126利用調(diào) 試模塊124的能力來從開發(fā)軟件110的用戶界面內(nèi)與用戶交互。
通過第二 REPL循環(huán)對(duì)調(diào)試模塊的使用
圖2示出調(diào)試的示例過程,且還示出如何在調(diào)試中使用REPL循環(huán)的第二 實(shí)例。圖2的過程以及此處所示的其它示例過程參考圖1中所示的各組件來描 述,但也可用于其它系統(tǒng)中。此外,盡管圖2和此處的其它流程圖使用箭頭來顯示流程從一個(gè)框向另一個(gè)進(jìn)行,但是所示出的流程僅為示例,且所示出的各 動(dòng)作可以按任何次序并以任何組合或子組合來執(zhí)行。此外,某些動(dòng)作被示為由 特定進(jìn)程來執(zhí)行(如通過將這些動(dòng)作包括在表示進(jìn)程112或128的框內(nèi)所示), 但是此處的主題不限于其中動(dòng)作由任何特定進(jìn)程來執(zhí)行的情況。
棧202是進(jìn)程112的棧,且作為示例被表示為向下增長(zhǎng)。(箭頭201顯示 此示例中的棧增長(zhǎng)方向。)REPL循環(huán)114的實(shí)例114在開發(fā)軟件110 (圖1 中示出)被啟動(dòng)之后的某個(gè)時(shí)刻被實(shí)例化。此外,可將調(diào)試模塊124 (圖1中 示出)加載到進(jìn)程112,這使得其調(diào)試功能對(duì)用戶可用。在某一時(shí)間點(diǎn),REPL 循環(huán)的實(shí)例114接收用戶輸入(在206)。此用戶輸入可標(biāo)識(shí)要調(diào)用的程序(例 如,通過鍵入要執(zhí)行的函數(shù)的名稱),在此情況下在用戶輸入中所標(biāo)識(shí)的程序 被調(diào)用(在208)。在棧上創(chuàng)建用于程序的框架204。在程序被調(diào)用之后,該 程序可能引發(fā)異常(在210)。例如,作為程序的示例的上文所述的 divBySequence函數(shù)可導(dǎo)致除以零,這引發(fā)異常。
助手程序126 (圖1中示出)在進(jìn)程128中執(zhí)行。在助手程序126作為調(diào) 試器附連到進(jìn)程112的情況下,助手程序126接收(在214)在進(jìn)程112中引 發(fā)的異常的通知212。助手程序126使用調(diào)試方法來調(diào)用REPL循環(huán)的新實(shí)例 134 (在216)。該調(diào)試方法可以是方法104中的一個(gè)(圖1中示出)??墒褂?的方法的一個(gè)示例是在.NET環(huán)境中提供的"函數(shù)求值"調(diào)試原語,其允許調(diào) 試器調(diào)用被調(diào)試程序中的任意函數(shù)。應(yīng)該理解,除.NET之外的系統(tǒng)也可提供 從調(diào)試器調(diào)用任意函數(shù)的功能,且對(duì)函數(shù)求值的引用不應(yīng)被理解為限于.NET 環(huán)境的函數(shù)求值原語,或限于具有該名稱的方法,而是還涵蓋允許調(diào)試器調(diào)用 被調(diào)試進(jìn)程中的函數(shù)的其它系統(tǒng)的方法。在調(diào)用REPL循環(huán)的新實(shí)例134時(shí), 將用于該新實(shí)例134的框架置于桟上。
在REPL循環(huán)的新實(shí)例134被啟動(dòng)時(shí),它能夠例如通過命令行界面來接收 來自用戶的輸入或其它指令(在218)??杀唤邮盏囊活愔噶钍怯烧{(diào)試模塊124 所提供的調(diào)試命令。例如,用戶可以調(diào)用由調(diào)試模塊124所提供的函數(shù)以檢査 棧、檢查符號(hào)的值等。在提供此類指令時(shí),基于指令的信息220被傳送到進(jìn)程 128,這通知了助手程序126用戶想要執(zhí)行哪種類型的調(diào)試動(dòng)作。助手程序126 執(zhí)行指令中指定的動(dòng)作(在222)——如通過使用調(diào)試基礎(chǔ)結(jié)構(gòu)102 (圖1中示出)來檢査符號(hào)、檢査棧、設(shè)置斷點(diǎn)等。此類動(dòng)作的某些示例在以下結(jié)合圖 3來討論。
在222執(zhí)行的動(dòng)作可以使得指令224和/或信息226從進(jìn)程128提供給進(jìn) 程112。例如,如果在222執(zhí)行的動(dòng)作是符號(hào)的值的檢査,則助手程序126可 以提供包括該符號(hào)的值的信息224。例如,助手程序126可使用調(diào)試基礎(chǔ)結(jié)構(gòu) 102來將此信息寫入到進(jìn)程112的地址空間中的位置,在該位置該信息可由調(diào) 試模塊124來取回。作為另一示例,如果在222執(zhí)行的動(dòng)作是被調(diào)試程序(例 如,程序122,圖1中示出)的繼續(xù),則助手程序126可使用調(diào)試基礎(chǔ)結(jié)構(gòu)102 來向進(jìn)程112發(fā)出將棧展開到程序的框架204、清除待決異常、以及隨后在其 中引發(fā)異常的點(diǎn)繼續(xù)執(zhí)行該程序的指令226。信息224和/或指令226由進(jìn)程112 從進(jìn)程128接收(在228)。進(jìn)程112隨后根據(jù)這些指令來動(dòng)作(在230)和/ 或可顯示所接收到的信息(在232)。例如,在其中用戶請(qǐng)求檢査符號(hào)的情況 下,其中該符號(hào)的當(dāng)前值可被顯示,可在232執(zhí)行信息的顯示。作為另一示例, 如果已經(jīng)指示進(jìn)程112以某種方式來動(dòng)作(例如,在230),如以控制程序122 中的流程的方式,則可在施加了此類流程控制之后顯示執(zhí)行程序122的結(jié)果。 該流程隨后循環(huán)到REPL循環(huán)的實(shí)例134的輸入階段以接收更多來自用戶的輸 入。
圖3示出可使用調(diào)試器來執(zhí)行的各種動(dòng)作。圖3示出其中執(zhí)行指定的動(dòng)作 的框222 (來自圖2)。圖3示出可在222執(zhí)行的動(dòng)作的各種示例。圖3所示 的動(dòng)作可以例如由助手程序126 (圖1中示出)來執(zhí)行,且可以涉及來自被調(diào) 試進(jìn)程112和/或調(diào)試模塊124 (都在圖1中示出)的協(xié)作。
圖3的各動(dòng)作以下參考圖4中的示例程序400來描述。程序400包括局部 變量402、以及可用作作為以下所述的機(jī)制的一部分的返回值的一個(gè)或多個(gè)局 部變量404的聲明。此外,程序400包括語句406、 408、 410、 412和414、以 及返回語句416。程序400僅是程序的一個(gè)示例,且其它程序可包含不同數(shù)量 的語句、更多(或更少)的變量聲明、分支、條件、其它返回語句等。
返回到圖3,可被執(zhí)行的動(dòng)作的一個(gè)示例是設(shè)置斷點(diǎn)(在302)。例如, 用戶可通過調(diào)試模塊124 (圖1中示出)的函數(shù)來指定斷點(diǎn),且此指定可被傳 送到助手程序126 (圖1中示出)。調(diào)試基礎(chǔ)結(jié)構(gòu)102 (圖1中示出)可包括
15在被調(diào)試程序中設(shè)置斷點(diǎn)的原語。如果在程序400中的語句410處設(shè)置斷點(diǎn), 則程序400停止執(zhí)行,且在到達(dá)語句410時(shí)生成調(diào)試事件。
另一示例動(dòng)作是從具有用戶指定的返回值的函數(shù)返回(在304)。例如, 如果函數(shù)引發(fā)異常,則用戶可以選擇不讓該函數(shù)繼續(xù)執(zhí)行,而是選擇為該函數(shù) 指定返回值并隨后使得程序的其余部分如同該函數(shù)已經(jīng)完成執(zhí)行且已經(jīng)返回 了指定值那樣繼續(xù)。此動(dòng)作可通過將指定值寫入其中一般會(huì)找到返回值之處 (例如,在棧上的指定位置、在指定寄存器中等),并且對(duì)程序的插裝從函數(shù) 退出的點(diǎn)繼續(xù)。實(shí)現(xiàn)設(shè)置返回值的能力的一種方式是對(duì)被調(diào)試程序進(jìn)行插裝以 包括一個(gè)或多個(gè)局部變量404 (其可由調(diào)試器使用,但可對(duì)被調(diào)試程序本身隱 藏)。要由用戶設(shè)置的返回值可被寫入局部變量404中,且隨后可將指令指針 更新成指向返回指令416,以便在程序繼續(xù)執(zhí)行時(shí)該函數(shù)返回局部變量404中 的值。
另一示例動(dòng)作是設(shè)置要執(zhí)行的下一語句(在306)。例如,程序400在其 為調(diào)試事件停止時(shí)可能正在執(zhí)行語句408。在序列中將執(zhí)行的下一語句是語句 410,但是用戶可以指定應(yīng)該被執(zhí)行的下一語句是語句414。由調(diào)試基礎(chǔ)結(jié)構(gòu) 102 (圖1中示出)所提供的原語可用于設(shè)置程序計(jì)數(shù)器以指向?qū)?yīng)于語句414 的開始的指令。
另一示例動(dòng)作是步進(jìn)通過接下來的n個(gè)語句——即,執(zhí)行n個(gè)語句并隨后 停止(在308)。此處所述的整個(gè)技術(shù)在進(jìn)程外調(diào)試之上構(gòu)建進(jìn)程內(nèi)調(diào)試,且 可以直接利用進(jìn)程外技術(shù)。因此,如進(jìn)程外調(diào)試器會(huì)做的那樣,從用戶處接收 的步進(jìn)通過n個(gè)語句的指令可通過開發(fā)軟件請(qǐng)求(例如,通過調(diào)試模塊124, 圖1中示出)助手程序126 (圖1中示出)使用步進(jìn)原語來步進(jìn)通過n個(gè)語句 來實(shí)現(xiàn)。
另一示例動(dòng)作是中止調(diào)試(動(dòng)作310)——如,返回到頂層REPL循環(huán)并 停止使得異常調(diào)用調(diào)試器。在調(diào)試的過程期間,可能已創(chuàng)建了REPL循環(huán)的若 干實(shí)例,這些實(shí)例中的每一個(gè)都可能是由異常創(chuàng)建的。對(duì)應(yīng)的調(diào)試模塊命令可 以調(diào)用異常,這會(huì)自然地使得棧展開。因此,隨著棧被展開以移除REPL循環(huán) 的各個(gè)嵌套實(shí)例,附連的調(diào)試器(例如,助手進(jìn)程126,圖l中示出)可被指 示在展開過程期間不向用戶通知異常(在312)——例如,直到到達(dá)棧上對(duì)應(yīng)于REPL循環(huán)的第一實(shí)例(標(biāo)號(hào)114,圖l中示出)的框架。
程序的繼續(xù)執(zhí)行
程序的繼續(xù)執(zhí)行是調(diào)試動(dòng)作的示例,且圖5示出繼續(xù)執(zhí)行的示例過程。在 此示例中,棧202在各動(dòng)作的旁邊示出,并示出對(duì)各動(dòng)作中的每一個(gè)哪個(gè)框架 是當(dāng)前的。(箭頭501表示該棧增長(zhǎng)的方向。)
REPL循環(huán)的實(shí)例134向用戶呈現(xiàn)輸入指令或其它輸入的提示。REPL循 環(huán)的實(shí)例134隨后在502從用戶接收繼續(xù)執(zhí)行被調(diào)試程序(例如,圖1中示出 的程序122)的請(qǐng)求。例如,用戶可發(fā)出由調(diào)試模塊124 (圖1中示出)所展 示的函數(shù),如"debugger.continue()"?;诖苏?qǐng)求,調(diào)試模塊124 (在504) 從助手程序126 (圖1中示出)請(qǐng)求程序122的繼續(xù)。作為對(duì)助手程序126的 請(qǐng)求的一部分,調(diào)試模塊124通知助手忽略待決異常。例如,使得助手程序126 創(chuàng)建REPL循環(huán)的實(shí)例134的異??梢栽谟脩粽?qǐng)求繼續(xù)時(shí)保持待決,且通知助 手程序126它可以清除此類異常,這可以防止此異常進(jìn)一步影響程序122 (圖 1中示出)的執(zhí)行流。在506,退出REPL循環(huán)的實(shí)例134,且向助手程序在其 中執(zhí)行的進(jìn)程128通知此退出。
在508,助手程序126允許程序(例如,程序122)繼續(xù)執(zhí)行。在510, 忽略在程序122中待決的異常。程序122隨后繼續(xù)在進(jìn)程112中執(zhí)行(在512)。 在已經(jīng)退出REPL循環(huán)的實(shí)例134的情況下,從棧202中移除其框架以便在程 序122繼續(xù)執(zhí)行時(shí)當(dāng)前框架是用于程序122的框架204。(作為參考,結(jié)合以 上各附圖來解釋的REPL循環(huán)實(shí)例114的位置也在棧202上示出。)
符號(hào)解析
圖6示出解析符號(hào)名稱的示例過程。例如,用戶可使用調(diào)試模塊124 (圖 1中示出)中的函數(shù)來請(qǐng)求具有特定名稱的符號(hào)的值。作為另一示例,通過REPL 循環(huán)的普通符號(hào)解析句法來訪問的邏輯(例如,在符號(hào)名稱被鍵入REPL循環(huán) 的提示時(shí)顯示該符號(hào)的值的邏輯)可通過掛鉤來擴(kuò)充或修改以允許根據(jù)圖6所 示的邏輯來進(jìn)行符號(hào)的解析,而不是使用調(diào)試模塊124中的顯函數(shù)。調(diào)試模塊 124和/或REPL循環(huán)實(shí)例134以及助手程序126 (圖1中示出)可使用圖6所示的過程來解析符號(hào)名稱。在圖6的示例中,棧202在各動(dòng)作的旁邊示出以示 出對(duì)各動(dòng)作中的每一個(gè)哪個(gè)框架是當(dāng)前的。來自圖2和5的框架的位 置——REPL循環(huán)實(shí)例114和134以及程序框架204——在棧202上示出。(箭 頭601表示該棧增長(zhǎng)的方向。)
在602,用戶請(qǐng)求關(guān)于符號(hào)的信息。此請(qǐng)求可以例如通過使用REPL循環(huán) 的實(shí)例134來調(diào)用由調(diào)試模塊124所提供的函數(shù)來作出。(例如,可使用諸如 debugger.examine( "x")等函數(shù)調(diào)用來請(qǐng)求名為"x"的符號(hào)的檢查)。作為另 一示例,用戶可以使用REPL循環(huán)的用于請(qǐng)求符號(hào)值的普通句法來請(qǐng)求符號(hào)的 值——如通過將"x"鍵入REPL循環(huán)的提示。如以下所討論的,圖6的過程 的各方面可被實(shí)現(xiàn)為由調(diào)試模塊124所提供的函數(shù),或通過擴(kuò)充REPL循環(huán)實(shí) 例134的符號(hào)解析機(jī)制來允許其執(zhí)行這些函數(shù)來實(shí)現(xiàn)。無論請(qǐng)求是使用調(diào)試模 塊124中的顯函數(shù)作出,還是通過REPL循環(huán)本身的符號(hào)解析句法來作出,該 過程隨后前進(jìn)至604。在604,通過檢查所請(qǐng)求的符號(hào)的名稱是否是全局符號(hào) 的名稱來作出解析所請(qǐng)求的符號(hào)的名稱的嘗試。(全局符號(hào)可從REPL循環(huán)實(shí) 例134的范圍內(nèi)訪問。)如果該符號(hào)可被解析為全局符號(hào)(如在606所確定的), 則顯示該符號(hào)的值(在612),且流程循環(huán)到REPL循環(huán)的實(shí)例134的輸入階 段以等待更多用戶輸入。如果符號(hào)名稱是不可解析的(如在606所確定的), 則作出進(jìn)程128中的助手程序126査找該符號(hào)的請(qǐng)求。助手程序126是附連的 調(diào)試器且能夠使用調(diào)試基礎(chǔ)結(jié)構(gòu)102 (圖1中示出)來到達(dá)棧202的各個(gè)位置, 如框架204 (其是被調(diào)試程序的框架)。因此,助手程序126査詢棧以尋找具 有指定名稱的局部符號(hào)(在608),并將該符號(hào)的值返回(在610)到進(jìn)程112。 隨后顯示該值(在612)。
如上所述,可通過調(diào)試模塊124中提供的函數(shù)(例如, "debugger .examine( "x")")、或通過請(qǐng)求符號(hào)值的普通句法(例如,通過 將"x"鍵入由REPL循環(huán)所提供的提示中)來顯式地作出査找符號(hào)的請(qǐng)求。 在前一種情況下,函數(shù)debugger.examine實(shí)現(xiàn)相關(guān)邏輯——如,其執(zhí)行圖6的 框606到框604。在另一示例中,此邏輯通過擴(kuò)充REPL循環(huán)的符號(hào)解析機(jī)制 來實(shí)現(xiàn),這可通過使調(diào)試模塊124掛鉤到REPL循環(huán)實(shí)例134的變量解析機(jī)制 以調(diào)用圖6的過程的各元素來達(dá)成,其中此類掛鉤可在REPL循環(huán)是其一部分的語言解釋器中獲得。另一種允許符號(hào)解析的方式是在創(chuàng)建嵌套的REPL循環(huán) 主動(dòng)將值注入到REPL循環(huán)實(shí)例134 (或注入到其它嵌套的REPL循環(huán)范圍) 中;從而,諸如符號(hào)"x"的值等值可由助手進(jìn)程126 (圖1中示出)置于REPL 循環(huán)實(shí)例134的范圍中,以便這些值可被REPL循環(huán)的普通符號(hào)解析機(jī)制找到。
示例實(shí)現(xiàn)
圖7示出其中可部署此處所述的本發(fā)明的各方面的示例環(huán)境。 計(jì)算機(jī)700包括一個(gè)或多個(gè)處理器704和一個(gè)或多個(gè)數(shù)據(jù)備忘錄設(shè)備 706。處理器704通常是微處理器,如那些在個(gè)人臺(tái)式機(jī)或膝上型計(jì)算機(jī)、服 務(wù)器、或手持式計(jì)算機(jī)中所找到的。數(shù)據(jù)備忘錄設(shè)備706是能夠短期或長(zhǎng)期存 儲(chǔ)數(shù)據(jù)的設(shè)備。數(shù)據(jù)備忘錄706的示例包括硬盤、可移動(dòng)盤(包括光盤和磁盤)、 易失性和非易失性隨機(jī)存取存儲(chǔ)器(RAM)、所有類型的只讀存儲(chǔ)器(ROM)、 閃存、磁帶等。數(shù)據(jù)備忘錄設(shè)備是計(jì)算機(jī)可讀介質(zhì)的示例。計(jì)算機(jī)可讀介質(zhì) 包括諸如數(shù)據(jù)備忘錄設(shè)備706等存儲(chǔ)介質(zhì)以及諸如電、磁、或光信號(hào)等短暫地
攜帶數(shù)據(jù)的介質(zhì)兩者。
軟件(如軟件組件702)可被存儲(chǔ)在數(shù)據(jù)備忘錄設(shè)備706中,且可在一個(gè) 或多個(gè)處理器704上執(zhí)行。其中程序被存儲(chǔ)在硬盤上,加載到RAM中,并在 計(jì)算機(jī)的處理器上執(zhí)行的個(gè)人計(jì)算機(jī)代表了圖7所示的場(chǎng)景,但此處所述的主 題不限于此示例。
此處所述的主題可被實(shí)現(xiàn)為存儲(chǔ)在數(shù)據(jù)備忘錄設(shè)備706中的一個(gè)或多個(gè) 中并在處理器704中的一個(gè)或多個(gè)上執(zhí)行的軟件。作為另一示例,本主題可被 實(shí)現(xiàn)為具有執(zhí)行一個(gè)或多個(gè)動(dòng)作的指令的軟件,其中指令被存儲(chǔ)在或被攜帶于
一個(gè)或多個(gè)計(jì)算機(jī)可讀介質(zhì)上。
盡管用對(duì)結(jié)構(gòu)特征和/或方法動(dòng)作專用的語言描述了本主題,但可以理解, 所附權(quán)利要求書中定義的主題不必限于上述具體特征或動(dòng)作。相反,上述具體 特征和動(dòng)作是作為實(shí)現(xiàn)權(quán)利要求的示例形式公開的。
權(quán)利要求
1.一個(gè)或多個(gè)具有執(zhí)行一方法的指令的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),所述方法包括在第一進(jìn)程中接收在第二進(jìn)程中發(fā)生調(diào)試事件的通知,在所述第二進(jìn)程中被調(diào)試程序在循環(huán)的第一實(shí)例中運(yùn)行;使用第一調(diào)試原語來在所述第二進(jìn)程中調(diào)用所述循環(huán)的第二實(shí)例;從所述第二進(jìn)程接收?qǐng)?zhí)行以下動(dòng)作中的至少一個(gè)的請(qǐng)求(a)傳送關(guān)于在所述第二進(jìn)程中定義的符號(hào)的信息,以及(b)在所述被調(diào)試程序中執(zhí)行至少一個(gè)流程控制動(dòng)作;使用(a)所述第一調(diào)試原語,以及(b)第二調(diào)試原語中的至少一個(gè)來執(zhí)行在所述請(qǐng)求中所指定的動(dòng)作;以及顯示以下的至少一個(gè)(a)與所述符號(hào)相關(guān)聯(lián)的值,以及(b)從所述至少一個(gè)流程控制動(dòng)作所得的所述被調(diào)試程序的結(jié)果。
2. 如權(quán)利要求1所述的一個(gè)或多個(gè)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其特征在于,所 述請(qǐng)求是將所述被調(diào)試程序中的函數(shù)的返回值設(shè)置為由用戶指定的值,且其中 所述方法還包括使用所述第二調(diào)試原語來將由所述用戶指定的值置于為所述函數(shù) 的返回值保留的存儲(chǔ)器位置中。
3. 如權(quán)利要求1所述的一個(gè)或多個(gè)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其特征在于,所述請(qǐng)求是在所述被調(diào)試程序中執(zhí)行多個(gè)語句,且其中所述方法還包括使用所述第二調(diào)試原語來指示所述被調(diào)試程序執(zhí)行所述多個(gè)語句。
4. 如權(quán)利要求1所述的一個(gè)或多個(gè)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其特征在于,所 述請(qǐng)求是中止調(diào)試,且其中所述方法還包括在所述第二進(jìn)程中的異常桟被展開時(shí)避免向用戶通知由所述第二進(jìn)程生成的異常,直到在所述異常棧中到達(dá)所述循環(huán)的所述第一實(shí)例。
5. 如權(quán)利要求1所述的一個(gè)或多個(gè)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其特征在于,所 述請(qǐng)求是繼續(xù)所述被調(diào)試程序的執(zhí)行,且其中所述方法還包括接收所述循環(huán)的所述第二實(shí)例已經(jīng)終止的第二通知;以及 允許所述第二進(jìn)程從在所述調(diào)試事件發(fā)生時(shí)所述程序正在執(zhí)行的點(diǎn)繼續(xù)所述被調(diào)試程序的執(zhí)行。
6. 如權(quán)利要求1所述的一個(gè)或多個(gè)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其特征在于,所 述請(qǐng)求是繼續(xù)所述被調(diào)試程序的執(zhí)行,且其中所述方法還包括從所述第二進(jìn)程接收待決異常將被清除的指示; 清除在所述調(diào)試事件發(fā)生時(shí)引發(fā)的異常;以及允許所述第二進(jìn)程從在所述調(diào)試事件發(fā)生時(shí)所述程序正在執(zhí)行的 點(diǎn)繼續(xù)所述被調(diào)試程序的執(zhí)行。
7. —種用于便于調(diào)試的系統(tǒng),所述系統(tǒng)包括一個(gè)或多個(gè)數(shù)據(jù)備忘錄設(shè)備;第一軟件,所述第一軟件被存儲(chǔ)在所述一個(gè)或多個(gè)數(shù)據(jù)備忘錄設(shè)備 中的至少一個(gè)中并且可被加載到程序中,所述程序在環(huán)境中的第一進(jìn)程中運(yùn) 行,所述程序具有讀取來自用戶的輸入并對(duì)所述輸入求值的循環(huán),所述程序?qū)?例化所述循環(huán)的第一實(shí)例,所述第一軟件展示可由所述用戶輸入到所述循環(huán)中 的一個(gè)或多個(gè)命令,所述一個(gè)或多個(gè)命令包括請(qǐng)求顯示與在所述程序中定義的 符號(hào)相關(guān)聯(lián)的信息的第一命令,所述一個(gè)或多個(gè)命令中的至少一個(gè)調(diào)用在所述環(huán)境中的第二進(jìn)程中運(yùn)行的第二軟件;以及所述第二軟件,所述第二軟件被存儲(chǔ)在所述一個(gè)或多個(gè)數(shù)據(jù)備忘錄 設(shè)備中的至少一個(gè)中,所述第二軟件使用第一方法來響應(yīng)于接收到在所述第一 進(jìn)程中發(fā)生事件的通知來在所述第一進(jìn)程中調(diào)用所述循環(huán)中的第二實(shí)例,所述 第一方法由所述環(huán)境的調(diào)試基礎(chǔ)結(jié)構(gòu)來提供,所述第一命令可從所述用戶被接 收到所述循環(huán)的所述第二實(shí)例中。
8. 如權(quán)利要求7所述的系統(tǒng),其特征在于,所述第一軟件響應(yīng)于所述第一 命令來確定所述符號(hào)是否是在所述程序中定義的全局符號(hào),并在所述符號(hào)不是 全局符號(hào)的情況下從所述第二軟件請(qǐng)求所述符號(hào)的解析,且其中所述第二軟件 將所述符號(hào)解析為在所述程序中運(yùn)行的函數(shù)中的局部符號(hào)。
9. 如權(quán)利要求8所述的系統(tǒng),其特征在于,所述第一命令采用以下中的至 少一種形式函數(shù)調(diào)用,其中所述函數(shù)調(diào)用調(diào)用獲得與所述符號(hào)相關(guān)聯(lián)的值的方法;以及所述符號(hào)的所述名稱,其中所述循環(huán)提供在輸入所述符號(hào)時(shí)獲得并 顯示所述值的編程。
10. 如權(quán)利要求7所述的系統(tǒng),其特征在于,所述第二軟件將局部變量 和其值置于與所述循環(huán)的所述第二實(shí)例相關(guān)聯(lián)的范圍中。
11. 如權(quán)利要求7所述的系統(tǒng),其特征在于,所述函數(shù)在所述程序之下執(zhí)行,其中所述一個(gè)或多個(gè)命令中的第二個(gè)包括將所述函數(shù)的返回值設(shè)置為由 所述用戶指定的值的命令,且其中所述第二軟件使用由所述調(diào)試基礎(chǔ)結(jié)構(gòu)所提 供的第二方法來將由所述用戶指定的值置于為所述函數(shù)的返回值保留的存儲(chǔ)器位置中。
12. 如權(quán)利要求11所述的系統(tǒng),其特征在于,所述第一軟件使得將被 保留的所述函數(shù)中的局部變量持有將被所述函數(shù)返回的值,且其中所述第二軟 件將由所述用戶指定的值置于所述局部變量中。
13. 如權(quán)利要求7所述的系統(tǒng),其特征在于,所述事件包括在所述程序 之下執(zhí)行的函數(shù)的掛起,其中所述第二軟件接收所述循環(huán)的所述第二實(shí)例已經(jīng) 終止的通知并指示所述第一進(jìn)程從所述函數(shù)被掛起的點(diǎn)繼續(xù)所述函數(shù)的執(zhí)行。
14. 如權(quán)利要求7所述的系統(tǒng),其特征在于,所述事件包括正在所述程 序之下執(zhí)行的函數(shù)的掛起,所述掛起與異常的引發(fā)相關(guān)聯(lián),其中所述第一軟件 指示所述第二軟件待決異常要被清除,其中所述第二軟件清除所述異常并允許 所述第一進(jìn)程從所述函數(shù)被掛起的點(diǎn)繼續(xù)所述函數(shù)的執(zhí)行。
15. —個(gè)或多個(gè)具有執(zhí)行一方法的指令的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),所述方 法包括通過循環(huán)的第一實(shí)例接收來自用戶的啟動(dòng)程序的第一指令,所述第 一實(shí)例在環(huán)境中的第一進(jìn)程中運(yùn)行;在所述環(huán)境中的第二進(jìn)程中接收在所述第一進(jìn)程中發(fā)生事件的第一通知;在所述第二進(jìn)程中使用第一方法來調(diào)用所述第一進(jìn)程中的所述循 環(huán)的第二實(shí)例,所述第一方法由所述環(huán)境的調(diào)試基礎(chǔ)結(jié)構(gòu)來提供;在所述循環(huán)的所述第二實(shí)例中接收來自所述用戶的第二指令;向所述第二進(jìn)程提供基于所述第二指令的第一信息;以及在所述第二進(jìn)程中使用第二方法來做以下中的至少一項(xiàng)(a)指示所述第一進(jìn)程基于所述第一信息來執(zhí)行至少一個(gè)動(dòng)作,以及(b)從所述第一進(jìn)程取回在所述第一信息中指定且將由所述循環(huán)的所述第二實(shí)例來顯示的符號(hào)信息。
16. 如權(quán)利要求15所述的一個(gè)或多個(gè)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其特征在 于,所述第二指令指示將在所述程序中設(shè)置斷點(diǎn),其中所述第一信息包括所述斷點(diǎn)在所述程序中的位置的指示,且其中所述第二方法的使用包括使用所述第二方法來在所述位置處設(shè)置所述斷點(diǎn)。
17. 如權(quán)利要求15所述的一個(gè)或多個(gè)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其特征在 于,所述第二指令指示符號(hào)的名稱,且其中所述方法還包括由所述循環(huán)的所述第二實(shí)例來確定所述名稱不與所述第一進(jìn)程中的全局符號(hào)相關(guān)聯(lián);在所述第一進(jìn)程中,向所述第一進(jìn)程發(fā)出解析所述名稱的請(qǐng)求;以及使用所述第二方法來取回與所述名稱相關(guān)聯(lián)的值。
18. 如權(quán)利要求15所述的一個(gè)或多個(gè)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其特征在于,所述第二指令指示所述程序的執(zhí)行將繼續(xù),且其中所述方法還包括在所述第二進(jìn)程中接收所述循環(huán)的所述第二實(shí)例已經(jīng)終止的第二通知;以及允許所述第一進(jìn)程從在所述事件發(fā)生時(shí)所述程序正在執(zhí)行的點(diǎn)繼續(xù)執(zhí)行。
19. 如權(quán)利要求15所述的一個(gè)或多個(gè)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其特征在 于,所述第二指令指示所述程序的執(zhí)行將繼續(xù),其中所述第一信息包括待決異 常要被清除的指示,且其中所述方法還包括所述第二進(jìn)程清除在所述事件發(fā)生時(shí)引發(fā)的異常;以及 允許所述第一進(jìn)程從在所述事件發(fā)生時(shí)所述程序正在執(zhí)行的點(diǎn)繼續(xù)執(zhí)行。
20. 如權(quán)利要求15所述的一個(gè)或多個(gè)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其特征在 于,所述循環(huán)由作為語言解釋器的一部分的軟件組件來實(shí)現(xiàn),且其中所述循環(huán) 讀取來自所述用戶的輸入、對(duì)所述輸入求值、以及顯示對(duì)所述輸入求值的結(jié)果,所述第一指令是所述輸入的實(shí)例,
全文摘要
進(jìn)程內(nèi)調(diào)試體驗(yàn)可使用支持進(jìn)程外調(diào)試的基礎(chǔ)結(jié)構(gòu)來實(shí)現(xiàn)。要被調(diào)試的程序可以用命令行語言來編寫,該命令行語言通過輸入循環(huán)來接收并處理輸入。用于該語言的解釋器在第一進(jìn)程中運(yùn)行。助手程序在第二進(jìn)程中啟動(dòng),且如同其是進(jìn)程外調(diào)試器那樣附連到第一進(jìn)程。調(diào)試模塊被加載到解釋器,這提供了可利用助手程序的用戶調(diào)試命令。在要被調(diào)試的程序生成調(diào)試事件時(shí),該事件被助手進(jìn)程接收,該助手進(jìn)程使用調(diào)試原語來啟動(dòng)第一進(jìn)程中的輸入循環(huán)的新實(shí)例。由調(diào)試模塊所提供的調(diào)試命令可被用戶輸入到輸入循環(huán)的新實(shí)例中。
文檔編號(hào)G06F11/00GK101681280SQ200880017200
公開日2010年3月24日 申請(qǐng)日期2008年5月16日 優(yōu)先權(quán)日2007年5月25日
發(fā)明者J·M·斯托爾, J·斯特拉尼克, R·拜爾斯 申請(qǐng)人:微軟公司