Debuguję aplikację javascript (używając narzędzi deweloperskich Chrome) i chciałbym zmienić niektóre wartości zmiennych podczas przechodzenia przez kod.
Czy to w ogóle możliwe?
Próbowałem i otrzymałem coś takiego:
> modeline
1
> modeline=0
0 <<< seems to work but...
> modeline
1 <<< ups!!
Ale nie mogę znaleźć żadnej dokumentacji, która mówi, co można, a czego nie można zrobić ...
modeline
pochodzi?Odpowiedzi:
Dlaczego ta odpowiedź wciąż jest pozytywna?
Zgodnie z odpowiedzią Mikaëla Mayera , to już nie jest problem, a moja odpowiedź jest przestarzała (
go()
teraz powraca30
po pomieszaniu z konsolą). Zostało to naprawione w lipcu 2013, zgodnie z raportem o błędzie , do którego link znajduje się powyżej w komentarzu Gabrielmaldi . Niepokoi mnie, że wciąż otrzymuję głosy za - sprawia, że myślę, że osoba popierająca nie rozumie ani pytania, ani mojej odpowiedzi.Zostawię tutaj moją pierwotną odpowiedź ze względów historycznych, ale zamiast tego zagłosuj na odpowiedź Mikaëla .
Sztuczka polega na tym, że nie możesz bezpośrednio zmienić zmiennej lokalnej, ale możesz zmodyfikować właściwości obiektu. Możesz także zmodyfikować wartość zmiennej globalnej:
var g_n = 0; function go() { var n = 0; var o = { n: 0 }; return g_n + n + o.n; // breakpoint here }
konsola:
> g_n = 10 10 > g_n 10 > n = 10 10 > n 0 > o.n = 10 10 > o.n 10
Sprawdź wynik
go()
po ustawieniu punktu przerwania i uruchomieniu tych wywołań w konsoli, a zobaczysz, że wynik to 20, a nie 0 (ale niestety nie 30).źródło
1
jest zalogowany. Jaki jest błąd? Czego spodziewałeś się być zalogowany?a
na dowolną (np. 42) w panelu „zakres”, a następnie wznów: rejestrowany jest 1Jest to teraz możliwe w chrome 35 (dziś stan na 11 lipca 2014). Nie wiem jednak, która wersja pozwoliła na to pierwsza.
Właśnie przetestowałem przykład @ gilly3 na moim komputerze i działa.
Otwórz konsolę,
Sources
i kartęSnippets
, dodaj nowy fragment, wklej do niego następujący kod:var g_n = 0; function go() { var n = 0; var o = { n: 0 }; return g_n + n + o.n; // breakpoint here }
Kliknij prawym przyciskiem myszy nazwę fragmentu, kliknij `` Uruchom '' (to jednak nie uruchamia funkcji)
go()
a zwrócony wynik
g_n + n + o.n
to 30.źródło
To potwierdzony błąd w narzędziach deweloperskich Chrome:
http://code.google.com/p/chromium/issues/detail?id=124206
źródło
Tak! Wreszcie! Właśnie wypróbowałem to z Chrome, wersja 66.0.3359.170 (oficjalna kompilacja) (64-bitowa) na komputerze Mac.
Możesz zmienić wartości w zakresach jak na pierwszym obrazku lub za pomocą konsoli jak na drugim obrazku.
źródło
Wygląda na to, że nie.
Umieść punkt przerwania, gdy przestanie przełączać się na konsolę, spróbuj ustawić zmienną. Nie powoduje błędu, gdy przypisujesz mu inną wartość, ale jeśli przeczytasz go po przypisaniu, nie zostanie zmodyfikowany. : - /
źródło
Wydaje się, że Firebug pozwala ci to zrobić.
źródło
Właściwie istnieje obejście. Skopiuj całą metodę, zmień jej nazwę, np. OriginalName () na originalName2 (), ale zmodyfikuj zmienną wewnątrz, aby przyjęła dowolną wartość, lub przekaż ją jako parametr.
Następnie, jeśli wywołasz tę metodę bezpośrednio z konsoli, będzie miała taką samą funkcjonalność, ale będziesz mógł modyfikować wartości zmiennych.
Jeśli metoda jest wywoływana automatycznie, zamiast tego wpisz w konsoli
originalName = null; function originalName(original params..) { alert("modified internals"); add whatever original code you want }
źródło
Jestem w stanie zmodyfikować wartość zmiennej skryptu przez przypisanie w konsoli. Wydaje się najprostsze.
źródło
Nie wiem, dlaczego zespół chrome nie zezwala na tę głupią funkcję ... ale jedynym sposobem, w jaki mogłem z powodzeniem zmienić wartości zmiennych, jest zmodyfikowanie skryptu bezpośrednio w edytorze chrome na karcie „Źródła” (zmienia to zachowanie skryptu, dopóki nie odświeżysz strony), ale zmiany zostaną utracone po odświeżeniu, więc zachowaj ostrożność.
źródło
Miałem ten sam problem, przeszedłem do „Google Chrome - informacje” -> Pomoc i napisano, że muszę ponownie uruchomić przeglądarkę, aby uzyskać najnowsze aktualizacje.
Zrobiłem to i nagle mogę teraz zmienić zmienne lokalne. Po prostu kliknij zmienną, którą chcesz edytować, w oknie Zmienne zakresu i wpisz nową wartość.
Zauważyłem jednak pewne dziwactwa, że musiałem przejść przez kilka niepowiązanych przypisań zmiennych, zanim mogłem zmienić tekst w oknie po prawej stronie (Zmienne zakresu).
źródło
Aby zmodyfikować wartość za każdym razem, gdy uruchamiany jest blok kodu bez konieczności przerywania przepływu wykonywania :
Funkcja „Punkty logowania” w debugerze została zaprojektowana tak, aby umożliwić rejestrowanie dowolnych wartości w konsoli bez przerywania pracy. Ocenia kod wewnątrz przepływu wykonywania, co oznacza, że można go faktycznie używać do zmiany wartości w locie bez zatrzymywania się.
Kliknij prawym przyciskiem myszy numer wiersza i wybierz „Punkt logowania”, a następnie wprowadź wyrażenie przypisania. Wygląda mniej więcej tak:
Uważam, że jest to bardzo przydatne do ustawiania wartości w stan, który w innym przypadku nie byłby łatwy do odtworzenia, bez konieczności przebudowywania projektu z wierszami debugowania. PAMIĘTAJ, aby po zakończeniu usunąć punkt przerwania!
źródło