2011-01-14 21 views
3

我想知道當我調試Scala代碼而不是Java代碼時,它對調試器(Intellij IDEA + Scala插件)​​有什麼不同。據我的理解,調試器與語言緊密結合,即Java調試器無法處理Scala代碼,但顯然JVM是關注的中心,這意味着只要它是字節碼,任何調試器都可以做到。對 ?它是否對調試器有所不同,它是我正在調試的Scala代碼?

重要更新:問題是給出一個字節碼調試器如何限制Scala的例子。假設有一個斷點,我不想去下一行,但我希望調試器在應用程序的上下文中評估一個Scala表達式(例如,我喜歡從一個單例對象調用一個操作符方法)。調試器卡住了,因爲它不能理解Scala。我必須自己完成這個轉換,然後把最終的Java輸入到調試器中。 問題是隻能在字節碼級別處理「斷點」。如果你想把一個表達置於監視下怎麼辦?調試器必須瞭解Scala來評估觀察到的表達式,對嗎?這一次我確定我是對的。復仇是我的,主耶穌;-)

回答

8

簡短的回答你的假設是錯誤的。

原因是調試器不關心你的調試語言。它停止在包含特定源文件的行的斷點處。請注意,源文件只是供您閱讀的文本 - 調試器從不掃描源文件。如果將源文件的位置更改爲具有正確目錄中的文本文件的另一個目錄,並將正確的文件名作爲已設置的斷點,則調試程序將在斷點發生時高興地顯示它。每次你設置一個斷點時,你的IDE都會告訴調試器嗨掃描這個類的這一行上的任何字節碼,並在你點擊它時停止。如果你的IDE試圖將相同的文本文件編譯成類文件,這當然是行不通的 - 但是如果你創建假文本文件作爲jar文件的源文件並執行源文件映射的話,它就會工作。

如果有人想到它,編寫一個簡單的模板並編譯它,同時支持調試並不困難。只需使用asm創建所有打印語句,並告訴asm此打印語句來自此行上的模板文件。之後,你可以添加更聰明的東西,同時保持可調試性。

+0

這是真的,但它給Scala帶來了挑戰,因爲一行Scala代碼通常包含很多步驟,因爲它基於更多表達式,所以在線級調試Scala遠不如Java中的行級調試,這往往會在每一行有更多的單獨行動。在EPFL中有一些人正在尋找爲Scala生成的類文件添加額外的調試信息來支持更好的專業Scala調試器。 – 2011-01-14 10:55:25

相關問題