Czy można zmienić wartości zmiennych javascript podczas debugowania w Google Chrome?

81

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ć ...

tato
źródło
Prześlij kod. Skąd modelinepochodzi?
Emil Ivanov,
4
@Emil: Czy to ważne? modeline jest zmienną globalną, próbowałem również zmodyfikować ją za pomocą window.modeline z tymi samymi wynikami. Ale to pytanie dotyczy również zmiennych lokalnych zadeklarowanych wewnątrz funkcji
tato
4
Mogę potwierdzić to zachowanie. Wydaje się, że modyfikowanie właściwości obiektu JS w przeglądarce Chrome nie ma żadnego wpływu na rzeczywistą wartość obiektu w interpreterze. W przeglądarce Firefox ta sama modyfikacja sprawia, że ​​skrypt js działa inaczej, jak można by się tego spodziewać. Jakieś dodatkowe zabezpieczenia w Chrome? Czy ktoś wie, czy można go wyłączyć w Chrome, więc można go używać do debugowania js?
Nikolaj Hansen
1
Złożyłem w tej sprawie raport o błędzie .
GreenGiant
1
Już zaimplementowano w wersji 8: wydanie 2399 Teraz narzędzia programistyczne Chromium muszą zostać zaktualizowane: wydanie 124206
gabrielmaldi

Odpowiedzi:

39

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 powraca 30po 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).

gilly3
źródło
2016/01/19 Najnowszy, trywialny kod Chrome (var a = 1; debugger; console.log (a);) błąd nadal występuje ...
Offirmo
@Offirmo - 1jest zalogowany. Jaki jest błąd? Czego spodziewałeś się być zalogowany?
gilly3
przy otwartym debugerze zmień wartość ana dowolną (np. 42) w panelu „zakres”, a następnie wznów: rejestrowany jest 1
Offirmo
@Offirmo - nie dla mnie: zrzut ekranu . Ale jeśli zawinę to w funkcję, zobaczę, co opisujesz. Ciekawy. Ale potem mogę zmienić wartość, wpisując ją bezpośrednio w konsoli (co osobiście uważam za łatwiejsze niż używanie panelu oscyloskopu). screenshot Chyba nigdy nie próbowałem zmieniać wartości w panelu zakresu. Zawsze wykonuję wyrażenia w konsoli, które zmieniają wartość, a to wydaje się działać bez względu na wszystko.
gilly3
4
Głosowałem za głosem, ponieważ Twoja odpowiedź spełnia wszystkie kryteria „dobrej odpowiedzi” i wspominasz o innej odpowiedzi, która zawiera nowsze, lepsze informacje, które - pochodzące z zaakceptowanej odpowiedzi - dają jej natychmiastową wiarygodność. Więc dziękuję. I ciesz się pozytywnymi opiniami!
gfullam
67

Jest 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ę, Sourcesi 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)

  • Dodaj punkt przerwania w instrukcji return.
  • W konsoli poniżej wpisz go()
  • i zmień wartości zmiennych, jak pokazano poniżej

funkcja z lokalną modyfikacją dozwoloną.

a zwrócony wynik g_n + n + o.nto 30.

Mikaël Mayer
źródło
1
Regresję tego błędu można śledzić w linku podanym w odpowiedzi Briana .
Mike
7

To potwierdzony błąd w narzędziach deweloperskich Chrome:

http://code.google.com/p/chromium/issues/detail?id=124206

brianpeiris
źródło
Wygląda na to, że został naprawiony 21 marca 2013 r. Nie jestem pewien, jak określić, w której wersji Chrome będzie on dostępny.
David
@David Naprawili to w Blink, być może będziemy musieli trochę poczekać, aby uzyskać kompilację Chrome, która używa Blink
Anshul
3
Jest uszkodzony (ponownie) w Chrome w wersji 49.0.2623.87. Zaloguj się pod powyższym linkiem i oznacz problem, jeśli chcesz podnieść jego wagę.
Mike
6

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.

Wartości zmian debugera Chrome

wprowadź opis obrazu tutaj

Tyler Collier
źródło
Wydaje się, że działa to również w złożonych sytuacjach (takich jak interwały i wyzwalacze).
Gerfried
4

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. : - /

Vlad GURDIGA
źródło
Ok ... przynajmniej widzisz to samo zachowanie, co ja. Ale ... Czy to możliwe?
tato,
4

Wydaje się, że Firebug pozwala ci to zrobić.

Bobo
źródło
3
Tak samo jak IE i Opera Dragonfly.
Keith K
5
Naprawdę tęsknię za Operą Dragonfly -____-
ThorSummoner
2

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
}
mdubez
źródło
2

Jestem w stanie zmodyfikować wartość zmiennej skryptu przez przypisanie w konsoli. Wydaje się najprostsze.

Jeff Lowery
źródło
1

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ść.

LeonardoX
źródło
0

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).

GilesDMiddleton
źródło
Jeśli korzystałeś z lokalnego magazynu do przechowywania właściwości, możesz również przejść do Resources-> LocalStorage i bezpośrednio tam edytować właściwości, które zapisałeś.
GilesDMiddleton
0

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:

wprowadź opis obrazu tutaj

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!

Matthew Marichiba
źródło