2010-05-18 84 views
5

歷史調試器能夠將程序狀態(包括當前指令)恢復到以前的狀態。這在託管或非託管環境中如何實現?我無法想象調試器在每條指令上都會拍攝整個系統的狀態鏡頭。歷史調試器如何工作?

+0

它有一個內置的天文鐘。大多數天文鐘只有一個吸氣器,但這個也有一個二傳手。請參閱頁碼。 15安裝指南 - 安裝微型蟲洞。 – mdma 2010-05-18 23:40:21

回答

4

這樣做的一種方法是記錄系統中非確定性的來源(I/O,中斷)並以不同的時間間隔拍攝狀態快照。這樣,通過恢復到以前的快照並使用記錄的非確定性向前播放,您可以「倒帶」,直到您在過去達到您想要的位置。

例如,假設下面的時間表:

1 2   3  4 
| |   |  | 
  1. 計劃啓動
  2. 由歷史調試
  3. 在該用戶想退
  4. 現在
  5. 時間點採取國家快照

假設用戶想要t o回到第3點。你可以通過恢復系統狀態來做到這一點(例如,存儲器,寄存器)指向2並讓系統照常執行,直到它到達點3.當需要從磁盤,網絡或某些其他非確定性來源獲取數據時,歷史調試器可以使用其記錄的信息來提供數據。對用戶來說,似乎程序的狀態只是簡單地恢復到了第3點。

我相信這是VMWare's Replay Debugger工作原理的簡化視圖(另請參閱tech talk)。

+0

有趣的想法,聽起來很合理。你知道任何流行的歷史調試器是否真的使用這種方法嗎?你知道其他方式正在使用,以實現相同的目標嗎? – mafu 2010-05-19 08:29:43

0

它可能需要每次狀態的快照,但只有保留狀態之間的增量(當然,這是不可能說任何人真正是如何工作的不看它的代碼)。

2

好吧,最重要的是,它們不會在的每條指令處快照,只是在各種「興趣點」(例如,拋出異常時,某些方法被調用時等)。例如,微軟的IntelliTrace(在VS2010中)快照訪問文件系統和註冊表,與WinForms UI交互等等。

其次,它沒有快照整個程序狀態。例如,當您訪問文件時,IntelliTrace會記錄文件的名稱,您要求的訪問權限等等 - 但您不能回到那個位置並查看每個全局變量的狀態。

我不知道其他歷史調試器,但這就是IntelliTrace在VS2010中的工作原理。