使用輕量進(jìn)程快照的歷史軟件診斷的制作方法
【專利說明】使用輕量進(jìn)程快照的歷史軟件診斷
[0001] 背景
[0002] 傳統(tǒng)的軟件診斷工具(諸如調(diào)試器、剖析器以及存儲器診斷工具)通常對實況的、 正在運行的進(jìn)程或保存的、重量進(jìn)程狀態(tài)(諸如進(jìn)程轉(zhuǎn)儲文件或歷史軌跡)進(jìn)行操作。實 況的進(jìn)程提供關(guān)于進(jìn)程如何達(dá)到其當(dāng)前狀態(tài)的很少的歷史上下文或不提供關(guān)于進(jìn)程如何 達(dá)到其當(dāng)前狀態(tài)的歷史上下文。在冗長的同時,創(chuàng)建和分析進(jìn)程轉(zhuǎn)儲文件是極其重量且耗 時的。
[0003] 對于軟件開發(fā)者而言,在診斷進(jìn)程期間分析歷史數(shù)據(jù)是普遍的。例如,在調(diào)試時, 開發(fā)者可能想要檢查進(jìn)程,像其存在于先前狀態(tài)中而非當(dāng)前狀態(tài)中的那樣。對于存儲器診 斷,開發(fā)者經(jīng)常想要查看隨著時間在進(jìn)程的存儲器中的改變。
[0004] 在生產(chǎn)場景和開發(fā)場景兩者中,不侵略性且不破壞性地收集診斷數(shù)據(jù)是重要的。 在生產(chǎn)中,診斷工具應(yīng)當(dāng)對生產(chǎn)進(jìn)程和系統(tǒng)具有很少影響或不具有影響。使用現(xiàn)有的方案 來對進(jìn)程狀態(tài)數(shù)據(jù)進(jìn)行收集可能以不期望的方式影響進(jìn)程和系統(tǒng)。
【發(fā)明內(nèi)容】
[0005] 提供本概述是為了以簡化的形式介紹將在以下【具體實施方式】中進(jìn)一步描述的概 念選擇。本概述并不旨在標(biāo)識所要求保護(hù)的主題的關(guān)鍵特征或必要特征,也不旨在用于限 制所要求保護(hù)的主題的范圍。
[0006] 調(diào)試和診斷系統(tǒng)允許用戶取得實況的被調(diào)試進(jìn)程的輕量進(jìn)程快照,因此用戶可以 在稍后時間分析這些快照??梢栽谏a(chǎn)場景中使用調(diào)試和存儲器診斷系統(tǒng),因為它在將對 生產(chǎn)系統(tǒng)的破壞最小化的同時依然允許用戶捕捉進(jìn)程狀態(tài)的快照。輕量進(jìn)程快照允許對 進(jìn)程的調(diào)用棧、變量值、存儲器、模塊列表、線程列表等等的檢查,同時允許原始進(jìn)程繼續(xù)執(zhí) 行。
[0007] 快照機(jī)制允許診斷工具將原始進(jìn)程和一個或多個進(jìn)程快照進(jìn)行比較,或?qū)⒁幌盗?進(jìn)程快照中的任意快照相互比較。所述快照機(jī)制還允許用戶檢查進(jìn)程存儲器的快照,同時 允許原始進(jìn)程以最小影響方式繼續(xù)運行。
[0008] 在此所用的術(shù)語輕量進(jìn)程快照或"快照"意指可以在不需要創(chuàng)建進(jìn)程的執(zhí)行或存 儲器的完整軌跡的情況下被有效創(chuàng)建的進(jìn)程的副本。在典型的實施例中,操作系統(tǒng)在虛擬 存儲器模型的頂部實現(xiàn)快照機(jī)制,并且使用共享存儲器頁和寫時復(fù)制技術(shù)來避免對創(chuàng)建進(jìn) 程的完整副本的需求。寫時復(fù)制允許操作系統(tǒng)將原始進(jìn)程的整個地址空間的實際頁快速映 射到第二進(jìn)程快照中。
[0009] 如果原始進(jìn)程在快照后執(zhí)行,則由原始進(jìn)程作出的任意存儲器寫將導(dǎo)致該存儲器 頁的副本被創(chuàng)建。然而,只有被進(jìn)程執(zhí)行實際修改的頁將具有創(chuàng)建的副本。未被修改的頁 在原始進(jìn)程和任意進(jìn)程快照之間共享。
[0010] 存儲器診斷系統(tǒng)允許通過執(zhí)行進(jìn)程快照中的收集代碼對進(jìn)程存儲器信息進(jìn)行收 集,同時允許原始進(jìn)程繼續(xù)分開地運行。存儲器診斷系統(tǒng)可用對于目標(biāo)進(jìn)程而言最小的破 壞和存儲器開銷來以進(jìn)程外方式收集目標(biāo)進(jìn)程存儲器信息。用戶可攝取實況的被調(diào)試進(jìn)程 的存儲器的兩個或更多個快照并比較這些快照來尋找隨著時間的存儲器使用方面的改變。 [0011] 如果隨著時間被攝取的多個進(jìn)程快照的共享存儲器的大部分保持未被改變,則相 比于使用存儲器轉(zhuǎn)儲,該多個進(jìn)程快照可以較輕的方式被一起使用。使用隨著時間的多個 快照,快照數(shù)據(jù)可與基線進(jìn)行比較或在快照之間進(jìn)行比較。附加的歷史快照可被部分讀取 來分析隨時間的趨勢。
[0012] 存儲器診斷系統(tǒng)可在收集時應(yīng)用數(shù)據(jù)抽象,其允許多個收集被交叉參考。系統(tǒng)可 基于歷史收集數(shù)據(jù)來動態(tài)且自動地調(diào)整快照收集速率,其將在使用進(jìn)程快照時最小化資源 使用。
[0013] 通過使用進(jìn)程快照,來自進(jìn)程內(nèi)收集的存儲器開銷可通過將該收集移動到快照進(jìn) 程來被減少。例如,在進(jìn)程內(nèi)組件的情況下,存儲器被針對其收集信息的進(jìn)程所消耗。該信 息可被存儲在目標(biāo)進(jìn)程的快照中。這將不會影響目標(biāo)進(jìn)程的性能或由于對診斷信息的收集 而潛在地導(dǎo)致其達(dá)到存儲器用盡條件。因此,這種技術(shù)極大地減少了破壞原始進(jìn)程的機(jī)會。
【附圖說明】
[0014] 為了進(jìn)一步闡明本發(fā)明的各實施例的以上和其他優(yōu)點和特征,將參考附圖來呈現(xiàn) 本發(fā)明的各實施例的更具體的描述??梢岳斫猓@些附圖只描繪本發(fā)明的典型實施例,因此 將不被認(rèn)為是對其范圍的限制。本發(fā)明將通過使用附圖用附加特征和細(xì)節(jié)來描述和解釋, 附圖中:
[0015] 圖1示出用輕量進(jìn)程快照的歷史調(diào)試。
[0016] 圖2示出根據(jù)一個實施例的輕量進(jìn)程快照。
[0017] 圖3是示出用于進(jìn)程內(nèi)收集場景的方法的流程圖。
[0018] 圖4是根據(jù)一個實施例示出用于用戶驅(qū)動的診斷收集的方法的流程圖。
[0019] 圖5示出了通過針對輕量進(jìn)程快照進(jìn)行檢查,同時允許真實的被調(diào)試進(jìn)程繼續(xù)運 行的較不侵略性調(diào)試。
[0020] 圖6示出了按需存儲器數(shù)據(jù)收集和檢查實施例。
[0021] 圖7解說了其上可以實現(xiàn)輕量進(jìn)程快照實施例的適當(dāng)?shù)挠嬎愫吐?lián)網(wǎng)環(huán)境的示例。
【具體實施方式】
[0022] 輕量進(jìn)程快照可與目標(biāo)進(jìn)程在其上運行的操作系統(tǒng)合作來被創(chuàng)建。相比于要求診 斷工具親自創(chuàng)建快照,這允許快照被快得多地并使用較少的系統(tǒng)資源來被創(chuàng)建。在一個實 施例中,操作系統(tǒng)的存儲器映射機(jī)制和寫時復(fù)制(copy-onirite)被用于在目標(biāo)進(jìn)程的地 址空間中映射到新的快照進(jìn)程。進(jìn)程快照可以是使用頁表復(fù)制和寫時復(fù)制操作的對正在執(zhí) 行的進(jìn)程的克隆。進(jìn)程快照可通過其它方式被創(chuàng)建,諸如通過在目標(biāo)進(jìn)程上反射或復(fù)制目 標(biāo)進(jìn)程的存儲器地址。
[0023] 如果原始進(jìn)程被允許運行,則新的存儲器頁副本在進(jìn)程向每頁進(jìn)行寫時被創(chuàng)建。 這可對原始進(jìn)程的性能具有一些最小影響,但是它必須僅在當(dāng)某頁被實際寫入時創(chuàng)建實際 頁。
[0024] 在一些實施例中,進(jìn)程狀態(tài)可被診斷工具復(fù)制。例如,進(jìn)程快照機(jī)制可能不對模塊 列表或線程列表進(jìn)行快照,但是診斷工具可快速地創(chuàng)建模塊列表或線程列表的快照并不以 復(fù)制進(jìn)程堆或棧所需要的方式來消耗資源。
[0025] 輕量進(jìn)程快照模型在調(diào)試會話期間啟用歷史調(diào)試的模式。隨著時間的被調(diào)試進(jìn)程 的快照允許用戶查看被調(diào)試進(jìn)程的狀態(tài),就好像其在快照被攝取時所存在的那樣。用戶可 控制何時快照被攝取或調(diào)試器可在某個預(yù)定的觸發(fā)或事件后自動地攝取快照。系統(tǒng)的物理 和邏輯資源是對一次可為進(jìn)程創(chuàng)建的快照的數(shù)量的唯一限制。這使得調(diào)試會話一次具有存 在于系統(tǒng)中的多個快照成為可能。
[0026] 在一個實施例中,當(dāng)開發(fā)者希望檢查處于存在于特定時間處的狀態(tài)中的進(jìn)程時, 開發(fā)者從可用快照列表中選擇對應(yīng)于那個時間的快照。一旦快照被選擇,其可被用作調(diào)試 器的數(shù)據(jù)源以供檢查。在這個模式中,使用快照數(shù)據(jù)一而非實況的進(jìn)程一來生成所有調(diào)試 器視圖,包括但不限于調(diào)用棧、變量值、存儲器、模塊列表和線程列表。這使得開發(fā)者能夠查 看在所選時間處的進(jìn)程的狀態(tài)。
[0027] 使用這個模型,一些狀態(tài)可能是不可被檢查的。例如,可能不能為內(nèi)核或其它實體 (諸如文件或管道)中的狀態(tài)生成快照。然而,通過與操作系統(tǒng)的充分合作,有可能將這個 機(jī)制擴(kuò)展到不僅僅是對進(jìn)程狀態(tài)進(jìn)行快照并包括這些外部實體的副本。
[0028] 實況的進(jìn)程調(diào)試器通常使用存儲器讀取原語和線程上下文原語來用于數(shù)據(jù)檢 查。當(dāng)調(diào)試器需要獲得特定數(shù)據(jù)片段的值時,調(diào)試器查詢符號信息來確定它駐留在被調(diào)試 進(jìn)程存儲器中的何處。這可例如要求讀取線程寄存器狀態(tài)。調(diào)試器接著使用函數(shù)(諸如 Win32? ReadProcessMemory (讀取進(jìn)程存儲器)和GetThreadContext (獲得線程上下文) 函數(shù))來從進(jìn)程中讀取想要的數(shù)據(jù)。當(dāng)調(diào)試器切換到作為數(shù)據(jù)源的進(jìn)程快照時,讀取是簡 單地從快照進(jìn)程讀取。
[0029] 圖1示出用輕量進(jìn)程快照的歷史調(diào)試。調(diào)試器進(jìn)程101被用于調(diào)試被調(diào)試進(jìn)程 102。調(diào)試器進(jìn)程101具有允許用戶分析被調(diào)試進(jìn)程的組件的用戶界面。例如,用戶界面可 以提供示出調(diào)用棧103、模塊104、線程105和變量檢查106的窗口。被調(diào)試進(jìn)程102包括, 例如,線程107、模塊108和虛擬存儲器頁表109。虛擬存儲器109指向由操作系統(tǒng)的虛擬 存儲器管理器110所管理的物理存儲器頁111。
[0030] 在調(diào)試會話期間,創(chuàng)建輕量進(jìn)程快照112和113。這些是在特定時間攝取的被調(diào)試 進(jìn)程102的快照??梢杂捎脩羰謩影l(fā)起快照112、113,或者調(diào)試器101可以在當(dāng)觀察到特定 事件或觸發(fā)時或以某些間隔自動生成快照112、113。
[0031] 快照112包括線程表114和模塊表115,它們是在快照112被創(chuàng)建的時刻(Tl)時 調(diào)試器101的內(nèi)部表的副本。虛擬存儲器頁表116指向在快照112被創(chuàng)建的時刻Tl時所 使用的物理存儲器頁110。最初,虛擬存儲器109和虛擬存儲器116將是等同的;然而,隨 著被調(diào)試進(jìn)程繼續(xù)運行,虛擬存儲器109將改變,因為它的頁表指向了經(jīng)更新的存儲器位 置 110。
[0032] 類似地,在另一時刻(T2),響應(yīng)于用戶選擇或由調(diào)試器進(jìn)程101所觀察到的事件 或觸發(fā)的出現(xiàn),創(chuàng)建進(jìn)程快照113??煺?13包括在當(dāng)該快照和當(dāng)時的虛擬存儲器頁表119 的副本一起被創(chuàng)建的時刻T2時的線程表117和模塊表118的副本。
[0033] 快照112、113允許調(diào)試器進(jìn)程101或用戶回看在快照112、113被創(chuàng)建的時刻 (Tl, T2)被調(diào)試進(jìn)程102看起來像什么,盡管被調(diào)試進(jìn)程102在此期間已經(jīng)被改變。并且, 調(diào)試器進(jìn)程可以比較被調(diào)試進(jìn)程102和/或進(jìn)程快照112、113之間的狀態(tài)以生成在不同的 時間的不同進(jìn)程狀態(tài)之間的差異,這樣用戶可以查看進(jìn)程的哪個部分已經(jīng)被改變以及如何 被改變。