2012-01-08 16 views
6

Istnieje zewnętrzna biblioteka, z którą pracuję, która często wiąże mój procesor. Chciałbym pomóc autorowi naprawić ten błąd (tak jak naprawdę podoba mi się biblioteka), ale nie wiem, jak poprawnie usunąć awarię.Jak debugować Empsa, który powoduje awarię Emacsa/używa 100% CPU?

Wszelkie wskazówki dotyczące debugowania Empsa LISP? Miej na uwadze, że kiedy się zawiesza, Emacs już nie działa i muszę go zabić (aby rozwiązania w samym Emacsie nie były pomocne).

Edit: Należy wyjaśnić, że jest to bajt skompilowany, a kwestia ta nie zawsze zdarza się dla innych, więc może to być specyficzne dla moich architektonicznych/init plików. Jest to zdecydowanie związane z tą biblioteką.

+0

Jeśli to nie jest nieskończona pętla, ale po prostu bardzo skomplikowany kod, czy rozważałeś próbę skompilowania go przed użyciem? –

+0

Jest skompilowany bajtowo. W każdym razie dzięki! –

+0

Nie jestem dobry w śledzeniu i podejrzewam, że nie jesteś, ale dołączenie do debuggera i wydrukowanie śladu może nieco zawęzić wyszukiwanie. Poza tym, skypuj kod za pomocą odbitek do debugowania ... – tripleee

Odpowiedz

6

Po pierwsze, zawsze debuguj nieskompilowaną wersję programu Emacs-Lisp, chyba że jesteś przekonany, że problem został wprowadzony przez kompilator bajtów.

Po drugie, jeśli kod zawiesza się w Emacs, kod prawdopodobnie znajduje się w nieskończonej pętli z wartością niezałamienia związaną z inhibit-quit. Pierwszą rzeczą do zrobienia jest przejście przez źródło do biblioteki i zmiana wszystkich odwołań z inhibit-quit na coś innego, aby C-g działało, aby zatrzymać pętlę. Następnie załaduj bibliotekę, ustaw debug-on-quit na t i powinieneś uzyskać ładną ścieżkę debugowania, gdy naciśniesz C-g, który pokazuje, gdzie kod się zapętla. Stamtąd debugowanie problemu powinno być tak proste, jak debugowanie dowolnej innej nieskończonej pętli.

+0

Problem z używaniem go niezkładanego polega na tym, że zasadniczo nie nadaje się do użytku ze względu na jego wydajność. Zobaczę, czy są jakieś wywołania 'inhibit-on-quit' w bazie kodu, to jest dobre połączenie. –

+0

Nie ma żadnych wywołań 'inhibit-na-quit'. Spróbuję czegoś 'debug-on-quit'. –

+0

inhibit-quit not inhibit-on-quit. Zazwyczaj będzie to związane w następujący sposób: (let ((inhibit-quit t) ...) ... jakiś kod ...) –

Powiązane problemy