2017-02-08 47 views
5

嗯......我的老師,我的一些同學和我將建立一個調試器項目。我們希望我們的調試器是交互式的,也就是說,當輸入代碼時,結果將在幾秒鐘後的某個位置顯示,並且輸入代碼更改時結果會改變。另一方面,運行時,我們可以將 回滾到前一行或斷點「時間旅行調試器」的原理是什麼?

按照我老師的說法,編程時會涉及到「時間旅行調試」技術。我搜索了一些由其他人維護的項目,但我很難理解代碼,並且在這些自述文件中沒有關於此技術的介紹。

參考: https://github.com/mattgodbolt/compiler-explorer

+5

您的老師可能是Dr. Who的粉絲嗎? 「時間旅行編譯」不是一個標準術語。這似乎是他們創造的一句話。你可以問他們他們的意思。 –

+0

這是關於能夠在調試器中設置斷點,然後通過語句執行*反向*查看運行時環境在斷點之前的點*處的狀態。 – Pointy

+0

對於*編譯器*來說,它確實沒有太多的用處,真的;這是一個運行時系統的事情。那麼,我*猜測*編譯器可以生成代碼來維護某種審計上下文,但這似乎是一種非常奇怪的做事方式。 – Pointy

回答

6

這是最通常被稱爲「時間旅行調試」,並經常與「官能團反應編程」相關聯。 (這些是您可以輕鬆搜索的術語。)Elm Language博客上有一些合理的可訪問文檔(例如,time travel made easy),但我建議您從開始處開始,而不是潛入中間,並且必須時間旅行理解(一些雙關意圖:-))

嚴格地說,時間旅行調試是在運行時發生的事情,但如果您使用的是函數式語言(如Haskell,Elm,OCAML或各種編程語言其他時間移動調試器已經實現),編譯這些語言(是的,它們被編譯)涉及一些有趣的概念。

Elm編譯爲javascript,這使得它相對容易實驗。

與項目玩得開心。

+0

AFAIK它可以與所有純函數式編程一起使用,爲什麼要將它限制爲功能反應? –

+0

@Guy:我不是。實際上,它也可以用於非功能性編程;有一個JavaScript的時間旅行調試器,它絕對不是一種功能性編程語言。我說的是,它通常與FRP相關,FRP旨在爲OP提供一些指示以搜索更多信息。我在第二段中將OCAML添加到了函數式語言列表中。 – rici

+0

您可能還想提及[Visual Studio IntelliTrace](https://msdn.microsoft.com/en-us/library/dd264915.aspx) –

1

時間旅行調試也被稱爲逆向調試。通俗地說,你可以反覆調試同一行(不停止/重新啓動應用程序)。

例如,您正在調試在第10行拋出異常的方法,以找到異常的原因,您可以再次從先前的點執行該方法,讓我們說第4行,而無需重新啓動完整的調試過程。這都是實時和非常高效的。

我在Visual Studio中使用了此功能。

相關問題