2011-02-25 97 views
12

在某些類型的代碼中,在不吹動堆棧的情況下導致無限循環相對容易。當使用clojure-test測試這種性質的代碼時,有沒有辦法在不重啓swank服務器的情況下中止當前正在運行的測試?在使用leiningen和swank/slime在emacs中運行clojure測試時停止無限循環

目前我的工作流程已經涉及

$ lein swank 

連接使用slime-connect Emacs在斯旺克,並切換到測試,用C-c C-,執行,測試運行到無限循環,然後就回來,但一個CPU仍在翻騰在測試之外。唯一能夠阻止我發現的方法是重新啓動lein swank,但是這似乎是一個相對常見的問題?任何人有更好的解決方案?

回答

12

是的,這是程序員在開發中編寫無限循環的常見問題:)。答案很簡單。它被稱爲「中斷命令」,它是C-c C-b

Leiningen與此無關。這是SLIME/Swank/Clojure。當你在Emacs中評估代碼時,你正在Clojure中產生一個新的線程。 SLIME保持對這些線程的引用,並向您顯示在Emacs模式行中有多少個正在運行。如果你在圖形環境中,你可以點擊它表示你的命名空間的模式行,並看到很多選項。一種選擇是「中斷命令」

Eval (while true)C-c C-b得到一個對話框顯示一個java.lang.ThreadDeath錯誤,可能只有一個選項。您可以鍵入0q以退出該線程,殺死該錯誤消息緩衝區並將焦點返回到先前的緩衝區。

1

this old discussion,加入(use 'clojure.contrib.repl-utils))(add-break-thread!)到user.clj應使您能夠按C-c C-c傳遞SIGINT給長時間運行的評估/ processe。

+0

我目前的Emacs安裝程序將'C-c C-c'綁定到'slime-interrupt',它的行爲與您的期望相同 – skuro

1

如果其他都失敗.. alt-x slime-quit-lisp並重新啓動REPL。首先嚐試Psyllo的答案。

相關問題