2013-05-02 15 views
11

Jeśli GHC zajmuje dużo czasu, aby skompilować coś, czy istnieje sposób, aby dowiedzieć się, co robi?Monitorowanie aktywności GHC

Po pierwsze, byłoby miło wiedzieć, czy faktycznie uszkodziłem kompilator (to znaczy, jakoś go w jakiś sposób nieskończoną pętlę), czy też faktycznie robi postępy, ale bardzo powoli.

drugie, byłoby miło wiedzieć dokładnie, jaka część procesu kompilacji GHC ma problemy z. Czy jest to parsowanie, usuwanie lub sprawdzanie typu, optymalizacja rdzenia, generowanie kodu, czy ...?

Czy istnieje jakiś sposób, aby monitorować to, co się dzieje? (Mając na uwadze, że jeśli GHC trwa długo, prawdopodobnie oznacza to, że robi dużo pracy, więc jeśli poprosić o zbyt dużej mocy to będzie ogromne!)

GHC już powie Ci jakie moduły próbuje (ponownie) skompilować. W moim przypadku problemem jest pojedynczy samodzielny moduł. Chciałbym wiedzieć, gdzie GHC utknął.

+1

Można budować profilowaną wersję GHC a następnie za pomocą standardowych narzędzi profilowania zobaczyć co to jest po fakcie. – Davorak

+5

Możesz poprosić go o rozmowę, określając poziom szczegółowości "-v4", informując o ** tym, co się dzieje - tak, wynik będzie ogromny, ale jeśli chcesz go tylko monitorować, pozwól mu przejść do terminal, który zwykle pamięta tylko ostatnie 1000 linii. –

+1

Z mojego doświadczenia wynika, GHC wchodząc w nieskończoną pętlę można rozpoznać, ponieważ nic produktywnego byłoby to robić powoli ogólnie sprawia, że ​​jedzą dużo pamięci, jak również ... –

Odpowiedz

4

Po komentarzu Daniela Fischera, próbowałem działa GHC z różnymi opcjami oznajmiania.

  • -v1: Wydrukowano nieco więcej, ale nic podczas głównego etapu kompilacji.
  • -v2: Informuje, jak krok GHC jest aktualnie robi (parser, desugar, wyboru typu Simplifier, etc). To jest to, czego właściwie chciałem.
  • -v3: Pojawia się, aby Simplifier faktycznie zrzucić, co robi do konsoli - zły pomysł podczas kompilacji 8MB kodu źródłowego!

Wygląda więc na to, że -v2 jest miejscem rozpoczęcia.

(W konkretnym przypadku programu, które spowodowały to pytanie wydaje GHC spędza zawsze w fazie rodzaj kontroli).

+0

Jeśli jest to typ sprawdzania, to może być zatrzymany w nieskończoną pętlę rozwiązywania nierozpoznawalne instancje. Wnioskowanie typu może również stanowić problem, ponieważ wnioskowanie H-M ma * straszliwą * najgorszą złożoność czasu. To są jedyne rozsądne przyczyny, które mogę wymyślić. Czy kiedykolwiek rozwiązałeś problem? –

+0

@ C.A.McCann Próbowałem tylko skompilować plik źródłowy _huge_. Nie zawiera niczego szczególnie niezwykłego, jest po prostu bardzo, bardzo duży. "Rozwiązałem" problem, zmniejszając go. – MathematicalOrchid