背景技術(shù):
傳統(tǒng)的軟件診斷工具通常在實(shí)時(shí)(live)運(yùn)行的過程或保存的過程狀態(tài)上操作。例如,實(shí)時(shí)調(diào)試器在正在執(zhí)行的過程上運(yùn)行。在保存的過程狀態(tài)上執(zhí)行的調(diào)試器不被附加到正在執(zhí)行的過程,并在正在被調(diào)試的過程執(zhí)行時(shí)通過處理收集的歷史日志文件或過程轉(zhuǎn)儲(chǔ)(dump)文件來運(yùn)行。這種類型的調(diào)試器與正在被調(diào)試的過程分開執(zhí)行,通常在正在被調(diào)試的過程被完成執(zhí)行之后的某個(gè)時(shí)間。調(diào)試實(shí)時(shí)過程提供很少或沒有關(guān)于過程如何達(dá)到其當(dāng)前狀態(tài)的歷史上下文。調(diào)試過程轉(zhuǎn)儲(chǔ)文件和/或日志文件通常是耗時(shí)和迭代的。
技術(shù)實(shí)現(xiàn)要素:
診斷工具可以在由診斷工作流制品指引的過程上執(zhí)行活動(dòng)類型調(diào)試,而不停止該過程。診斷工具可以以與用于實(shí)時(shí)調(diào)試的方式類似的方式執(zhí)行條件或無條件斷點(diǎn)處理和條件或無條件異常處理,但是不具有實(shí)時(shí)調(diào)試通常對(duì)過程的性能影響。如本文所使用的“生產(chǎn)”或“生產(chǎn)環(huán)境”是指所使用的軟件已經(jīng)從開發(fā)和/或測(cè)試階段退出并且是“正在生產(chǎn)”的環(huán)境,即,用于執(zhí)行實(shí)際工作而不是開發(fā)和/或測(cè)試。診斷工作流文件中提供的指令可以用于自動(dòng)控制調(diào)試器的未來診斷操作(當(dāng)調(diào)試器執(zhí)行時(shí),用戶不必與調(diào)試器交互)??梢曰谡趫?zhí)行的應(yīng)用的當(dāng)前狀態(tài)有條件地執(zhí)行在診斷工作流文件中指定的診斷操作?!爱?dāng)前狀態(tài)”可以包括診斷原語(primitive)的狀態(tài)。診斷原語是影響診斷工具狀態(tài)的任何操作,例如但不限于創(chuàng)建斷點(diǎn),移除斷點(diǎn),禁用斷點(diǎn),改變斷點(diǎn)的條件,基于異常的類型啟用異常,基于異常的類型禁用異常,基于與異常相關(guān)聯(lián)的調(diào)用堆棧來調(diào)整異常,步進(jìn)操作(諸如步入到代碼中,跳過指令等,以及步出代碼)?!爱?dāng)前狀態(tài)”可以包括各種變量的狀態(tài),包括但不限于程序變量和診斷變量。程序變量指被調(diào)試程序使用的那些變量。診斷變量(例如,保存特定斷點(diǎn)被命中的次數(shù)或者指定類型的異常是否被拋出的變量的值,或者異常是否在指定的調(diào)用堆棧被拋出)指由調(diào)試器用于調(diào)試的那些變量。
診斷工作流文件可以從集成開發(fā)環(huán)境(ide)或其他開發(fā)環(huán)境生成。診斷工作流可以使得診斷動(dòng)作能夠在程序執(zhí)行時(shí)自動(dòng)執(zhí)行(在沒有人工干預(yù)的情況下)。診斷操作包括但不限于以下操作:當(dāng)指定的事件發(fā)生時(shí),可以啟用斷點(diǎn),當(dāng)指定的事件發(fā)生時(shí)可以禁用斷點(diǎn),當(dāng)指定類型的異常首次被拋出時(shí)可以啟用程序處理中的斷點(diǎn)或轉(zhuǎn)儲(chǔ)生成,當(dāng)異常在特定調(diào)用堆棧或者特定行首次被拋出時(shí),可以啟用程序處理中的中斷或轉(zhuǎn)儲(chǔ)生成,異常的類型可以用作中斷或轉(zhuǎn)儲(chǔ)生成的次要條件,當(dāng)發(fā)生上述條件之一時(shí)可以啟用診斷記錄,和/或當(dāng)發(fā)生以下情況之一時(shí)可以禁用診斷記錄:可以執(zhí)行步進(jìn)操作,可以評(píng)估變量,可以將變量寫入日志等。也就是說,當(dāng)用戶控制調(diào)試器時(shí),用戶將能夠直接執(zhí)行的由診斷工具支持的任何動(dòng)作可以由工作流文件自動(dòng)驅(qū)動(dòng)執(zhí)行。
可以將診斷工作流文件提供給生產(chǎn)或非生產(chǎn)環(huán)境中的調(diào)試會(huì)話。診斷工作流可以應(yīng)用于生產(chǎn)環(huán)境中的實(shí)時(shí)調(diào)試會(huì)話。工作流中描述的動(dòng)作可以在沒有用戶交互的情況下動(dòng)態(tài)地控制調(diào)試器或其他診斷工具。診斷工作流中指定的條件的狀態(tài)可以在每個(gè)生成的診斷制品中可見。診斷制品可以包括實(shí)時(shí)調(diào)試會(huì)話,輕量級(jí)過程快照或從實(shí)時(shí)過程或輕量級(jí)過程快照生成的過程轉(zhuǎn)儲(chǔ)。
提供本發(fā)明內(nèi)容以便以簡化形式介紹將在以下詳細(xì)描述中進(jìn)一步描述的一些概念。本發(fā)明內(nèi)容不旨在標(biāo)識(shí)所要求保護(hù)的主題的關(guān)鍵特征或必要特征,也不旨在用于限制所要求保護(hù)的主題的范圍。
附圖說明
在附圖中:
圖1示出了根據(jù)本文描述的主題的各方面的用于生成和/或執(zhí)行診斷工作流的系統(tǒng)100的示例;
圖2示出了根據(jù)本文公開的主題的方面的包括生成診斷工作流和/或執(zhí)行診斷工作流的方法的示例的方法200的示例;
圖3是根據(jù)本文公開的主題的各方面的計(jì)算環(huán)境的示例的框圖;和
圖4是根據(jù)本文所公開的主題的各方面的集成開發(fā)環(huán)境的示例的框圖。
具體實(shí)施方式
概述
因?yàn)橛脩糁苯优c調(diào)試器交互(控制調(diào)試器的動(dòng)作),實(shí)時(shí)調(diào)試器可以向用戶提供對(duì)調(diào)試動(dòng)作的細(xì)粒度控制。例如,在實(shí)時(shí)調(diào)試中,用戶可以在源代碼中插入斷點(diǎn)。當(dāng)在程序的執(zhí)行期間遇到斷點(diǎn)時(shí),通常停止目標(biāo)過程,并且將過程的控制交給用戶。然后,用戶可以執(zhí)行各種調(diào)試操作,包括啟用或禁用斷點(diǎn),檢查變量值,檢查調(diào)用堆棧等。當(dāng)用戶已經(jīng)完成他的調(diào)試動(dòng)作時(shí),他可以指引處理器恢復(fù)應(yīng)用的執(zhí)行。當(dāng)調(diào)試由于對(duì)用戶的影響而不合理停止的應(yīng)用(例如,在生產(chǎn)環(huán)境中運(yùn)行的應(yīng)用)時(shí),用戶必須猜測(cè)他或她將需要收集什么信息并將日志語句放入至應(yīng)用中,以便收集該信息。通常,此歷史信息是離線評(píng)估的。
根據(jù)本文描述的主題的一些方面,在調(diào)試器正在被執(zhí)行時(shí),在診斷工作流文件中提供的指令可以用于在沒有用戶與調(diào)試器的交互的情況下控制調(diào)試器的未來診斷操作??梢杂袟l件地執(zhí)行診斷工作流文件中的指令。診斷工作流文件中的指令可以基于以下狀態(tài)的任何組合而有條件地被執(zhí)行:一個(gè)或多個(gè)程序變量,一個(gè)或多個(gè)診斷原語和/或一個(gè)或多個(gè)診斷變量。程序變量是由程序所需的變量。診斷變量是由診斷工具所需的變量。確定診斷工作流文件中的指令是否被執(zhí)行的條件可以包括指定程序變量的值(例如,“如果程序中的整數(shù)變量‘i’具有值13,則執(zhí)行動(dòng)作”)。條件也可以基于狀態(tài),例如“如果執(zhí)行線程被命名為‘squid’、或過程的名稱是‘clam’,則執(zhí)行動(dòng)作”。該條件可以基于一個(gè)或多個(gè)診斷原語的狀態(tài)。診斷原語可以是影響調(diào)試器的狀態(tài)的任何操作,包括但不限于創(chuàng)建,移除,啟用或禁用斷點(diǎn),改變斷點(diǎn)的條件(例如,將斷點(diǎn)從啟用改變?yōu)榻?,或改變其上的條件執(zhí)行斷點(diǎn)),通過類型啟用或禁用異常,通過調(diào)用堆棧調(diào)節(jié)異常,或調(diào)試器操作(例如調(diào)用步進(jìn)操作(步入,跳過,步出))。該條件可以基于診斷變量的狀態(tài),例如但不限于,例如,指定特定斷點(diǎn)被命中的次數(shù)的變量的值,或者如果指定類型的異常已經(jīng)被拋出,或者如果異常已經(jīng)在指定的調(diào)用堆棧被拋出。
條件診斷指令可以以任何合適的方式被動(dòng)態(tài)地插入運(yùn)行的應(yīng)用中。根據(jù)本文描述的主題的一些方面,可以通過例如將功能調(diào)用注入到快照運(yùn)行時(shí),來動(dòng)態(tài)地將條件診斷指令插入運(yùn)行的應(yīng)用中。注入的斷點(diǎn)的每個(gè)實(shí)例可以被分配在運(yùn)行時(shí)唯一的標(biāo)識(shí)符。當(dāng)命中斷點(diǎn)時(shí),唯一標(biāo)識(shí)符可以被傳遞到診斷運(yùn)行時(shí)。工作流執(zhí)行環(huán)境然后可以在診斷工作流文件中找到特定斷點(diǎn)并應(yīng)用在那里指定的動(dòng)作。
被插入到執(zhí)行的應(yīng)用中的條件或無條件斷點(diǎn)和/或條件或無條件異常處理可以是非停止(non-stopping)。當(dāng)執(zhí)行儀器化的代碼(instrumentedcode)并且遇到非停止斷點(diǎn)時(shí),代替停止過程并將控制轉(zhuǎn)交給用戶,可以在沒有用戶交互的情況下執(zhí)行由診斷工作流文件的內(nèi)容所指引的附加處理??梢允占\斷信息。收集的診斷信息可以包括過程狀態(tài)的輕量級(jí)快照。
用于生產(chǎn)調(diào)試的診斷工作流程
可以創(chuàng)建包括可以在運(yùn)行的應(yīng)用中有條件地或無條件地執(zhí)行的診斷指令的診斷工作流文件。診斷工作流文件可以用于指定將被插入到執(zhí)行代碼中的條件或無條件斷點(diǎn)處理,以及以類似于用于實(shí)況調(diào)試的方式執(zhí)行的條件或無條件異常處理。代替啟動(dòng)實(shí)時(shí)調(diào)試,可以將斷點(diǎn)綁定位置的列表,異常狀態(tài)和條件的編譯版本導(dǎo)出到診斷工作流文件。診斷工作流文件可以應(yīng)用于正在運(yùn)行的應(yīng)用(例如,使用代碼注入技術(shù),代碼重寫機(jī)制等)。應(yīng)用可以在生產(chǎn)或非生產(chǎn)(例如,開發(fā),測(cè)試,分級(jí)等)環(huán)境中執(zhí)行。
可以在診斷工作流文件中指定包括用于一個(gè)或多個(gè)唯一標(biāo)識(shí)的斷點(diǎn)的一個(gè)或多個(gè)指令的工作流。可以在診斷工作流文件中指定包括用于一種或多種類型的異常的一個(gè)或多個(gè)指令的工作流。異常可以通過如下來識(shí)別:例如異常類型(或整數(shù)代碼,取決于異常的類型),異常從中被拋出的調(diào)用堆棧,正在捕獲異常的catch塊等等。在已經(jīng)指定要在診斷會(huì)話中發(fā)生的處理之后,根據(jù)本文描述的主題的一些方面,可以編譯診斷工作流文件。當(dāng)執(zhí)行目標(biāo)應(yīng)用時(shí),診斷工作流文件可以由診斷工作流引擎消費(fèi)。
診斷工作流引擎可以按照診斷工作流文件的指引執(zhí)行調(diào)試操作。診斷工作流引擎可以根據(jù)工作流中的描述來初始化用于每個(gè)生產(chǎn)診斷事件的狀態(tài)(例如,啟用或禁用)。例如,如果在另一個(gè)事件發(fā)生時(shí)啟用斷點(diǎn)(例如,斷點(diǎn)1),則斷點(diǎn)1可以被初始化為“禁用”狀態(tài)。可以使用諸如常規(guī)語言運(yùn)行時(shí)(clr)中間語言(il)重寫簡檔器(profiler)或任何其它合適的代碼重寫技術(shù)的運(yùn)行時(shí)簡檔器,將斷點(diǎn)和異常處理程序(handler)注入到過程中。這允許診斷工具捕獲各種事件,評(píng)估執(zhí)行條件,并最終觸發(fā)事件的處理程序。指定的處理可以包括創(chuàng)建快照??煺湛梢允禽p量級(jí)過程快照??煺湛梢择v留在存儲(chǔ)器中,并且可以由諸如調(diào)試器的診斷工具訪問??煺湛梢员恍蛄谢酱鎯?chǔ)器轉(zhuǎn)儲(chǔ)。內(nèi)存轉(zhuǎn)儲(chǔ)可以由診斷工具脫機(jī)使用。在運(yùn)行時(shí),隨著在診斷工作流文件中指定的每個(gè)事件發(fā)生在計(jì)算設(shè)備上,由儀器引擎注入的儀器可以調(diào)用工作流引擎以執(zhí)行診斷工作流文件中所描述的動(dòng)作,諸如啟用或禁用一個(gè)或多個(gè)不同的斷點(diǎn),行走(walk)調(diào)用堆棧,類型檢查異常,并且可以基于指定的處理的結(jié)果執(zhí)行一個(gè)或多個(gè)動(dòng)作。
圖1示出了根據(jù)本文描述的主題的各方面的可以基于診斷工作流文件執(zhí)行調(diào)試的系統(tǒng)100的示例。系統(tǒng)100的全部或部分可以駐留在一個(gè)或多個(gè)計(jì)算機(jī)或計(jì)算設(shè)備上,例如下面參照?qǐng)D3描述的計(jì)算機(jī)。系統(tǒng)100或其部分可以作為獨(dú)立系統(tǒng)或作為插件或插件提供。系統(tǒng)100可以完全地或部分地在諸如ide104的ide中執(zhí)行,或者可以完全地或部分地在ide外部執(zhí)行。ide104可以是諸如參考圖4所描述的ide的ide,或可以是任何其他ide。系統(tǒng)100的全部或部分可以實(shí)現(xiàn)為插件或附加組件。
系統(tǒng)100或其部分可以包括從服務(wù)(例如,在云中)獲得的信息,或可以在云計(jì)算環(huán)境中操作的信息。云計(jì)算環(huán)境可以是其中計(jì)算服務(wù)不被擁有但是按需提供的環(huán)境。例如,信息可以駐留在聯(lián)網(wǎng)云中的多個(gè)設(shè)備上和/或數(shù)據(jù)可以存儲(chǔ)在云內(nèi)的多個(gè)設(shè)備上。
系統(tǒng)100可以包括一個(gè)或者多個(gè)計(jì)算設(shè)備,注入例如計(jì)算設(shè)備102。想到的計(jì)算設(shè)備包括但不限于臺(tái)式計(jì)算機(jī),平板計(jì)算機(jī),膝上型計(jì)算機(jī),筆記本計(jì)算機(jī),個(gè)人數(shù)字助理,智能電話,膝上型計(jì)算機(jī),膝上型計(jì)算機(jī),蜂窩電話,移動(dòng)電話,服務(wù)器,虛擬機(jī),包括數(shù)據(jù)庫的設(shè)備,防火墻等。諸如計(jì)算設(shè)備102的計(jì)算設(shè)備可以包括諸如處理器142等的一個(gè)或多個(gè)處理器以及諸如與一個(gè)或多個(gè)處理器通信的存儲(chǔ)器144的存儲(chǔ)器。
系統(tǒng)100可以包括程序模塊中的任何一個(gè)或任何組合,包括:儀器(instrumentation)引擎,例如儀器引擎114,診斷工作流引擎,例如工作流引擎116和/或調(diào)試器或診斷工具,例如調(diào)試器124。儀器引擎(諸如儀器引擎114)可以包括諸如工作流引擎116的診斷工作流引擎。診斷工作流引擎可以在儀器引擎外部。系統(tǒng)100可以包括諸如生產(chǎn)運(yùn)行時(shí)環(huán)境106的執(zhí)行環(huán)境。備選地,執(zhí)行環(huán)境可以是開發(fā),分級(jí)或測(cè)試環(huán)境。系統(tǒng)100可以包括第二環(huán)境,諸如但不限于圖1中由ide104表示的開發(fā)環(huán)境。
根據(jù)本文描述的主題的一些方面,響應(yīng)于接收諸如源代碼128的輸入可以創(chuàng)建可以由調(diào)試器124而創(chuàng)建的診斷工作流文件,例如診斷工作流文件120。診斷工作流文件可以用于在調(diào)試器執(zhí)行時(shí)沒有與調(diào)試器進(jìn)行用戶交互的情況下,控制調(diào)試器的未來診斷操作。可以基于正在執(zhí)行的應(yīng)用的當(dāng)前狀態(tài)有條件地執(zhí)行在診斷工作流文件中指定的診斷操作?!爱?dāng)前狀態(tài)”可以包括診斷原語的狀態(tài)(例如,是否已經(jīng)命中了某個(gè)斷點(diǎn),是否已經(jīng)拋出了異常)和各種變量的狀態(tài)(例如,保存如下的變量值特定斷點(diǎn)被命中的次數(shù),或者是否已經(jīng)拋出指定類型的異常,或者是否異常已經(jīng)在指定的調(diào)用堆棧被拋出)或其組合。診斷原語可以是影響調(diào)試器狀態(tài)的任何操作,包括但不限于創(chuàng)建,移除或禁用斷點(diǎn),改變斷點(diǎn)的條件(例如,從啟用到禁用或從禁用到啟用),按照類型啟用或禁用異常,基于異常被拋出的調(diào)用堆棧調(diào)整異常,或調(diào)試器操作,例如調(diào)取步驟操作(步入,跳過,步出)等。
可以編譯診斷工作流文件120??梢詫⒃\斷工作流文件120或編譯的診斷工作流文件提供給儀器引擎114。儀器引擎114可以動(dòng)態(tài)地在不取消或停止執(zhí)行過程108的情況下,來將原始功能110儀器化以創(chuàng)建儀器化的功能112。下一次調(diào)取功能時(shí),可以執(zhí)行儀器化的功能112而不是原始功能110。根據(jù)這里描述的主題的一些方面,原始功能110被重寫以使用代碼重寫機(jī)制來創(chuàng)建儀器化的功能112。根據(jù)本文描述的主題的一些方面,原始功能110被重寫以由儀器引擎114創(chuàng)建儀器化的功能112。
諸如工作流引擎116的診斷工作流引擎可以執(zhí)行在診斷工作流文件120中指定的處理。例如,如果已經(jīng)遇到第一斷點(diǎn)(斷點(diǎn)a),則診斷工作流引擎可以啟用第二斷點(diǎn)(斷點(diǎn)b)。如果拋出指定類型的異常,則診斷工作流引擎可以啟用特定斷點(diǎn)。如果指定類型的異常在指定的調(diào)用堆棧被拋出,則診斷工作流引擎可以啟用特定斷點(diǎn)。如果第一條件斷點(diǎn)(斷點(diǎn)a)沒有被命中(因?yàn)槔绮粷M足第一條件斷點(diǎn)所要求的條件),則診斷工作流引擎可以啟用第二條件斷點(diǎn)(斷點(diǎn)b)。如果拋出指定類型的異常,則診斷工作流引擎可以禁用特定斷點(diǎn)。如果在與第一斷點(diǎn)(例如,斷點(diǎn)a)不同的會(huì)話或過程中遇到第二斷點(diǎn),則診斷工作流引擎可以禁用第二斷點(diǎn)(例如,斷點(diǎn)b)。如果代碼段花費(fèi)比閾值更長來執(zhí)行(例如,代碼段可以取決于影響性能的事件),則診斷工作流引擎可以啟用特定斷點(diǎn)。如果已經(jīng)命中指定的斷點(diǎn),則診斷工作流引擎可以啟用在指定類型的第一機(jī)會(huì)異常處創(chuàng)建轉(zhuǎn)儲(chǔ)。如果已經(jīng)命中了特定的指定斷點(diǎn),則診斷工作流引擎可以禁止在特定類型的第一機(jī)會(huì)異常處創(chuàng)建轉(zhuǎn)儲(chǔ)。如果在與第二標(biāo)識(shí)的斷點(diǎn)相同的線程上遇到異常,則診斷工作流引擎可以啟用特定斷點(diǎn)。諸如診斷工作流引擎116的診斷工作流引擎可以收集和保持和/或保存諸如調(diào)試信息118的調(diào)試信息(調(diào)試制品)。
圖2示出了根據(jù)本文描述的主題的各方面的用于創(chuàng)建和執(zhí)行診斷工作流文件的方法200的示例。另外,圖2中所示的系統(tǒng)可以由諸如但不限于關(guān)于圖2描述的系統(tǒng)來實(shí)施。雖然方法200描述了在序列中執(zhí)行的一系列步驟或操作,但是應(yīng)當(dāng)理解,方法200不受所描繪的序列的順序的限制。例如,一些操作可以按與所描述的順序不同的順序發(fā)生。另外,一個(gè)操作可以與另一操作同時(shí)發(fā)生。在一些情況下,不是執(zhí)行所描述的所有操作。
在操作206,可以創(chuàng)建如上面更充分描述的診斷工作流文件??梢跃幾g診斷工作流文件。在操作208,可以將診斷工作流文件發(fā)送到調(diào)試環(huán)境。可以從開發(fā),測(cè)試或分級(jí)計(jì)算機(jī)器接收診斷工作流文件。診斷工作流文件可以由同一計(jì)算設(shè)備或另一計(jì)算設(shè)備上的生產(chǎn)運(yùn)行時(shí)環(huán)境接收。
在操作210,可以將功能儀器化以產(chǎn)生在下一次調(diào)用功能時(shí)執(zhí)行的儀器化的功能。該功能可以由加載到連接到計(jì)算機(jī)器的處理器的存儲(chǔ)器中的一個(gè)或多個(gè)程序模塊來儀器化。在操作212,可以執(zhí)行儀器化的功能。儀器化的功能可以由計(jì)算設(shè)備的處理器執(zhí)行。儀器化的功能可以由確定狀態(tài)的診斷工作流引擎處理,并且可以執(zhí)行診斷工作流文件中指定的診斷操作,如上面更充分描述的。在操作214,可以收集調(diào)試信息(例如,診斷制品)。在操作216,可以提供工作流狀態(tài)。工作流狀態(tài)可以被提供為顯示,報(bào)告,寫入存儲(chǔ)介質(zhì)或以任何手段使得通過本領(lǐng)域技術(shù)人員已知。
根據(jù)本文描述的主題的各方面,計(jì)算機(jī)系統(tǒng)可以包括一個(gè)或多個(gè)處理器,連接到一個(gè)或多個(gè)處理器的存儲(chǔ)器,以及診斷工具。診斷工具可以包括一個(gè)或多個(gè)程序模塊,當(dāng)加載到存儲(chǔ)器中時(shí)可以使得一個(gè)或多個(gè)處理器創(chuàng)建診斷工作流文件。診斷工作流文件可以自動(dòng)控制調(diào)試器的未來診斷操作(在調(diào)試器執(zhí)行時(shí)沒有用戶與調(diào)試器交互的情況下)。診斷工作流文件可以包括一個(gè)或多個(gè)診斷操作。診斷工作流文件可以基于正在執(zhí)行的程序的當(dāng)前狀態(tài)來指定診斷操作是有條件的。當(dāng)前狀態(tài)可以包括一個(gè)或多個(gè)診斷原語的狀態(tài)。當(dāng)前狀態(tài)可以包括一個(gè)或多個(gè)診斷變量的狀態(tài)。當(dāng)前狀態(tài)可以包括一個(gè)或多個(gè)程序變量的狀態(tài)。條件診斷操作的執(zhí)行可以取決于一個(gè)或多個(gè)診斷原語,一個(gè)或多個(gè)程序變量和一個(gè)或多個(gè)診斷變量的狀態(tài)的組合。
使用諸如上述系統(tǒng)的系統(tǒng)的方法可以包括諸如由計(jì)算設(shè)備的處理器接收診斷工作流文件的操作。診斷工作流文件可以包括將被執(zhí)行的一個(gè)或多個(gè)條件診斷操作,其中取決于程序變量,診斷原語和診斷變量中的一個(gè)或多個(gè)的當(dāng)前狀態(tài),來執(zhí)行條件診斷操作??梢源_定一個(gè)或多個(gè)程序變量,診斷原語和/或診斷變量的當(dāng)前狀態(tài)。響應(yīng)于確定滿足條件,可以收集診斷信息。診斷信息可以通過制作過程數(shù)據(jù)的快照來收集??梢燥@示診斷信息的狀態(tài)(例如,向用戶)。診斷原語可以是用于如下的指令:創(chuàng)建斷點(diǎn),刪除斷點(diǎn),啟用斷點(diǎn),禁用斷點(diǎn),改變斷點(diǎn)條件,根據(jù)異常類型啟用異常,根據(jù)類型禁用異常的指令異常,根據(jù)異常被拋出的調(diào)用堆棧調(diào)整異常,執(zhí)行調(diào)試操作(諸如步驟操作)。可以確定診斷變量的狀態(tài)。診斷變量可以是在診斷工作流文件中的調(diào)試操作中使用的變量。
計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)可以包括計(jì)算機(jī)可讀指令,所述計(jì)算機(jī)可讀指令在被執(zhí)行時(shí)使得計(jì)算設(shè)備的一個(gè)或多個(gè)處理器使用診斷工作流文件中提供的指令,來自動(dòng)控制目標(biāo)過程中的儀器化的可執(zhí)行體的診斷操作(過程調(diào)試)。指令可以使處理器收集診斷信息。計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)可以包括收集將被提供給諸如調(diào)試器的診斷工具的診斷信息的其它計(jì)算機(jī)可讀指令。計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)可以包括其他計(jì)算機(jī)可讀指令,其在被執(zhí)行時(shí)將儀器化的代碼插入到功能中以在目標(biāo)過程執(zhí)行時(shí)生成儀器化的功能。計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)可以包括在被執(zhí)行時(shí)確定診斷原語的狀態(tài)的其他計(jì)算機(jī)可讀指令。診斷原語可以是以下操作:創(chuàng)建斷點(diǎn),刪除斷點(diǎn),啟用斷點(diǎn),禁用斷點(diǎn),改變斷點(diǎn)的條件,如果是指定類型則啟用異常,如果是指定類型則禁用異常,根據(jù)異常是否在執(zhí)行步進(jìn)操作的指定調(diào)用堆棧被拋出來調(diào)節(jié)異常。計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)可以包括其它計(jì)算機(jī)可讀指令,其在被執(zhí)行時(shí)確定用于執(zhí)行調(diào)試操作的診斷變量的狀態(tài)。計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)可以包括其他計(jì)算機(jī)可讀指令,其在被執(zhí)行時(shí)確定診斷原語的當(dāng)前狀態(tài)。計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)可以包括其他計(jì)算機(jī)可讀指令,其在被執(zhí)行時(shí)確定在診斷工作流文件中引用的診斷變量的狀態(tài)。
合適的計(jì)算環(huán)境的示例
為了提供本文公開的主題的各個(gè)方面的上下文,圖3和以下討論旨在提供其中可以實(shí)現(xiàn)本文公開的主題的各種實(shí)施例的合適的計(jì)算環(huán)境510的簡要一般描述。盡管在由一個(gè)或多個(gè)計(jì)算機(jī)或其他計(jì)算設(shè)備執(zhí)行的諸如程序模塊的計(jì)算機(jī)可執(zhí)行指令的一般上下文中描述了本文公開的主題,但是本領(lǐng)域技術(shù)人員將認(rèn)識(shí)到,本文公開的主題的部分也可以結(jié)合其他程序模塊和/或硬件和軟件的組合來實(shí)現(xiàn)。通常,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定數(shù)據(jù)類型的例程,程序,對(duì)象,物理制品,數(shù)據(jù)結(jié)構(gòu)等。通常,在各種實(shí)施例中,可以根據(jù)需要組合或分布程序模塊的功能。計(jì)算環(huán)境510僅是合適的操作環(huán)境的一個(gè)示例,并且不旨在限制本文所公開的主題的使用或功能的范圍。
參考圖3,描述了計(jì)算機(jī)512形式的計(jì)算設(shè)備。計(jì)算機(jī)512可以包括至少一個(gè)處理單元514,系統(tǒng)存儲(chǔ)器516和系統(tǒng)總線518。至少一個(gè)處理單元514可以執(zhí)行在諸如但不限于系統(tǒng)存儲(chǔ)器516的存儲(chǔ)器中存儲(chǔ)的指令。處理單元514可以是各種可用處理器中的任何一種。例如,處理單元514可以是圖形處理單元(gpu)。指令可以是用于實(shí)現(xiàn)由上述一個(gè)或多個(gè)組件或模塊執(zhí)行的功能的指令或用于實(shí)現(xiàn)上述方法中的一個(gè)或多個(gè)的指令。雙微處理器和其他多處理器架構(gòu)也可以用作處理單元514。計(jì)算機(jī)512可以在支持在顯示屏上渲染圖形的系統(tǒng)中使用。在另一示例中,計(jì)算設(shè)備的至少一部分可以在包括圖形處理單元的系統(tǒng)中使用。系統(tǒng)存儲(chǔ)器516可以包括易失性存儲(chǔ)器520和非易失性存儲(chǔ)器522。非易失性存儲(chǔ)器522可以包括只讀存儲(chǔ)器(rom),可編程rom(prom),電可編程rom(eprom)或閃存。易失性存儲(chǔ)器520可以包括可以用作外部高速緩存存儲(chǔ)器的隨機(jī)存取存儲(chǔ)器(ram)。系統(tǒng)總線518將包括系統(tǒng)存儲(chǔ)器516的系統(tǒng)物理制品耦合到處理單元514。系統(tǒng)總線518可以是幾種類型中的任何一種,包括存儲(chǔ)器總線,存儲(chǔ)器控制器,外圍總線,外部總線或局部總線,并且可以使用任何各種可用的總線架構(gòu)。計(jì)算機(jī)512可以包括可由處理單元514通過系統(tǒng)總線518訪問的數(shù)據(jù)存儲(chǔ)。數(shù)據(jù)存儲(chǔ)可以包括用于圖形渲染的可執(zhí)行指令,3d模型,材質(zhì),紋理等。
計(jì)算機(jī)512通常包括各種計(jì)算機(jī)可讀介質(zhì),諸如易失性和非易失性介質(zhì),可移動(dòng)和不可移動(dòng)介質(zhì)。計(jì)算機(jī)可讀介質(zhì)可以以用于存儲(chǔ)諸如計(jì)算機(jī)可讀指令,數(shù)據(jù)結(jié)構(gòu),程序模塊或其他數(shù)據(jù)的信息的任何方法或技術(shù)來實(shí)現(xiàn)。計(jì)算機(jī)可讀介質(zhì)包括計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)(也稱為計(jì)算機(jī)存儲(chǔ)介質(zhì))和通信介質(zhì)。計(jì)算機(jī)存儲(chǔ)介質(zhì)包括物理(有形)介質(zhì),例如但不限于ram,rom,eeprom,閃存或其他存儲(chǔ)器技術(shù),cdrom,數(shù)字多功能盤(dvd)或其他光盤存儲(chǔ)器,磁帶盒,磁帶,磁盤存儲(chǔ)或可存儲(chǔ)所需數(shù)據(jù)且可由計(jì)算機(jī)512訪問的其它磁存儲(chǔ)設(shè)備。通信介質(zhì)包括諸如但不限于通信信號(hào),調(diào)制載波或可以使用的任何其它無形介質(zhì)的介質(zhì)以傳送期望的信息并且可以由計(jì)算機(jī)512訪問。
應(yīng)當(dāng)理解,圖3描述了可以充當(dāng)用戶和計(jì)算機(jī)資源之間的中介的軟件。該軟件可以包括可以存儲(chǔ)在磁盤存儲(chǔ)器524上并且可以分配計(jì)算機(jī)512的資源的操作系統(tǒng)528。磁盤存儲(chǔ)器524可以是硬盤驅(qū)動(dòng)器,其通過不可移除存儲(chǔ)器接口(諸如接口526)連接到系統(tǒng)總線518。系統(tǒng)應(yīng)用530利用操作系統(tǒng)528通過存儲(chǔ)在系統(tǒng)存儲(chǔ)器516或磁盤存儲(chǔ)器524中的程序模塊532和程序數(shù)據(jù)534來管理資源。應(yīng)當(dāng)理解,計(jì)算機(jī)可以利用各種操作系統(tǒng)或操作系統(tǒng)的組合。
用戶可以通過輸入設(shè)備536將命令或信息輸入到計(jì)算機(jī)512中。輸入設(shè)備536包括但不限于諸如鼠標(biāo),軌跡球,觸筆,觸摸板,鍵盤,麥克風(fēng)之類的指向設(shè)備,語音識(shí)別和姿勢(shì)識(shí)別系統(tǒng)等。這些和其他輸入設(shè)備經(jīng)由接口端口538通過系統(tǒng)總線518連接到處理單元514。接口端口538可以表示串行端口,并行端口,通用串行總線(usb)等。輸出設(shè)備540可以使用與輸入設(shè)備相同類型的端口。提供輸出適配器542以說明存在一些輸出設(shè)備540,如需要特定適配器的監(jiān)視器,揚(yáng)聲器和打印機(jī)。輸出適配器542包括但不限于提供輸出設(shè)備540和系統(tǒng)總線518之間的連接的視頻和聲卡。其他設(shè)備和/或系統(tǒng)或設(shè)備(例如遠(yuǎn)程計(jì)算機(jī)544)可以提供輸入和輸出能力。
計(jì)算機(jī)512可以使用到一個(gè)或多個(gè)遠(yuǎn)程計(jì)算機(jī)(諸如遠(yuǎn)程計(jì)算機(jī)544)的邏輯連接在聯(lián)網(wǎng)環(huán)境中操作。遠(yuǎn)程計(jì)算機(jī)544可以是個(gè)人計(jì)算機(jī),服務(wù)器,路由器,網(wǎng)絡(luò)pc,對(duì)等設(shè)備或其他常規(guī)網(wǎng)絡(luò)節(jié)點(diǎn),并且通常包括相對(duì)于計(jì)算機(jī)512在上面描述的許多或所有元件,盡管在圖1中僅示出了存儲(chǔ)器存儲(chǔ)設(shè)備546。遠(yuǎn)程計(jì)算機(jī)544可以經(jīng)由通信連接550邏輯地連接。網(wǎng)絡(luò)接口548包括諸如局域網(wǎng)(lan)和廣域網(wǎng)(wan)的通信網(wǎng)絡(luò),但是也可以包括其他網(wǎng)絡(luò)。通信連接550是指用于將網(wǎng)絡(luò)接口548連接到總線518的硬件/軟件。通信連接550可以在計(jì)算機(jī)512的內(nèi)部或外部,并且包括內(nèi)部和外部技術(shù),例如調(diào)制解調(diào)器(電話,電纜,dsl和無線)和isdn適配器,以太網(wǎng)卡等。
應(yīng)當(dāng)理解,所示的網(wǎng)絡(luò)連接僅是示例,并且可以使用在計(jì)算機(jī)之間建立通信鏈路的其他手段。本領(lǐng)域的普通技術(shù)人員可以理解,計(jì)算機(jī)512或其他客戶端設(shè)備可以被部署為計(jì)算機(jī)網(wǎng)絡(luò)的一部分。在這點(diǎn)上,本文所公開的主題可以涉及具有任何數(shù)量的存儲(chǔ)器或存儲(chǔ)單元以及在任何數(shù)量的存儲(chǔ)單元或卷上發(fā)生的任何數(shù)量的應(yīng)用和過程的任何計(jì)算機(jī)系統(tǒng)。這里公開的主題的各方面可以應(yīng)用于如下環(huán)境,該環(huán)境具有部署在網(wǎng)絡(luò)環(huán)境中的服務(wù)器計(jì)算機(jī)和客戶端計(jì)算機(jī),具有遠(yuǎn)程或本地存儲(chǔ)。本文所公開的主題的各方面還可以應(yīng)用于具有編程語言功能,解釋和執(zhí)行能力的獨(dú)立計(jì)算設(shè)備。
本文所描述的各種技術(shù)可結(jié)合硬件或軟件或在適當(dāng)時(shí)與兩者的組合來實(shí)現(xiàn)。因此,本文所述的方法和裝置或其某些方面或部分可以采取體現(xiàn)在諸如軟盤,cd-rom,硬盤驅(qū)動(dòng)器或任何其它機(jī)器可讀介質(zhì)的有形介質(zhì)中的程序代碼(即指令),其中當(dāng)程序代碼被加載到諸如計(jì)算機(jī)的機(jī)器中并由機(jī)器執(zhí)行時(shí),機(jī)器變成用于實(shí)踐本文所公開的主題的各方面的裝置。如本文所使用的,術(shù)語“機(jī)器可讀存儲(chǔ)介質(zhì)”將被理解為排除提供(即,存儲(chǔ)和/或傳輸)任何形式的傳播信號(hào)的任何機(jī)制。在可編程計(jì)算機(jī)上執(zhí)行程序代碼的情況下,計(jì)算設(shè)備通常將包括處理器,處理器可讀的存儲(chǔ)介質(zhì)(包括易失性和非易失性存儲(chǔ)器和/或存儲(chǔ)元件),至少一個(gè)輸入設(shè)備,以及至少一個(gè)輸出設(shè)備??梢岳美缤ㄟ^使用數(shù)據(jù)處理api等等來利用域特定的編程模型方面的創(chuàng)建和/或?qū)崿F(xiàn)的一個(gè)或多個(gè)程序可以以高級(jí)過程或面向?qū)ο蟮木幊陶Z言來實(shí)現(xiàn),用于與計(jì)算機(jī)系統(tǒng)通信。然而,如果需要,程序可以以匯編或機(jī)器語言實(shí)現(xiàn)。在任何情況下,語言可以是編譯或解釋語言,并且與硬件實(shí)現(xiàn)結(jié)合。
圖4示出了集成開發(fā)環(huán)境(ide)600和常規(guī)語言運(yùn)行時(shí)環(huán)境602。ide600可以允許用戶(例如開發(fā)者,程序員,設(shè)計(jì)者,編碼器等)設(shè)計(jì),編碼,編譯,測(cè)試,運(yùn)行,編輯,在計(jì)算機(jī)系統(tǒng)中調(diào)試或構(gòu)建程序,程序集,網(wǎng)站,web應(yīng)用和web服務(wù)。軟件程序可以包括用一種或多種源代碼語言(例如visualbasic,visualj#,c++,c#,j#,javascript,apl,cobol,pascal,eiffel,haskell,ml,oberon,perl,python,scheme,smalltalk等)。ide600可以提供本地代碼開發(fā)環(huán)境,或者可以提供在虛擬機(jī)上運(yùn)行的托管代碼開發(fā),或者可以提供其組合。ide600可以使用.net框架提供托管代碼開發(fā)環(huán)境??梢允褂谜Z言特定源編譯器620從源代碼組件610和本地代碼組件611創(chuàng)建中間語言組件650,并且在執(zhí)行應(yīng)用時(shí)使用中間語言編譯器660(例如,即時(shí)(jit)編譯器)從中間語言組件650創(chuàng)建本地代碼組件611(例如,機(jī)器可執(zhí)行指令)。也就是說,當(dāng)il應(yīng)用被執(zhí)行時(shí),它被編譯同時(shí)被執(zhí)行為用于正被執(zhí)行的平臺(tái)的適當(dāng)?shù)臋C(jī)器語言,從而使代碼在多個(gè)平臺(tái)上可移植?;蛘撸谄渌鼘?shí)施例中,程序可被編譯為適于其預(yù)期平臺(tái)的本機(jī)代碼機(jī)器語言(未示出)。
用戶可以經(jīng)由ide600中的用戶界面640和源代碼編輯器651,根據(jù)已知的軟件編程技術(shù)和與特定源語言相關(guān)聯(lián)的特定邏輯和語法規(guī)則來創(chuàng)建和/或編輯源代碼組件。之后,源代碼組件610可以經(jīng)由源編譯器620來編譯,由此可以創(chuàng)建程序的中間語言表示,諸如組件630。組件630可以包括中間語言組件650和元數(shù)據(jù)642。應(yīng)用設(shè)計(jì)可以在部署之前被驗(yàn)證。
盡管已經(jīng)以結(jié)構(gòu)特征和/或方法動(dòng)作專用的語言描述了主題,但是應(yīng)當(dāng)理解,所附權(quán)利要求中定義的主題不一定限于上述具體特征或動(dòng)作。而是,上面描述的具體特征和動(dòng)作被公開為實(shí)現(xiàn)權(quán)利要求的示例形式。