共用方式為


時間移動偵錯 - 概觀

Time travel debugging logo featuring a clock.

什麼是時間移動偵錯?

時間移動偵錯是一項工具,可讓您在進程執行時擷取追蹤,然後稍後再向前和向後重新執行。 時間移動偵錯 (TTD) 可協助您更輕鬆地偵錯問題,方法是讓您「倒轉」調試程式會話,而不需要重現問題,直到您發現 Bug 為止。

TTD 可讓您及時返回,以進一步了解導致 Bug 的條件,並多次重新執行,以瞭解如何最好地修正問題。

TTD 可以優於損毀傾印檔案,這通常會遺漏導致最終失敗的狀態和執行路徑。

如果您無法自行找出問題,您可以與同事共享追蹤,而且他們可以確切查看您正在查看的內容。 這比即時偵錯更容易共同作業,因為錄製的指示相同,而位址位置和程式代碼執行在不同的計算機上會有所不同。 您也可以共用特定時間點,以協助同事找出要開始的位置。

TTD 很有效率,而且可以增加盡可能少的額外負荷,因為它會擷取追蹤檔案中的程式代碼執行。

TTD 包含一組調試程序數據模型物件,可讓您使用 LINQ 查詢追蹤。 例如,您可以使用 TTD 物件來找出載入特定程式代碼模組或找出所有例外狀況。

Screenshot of WinDbg with Time Travel Debugging command and three timelines.

需求

時間移動偵錯與 WinDbg 整合,提供順暢的錄製和重新執行體驗。

若要使用 TTD,您必須提高許可權來執行調試程式。 使用具有系統管理員許可權的帳戶安裝 WinDbg,並在調試程式中錄製時使用該帳戶。 若要提升許可權執行調試程式,請選取並按住 [開始] 功能表 中的 WinDbg 圖示,然後選取 [其他>執行為 管理員 istrator]。

包含錄製的已建立追蹤檔案可能包含個人標識或安全性相關信息,包括但不限於檔案路徑、登錄、記憶體或檔案內容。 確切資訊取決於記錄目標進程活動。 在與其他人共享錄製檔案時,請注意這一點。

TTD.exe命令行錄製公用程式

除了在 WinDbg UI 中錄製追蹤之外,還有TTD.exe命令行公用程式可用來記錄追蹤。

您可能只有需要 TTD 命令行錄製器的情況:在電腦上安裝錄製,而不需要安裝調試程式、進階錄製案例、測試自動化等。在這些案例中,您可以只透過 URL 安裝 TTD 命令行錄製器。 如需詳細資訊,請參閱 時間移動偵錯 - TTD.exe命令行公用程式

偵錯工具的比較

下表摘要說明可用之不同偵錯解決方案的優缺點。

方法 優點 缺點
即時偵錯 互動式體驗,查看執行流程,可以變更目標狀態,熟悉的工具在熟悉的設定。 中斷用戶體驗,可能需要努力重複重現問題,可能會影響安全性,而不一定是生產系統上的選項。 由於重現難以從失敗點恢復運作,以判斷原因。
傾印 根據觸發程式,沒有預先撰寫程式代碼、低侵入性。 後續的快照集或實時傾印提供簡單的「經過一段時間」檢視。 如果未使用,額外負荷基本上為零。
遙測和記錄 輕量型,通常系結至商務案例/用戶動作,機器學習方便使用。 非預期的程式代碼路徑中發生問題(不含遙測)。 缺少數據深度,以靜態方式編譯成程序代碼。
時間旅行偵錯 (TTD) 非常適合複雜的 Bug,不事先撰寫程式代碼、離線可重複偵錯、分析易記、擷取所有專案。 記錄時間的大型額外負荷。 可能會收集更多所需的數據。 數據檔可能會變得很大。

訓練影片

若要深入瞭解 TTD,請參閱這些影片。

重組工具 185 - Ivette 和 JamesP 會瞭解 TTD 的基本概念,並在 WinDbg 中示範一些功能

重組工具 186 - Jordi 和 JCAB 示範 WinDbg 中 TTD 的更多功能

CppCon (YouTube) - Jordi、Ken 和 JamesM 在 CppCon 2017 的 WinDbg 中介紹了 TTD

追蹤檔案基本概念

追蹤檔案大小

追蹤檔案可能會變得很大,且 TTD 的用戶必須確定有足夠的可用空間。 如果您記錄程式數分鐘,追蹤檔案可能會快速成長為數 GB。 TTD 不會設定追蹤檔案的大小上限,以允許複雜的長時間執行案例。 快速重新建立問題,將盡可能縮小追蹤檔案大小。

