2013-05-02 77 views
11

如果GHC花費很長時間來編譯某些東西,有沒有辦法找出它在做什麼?首先,很高興知道我是否真的崩潰了編譯器(即將它放入某種無限循環),或者它實際上正在取得進展,但速度非常緩慢。其次,很高興知道GHC在編譯過程中遇到什麼問題。它是解析,或者是desugaring,或者類型檢查,或者核心優化,或者代碼生成,或者......?監測GHC活動

有什麼方法可以監視發生了什麼? (請記住,如果GHC需要很長時間,這可能意味着它做了很多工作,所以如果你要求輸出太多,這將會是巨大的)

GHC已經告訴你哪些模塊它試圖(重新)編譯。就我而言,問題是一個單獨的自包含模塊。我想知道GHC卡在哪裏。

+1

你可以建立GHC的成型版本,然後使用標準的分析工具來查看事後要做什麼。 – Davorak 2013-05-02 22:50:51

+5

你可以通過指定一個詳細程度來讓它變得健談--v4告訴你很多**正在發生什麼 - 是的,輸出將是巨大的,但是如果你只是想監視它,讓它去終端,通常只記得最後的1000行左右。 – 2013-05-02 22:51:09

+1

根據我的經驗,GHC進入一個無限循環可以被識別,因爲任何生產效率它會這樣做慢慢地通常會使它吃很多內存以及... – 2013-05-03 14:02:50

回答

4

按照Daniel Fischer的評論,我試着用不同的冗長選項來運行GHC。

  • -v1:產生了更多的輸出,但在主編譯步驟中沒有任何輸出。
  • -v2:告訴你GHC目前正在做什麼(解析器,desugar,類型檢查,簡化器等)。這幾乎是我想要的。
  • -v3:似乎使簡化程序實際上將所做的操作轉儲到控制檯 - 編譯8MB源代碼時出現錯誤的想法!

所以看起來-v2是開始的地方。

(在促使這一問題的方案的具體情況,似乎GHC在類型檢查階段永花)

+0

如果它是類型檢查,它可能被卡在一個無限循環解決不可判定的事例。類型推斷也可能是一個問題,因爲H-M推論具有*糟糕的*最壞情況時間複雜度。這些是我能想到的唯一合理的原因。你有沒有解決這個問題? – 2013-05-06 15:29:38

+0

@ C.A.McCann我只是想編譯一個_huge_源文件。它不包含任何特別不尋常的東西,它只是非常非常大。我通過使問題變得更小來「解決」了問題。 – MathematicalOrchid 2013-05-07 18:42:40