2013-07-18 37 views
6

Za pomocą inspektora węzła nie można ustawić punktu przerwania w następującym kodzie node.js. (Zawartość main.js)Nie można ustawić punktu przerwania wewnątrz funkcji podczas używania wymaga wewnętrznego zamknięcia.

(function() { 
    require('underscore'); 

    var doSomething = function(callback) { 
     callback('doSomething Finished'); 
    } 

    doSomething(function(x) { 
     console.log(x); 
    }); 

}).call(this); 

można łatwo ustawić punkt przerwania na linii 2, wiersz 4 lub 8 linii, jednak bez względu na to jak bardzo się staram debuggera nie pozwoli mi ustawić punkt przerwania na linii 5 lub linia 9. aby być jasne, używam następujące polecenia, aby uruchomić węzeł inspektor

node --debug-brk main.js 
node-inspector 

próbowałem też debugować w internetowej burzy, jednak problem nadal występuje. Jeśli usuniemy linię require('underscore');, problem natychmiast zniknie i będę mógł ponownie ustawić punkt przerwania w treści funkcji. Problem również ustępuje, jeśli usunę najbardziej zewnętrzną funkcję zamykania. Wygląda na to, że interakcja między require a zamknięciem poziomu pliku powoduje wkręcenie funkcjonalności debugowania węzła. Czy ktoś osobiście doświadczył tego problemu i/lub zna wszelkie obejścia, aby móc włamać się do ciała funkcjonalnego?

EDIT: wersja mojego węzła js

Tony:~ $ node --version 
v0.10.12 
Tony:~ $ 
+0

Masz tutaj tag requirejs. Czy naprawdę używasz requierjs w węźle? Prawdopodobnie nie. –

+0

Myślałem, że requirejs zapewnia wywołanie 'require', czy tak nie jest? – Tony

+0

Nie, wymaganie jest dostarczane przez środowisko wykonawcze nodejs. Jest to część specyfikacji specyfikacji CommonJS. –

Odpowiedz

3

To nie może być odpowiedź, którą chcesz usłyszeć, jak to nie wyjaśnia, dlaczego nie można ustawić żadnych punktów przerwania, ale ja po prostu usunąć swój wymagają oświadczenie z zamknięcia i umieść go na najwyższym poziomie. Posunąłbym się jeszcze dalej i zaleciłbym, abyś nie używał zamknięcia takiego jak wyżej.

Powód jest taki, że węzeł używa własnego systemu modułów, a w przeciwieństwie do Javascript w przeglądarce deklarowanie zmiennych na najwyższym poziomie nie zanieczyszcza globalnej przestrzeni nazw. W tym miejscu wymagane jest (...), więc nic nie zyskujesz przez zawijanie kodu w natychmiast wywoływanej funkcji (chyba, że ​​chcesz, aby twój moduł działał zarówno po stronie klienta, jak i po stronie serwera).

Przypuszczam, że powodem, dla którego nie można ustawić żadnych punktów przerwania, jest to, że środowisko wykonawcze V8 rozpoznaje niepotrzebne zamknięcie, a następnie optymalizuje kod. Odtworzony kod może nie mieć poprawnego mapowania źródła, więc nie można ustawić punktów przerwania.

Więc, dwie propozycje:

  1. wymagają połączenia nie są jak zwykłe oświadczenia. Są bardziej podobne do instrukcji importu w Javie i są obsługiwane przez kompilator. Powinny zawsze być najwyższego poziomu w pliku węzła.
  2. Nie trzeba owijać kodu w anonimową funkcję w węźle.
+0

Rozumiem, to bardzo pomocne. Istnienie zamknięcia na najwyższym poziomie jest spowodowane kompilacją CoffeeScript. Pominąłem ten szczegół, aby pytanie było bardziej zawężone.Czy to oznacza, że ​​powinienem zmusić skrypt do kawy do kompilacji bez zamknięcia na najwyższym poziomie, aby obejść problem? Wypróbuję to i zgłoś wyniki. – Tony

11

Przebiegłem dokładnie ten sam problem z tą samą konfiguracją.

Dodałem punkt przerwania po definicję funkcji docelowej (to było jedyne miejsce, w którym mógłbym dodać punkt przerwania). Gdy debugger osiągnął ten punkt przerwania, a funkcja została faktycznie zdefiniowana, mogłem dodać punkty przerwania do rzeczywistej funkcji docelowej ...

+2

Zdecydowanie lepsza odpowiedź niż zaakceptowana. – mbochynski

+0

To dzięki! Zanim punkt przerwania znikał natychmiast, ale po umieszczeniu punktu przerwania później działa. dzięki :) –