追蹤和索引檔案

追蹤檔案 (.run) 會在錄製期間儲存程式代碼執行。

一旦錄製停止,就會建立索引檔案 (.idx) 以優化追蹤資訊的存取。 當 WinDbg 開啟追蹤檔案時,也會自動建立索引檔案。

索引檔案也可以很大,通常和追蹤檔案大兩倍。

您可以使用 命令,從追蹤檔案重新建立索引檔案 !tt.index

0:000> !tt.index
Successfully created the index in 10ms.

錄製錯誤和其他錄製輸出會寫入 WinDbg 記錄檔。

所有輸出檔案都會儲存在用戶設定的位置。 預設位置位於用戶文件資料夾中。 例如,針對User1,TTD 檔案會儲存在這裡:

C:\Users\User1\Documents

如需處理追蹤檔案的詳細資訊,請參閱 時間移動偵錯 - 使用追蹤檔案

需要留意的事項

防病毒軟體不相容

您可能會遇到不相容,因為TTD如何攔截到進程來記錄它們。 防病毒軟體或其他嘗試追蹤和陰影系統記憶體呼叫的系統軟體通常會發生問題。 如果您遇到錄製的問題,例如許可權訊息不足,請嘗試暫時停用任何防病毒軟體。

其他嘗試封鎖記憶體存取的公用程式也可能有問題,例如 Microsoft Enhanced Mitigation Experience Toolkit。

另一個與 TTD 衝突的環境範例是電子應用架構。 在此情況下,追蹤可能會記錄,但也可以記錄的進程死結或當機。

僅限使用者模式

TTD 目前僅支援使用者模式作業,因此無法追蹤核心模式程式。

唯讀播放

您可以回到時間,但無法變更歷程記錄。 您可以使用讀取記憶體命令,但無法使用修改或寫入記憶體的命令。

系統保護的進程

某些受 Windows 系統保護的進程,例如受保護的進程光 (PPL) 進程會受到保護,因此 TTD 無法將本身插入受保護的進程,以允許錄製程序代碼。

錄製的效能影響

錄製應用程式或程式會影響計算機的效能。 實際的效能額外負荷會根據錄製期間執行的程式代碼數量和類型而有所不同。 在典型的錄製案例中,您可以預期大約達到 10x-20 倍的效能。 有時候不會明顯變慢,但對於更密集的資源作業(例如檔案開啟對話框),您可以看到錄製的影響。

追蹤檔案錯誤

在某些情況下,可能會發生追蹤檔案錯誤。 如需詳細資訊,請參閱 時間移動偵錯 - 疑難解答

時間移動偵錯的進階功能

以下是一些最值得注意的TTD進階功能。

時間表

時間軸是執行期間發生的事件的可視化表示法。 這些事件可以是的位置:斷點、記憶體讀取/寫入、函數調用和傳回,以及例外狀況。 如需時程表的詳細資訊,請參閱 WinDbg - 時程表

調試程序數據模型支援

  • 內建的數據模型支援 - TTD 包含數據模型支援。 使用 LINQ 查詢來分析應用程式失敗可能是功能強大的工具。 您可以使用 WinDbg 中的數據模型視窗來處理可擴充且可流覽的 'dx' 和 'dx -g' 版本,讓您使用 NatVis、JavaScript 和 LINQ 查詢來建立數據表。

如需調試程序數據模型的一般資訊,請參閱 WinDbg - 數據模型。 如需使用 TTD 調試程式物件模型的相關信息,請參閱 時間移動偵錯 - 時間移動偵錯對象的簡介。

腳本支援

如需使用 JavaScript 和 NatVis 的一般資訊,請參閱 WinDbg - 腳本。

TTD.exe命令行公用程式

TTD.exe命令行公用程式可用來記錄追蹤。 如需詳細資訊,請參閱 時間移動偵錯 - TTD.exe命令行公用程式

Managed 程式代碼 TTD 支援

您可以使用以 64 位模式執行的 SOS 偵錯延伸模組 (sos.dll),在 WinDbg 中使用 TTD 偵錯 Managed 程式代碼。 如需詳細資訊,請參閱 使用 Windows 調試程式偵錯 Managed 程式代碼。

開始使用TTD

請檢閱這些主題來記錄和重新執行追蹤檔案,以及使用追蹤檔案和疑難解答的相關信息。

這些主題描述時間移動偵錯的其他進階功能。