Чи можна змінювати значення змінних javascript під час налагодження в Google Chrome?


82

Я налагоджую програму javascript (за допомогою інструментів розробника Chrome), і хотів би змінити деякі значення змінних, переходячи через код.

Чи можливо це взагалі?

Я спробував і отримав щось на зразок:

> modeline
1
> modeline=0
0             <<< seems to work but... 
> modeline
1             <<< ups!!

Але я не можу знайти жодної документації, яка б вказувала, що можна чи не можна робити ...


Опублікуйте якийсь код. Звідки modelineбереться?
Еміль Іванов

4
@Emil: Це важливо? modeline - це глобальна змінна, я також намагався змінити її за допомогою window.modeline з тими ж результатами. Але це питання також має відношення до локальних змінних , оголошена всередині функції
Тато

4
Я можу підтвердити цю поведінку. Змінення властивості об’єкта JS у Chrome, схоже, не впливає на фактичну вартість об’єкта в інтерпретаторі. У Firefox одна і та ж модифікація змушує сценарій js оцінювати інакше, як ви очікували. Якась додаткова безпека в Chrome peraps? Хтось знає, чи можна його вимкнути в Chrome, щоб ви могли використовувати його для налагодження js?
Nikolaj Hansen

1
Подав звіт про помилку для цього.
GreenGiant

1
Вже впроваджено у V8: Випуск 2399 Тепер інструменти розробника Chromium потрібно оновити: Випуск 124206
gabrielmaldi

Відповіді:


39

Чому ця відповідь все ще отримує позитивні голоси?

Відповідно до відповіді Mikaël Mayer , це вже не проблема, і моя відповідь застаріла ( go()тепер повертається 30після виходу з консолі). Це було виправлено в липні 2013 року, згідно з повідомленням про помилки, зв’язаному вище в коментарі Габріельмальді . Мене насторожує, що я все ще отримую голоси проти - змушує думати, що голосуючий не розуміє ні питання, ні моєї відповіді.

Я залишу мій початковий відповідь тут з історичних причин, але йти upvote відповідь Mikael в замість .


Фокус у тому, що ви не можете безпосередньо змінити локальну змінну, але ви можете змінити властивості об’єкта. Ви також можете змінити значення глобальної змінної:

var g_n = 0;
function go()
{
    var n = 0;
    var o = { n: 0 };
    return g_n + n + o.n;  // breakpoint here
}

консоль:

> g_n = 10
  10
> g_n
  10
> n = 10
  10
> n
  0
> o.n = 10
  10
> o.n
  10

Перевірте результат go()після встановлення точки зупинку та запуску цих викликів у консолі, і ви виявите, що результат дорівнює 20, а не 0 (але, на жаль, не 30).


19.01.2016 р. Останній тривіальний код Chrome (var a = 1; налагоджувач; console.log (a);) помилка все ще присутня ...
Offirmo

@Offirmo - 1реєструється. Що таке помилка? Що ви очікували в журнал?
gilly3

при відкритому налагоджувачі змініть значення aна будь-що (напр. 42) на панелі "сфера дії", а потім
продовжте

@Offirmo - не для мене: скріншот . Але, якщо я оберну це у функцію, то я бачу, що ви описуєте. Цікаво. Але тоді я можу змінити значення, ввівши його безпосередньо в консоль (що особисто мені стає простіше, ніж використання панелі області). скріншот Здається, я ніколи не пробував змінювати значення на панелі області. Я завжди просто виконую вирази в консолі, які змінюють значення, і це, здається, працює незалежно від того, що.
gilly3

4
Я проголосував за те, що ваша відповідь відповідає усім критеріям "хорошої відповіді", і ви згадуєте ще одну відповідь, яка надає новішу, кращу інформацію, яка, виходячи із прийнятої відповіді, надає їй миттєвої довіри. Отже, спасибі. І насолоджуйтесь голосами!
gfullam

67

Тепер це можливо у хрому 35 (сьогодні станом на 11 липня 2014 року). Я не знаю, яка версія дозволила це першим.

Щойно перевірив приклад @ gilly3 на моїй машині, і він працює.

  • Відкрийте консоль, в Sourcesі вкладку Snippets, додайте новий фрагмент, вставте в нього такий код:

    var g_n = 0; function go() { var n = 0; var o = { n: 0 }; return g_n + n + o.n; // breakpoint here }

  • Клацніть правою кнопкою миші назву фрагмента, натисніть "Виконати" (функція це не запускає)

  • Додайте точку зупинки в операторі return.
  • На консолі нижче введіть go()
  • і змінити значення змінних, як показано нижче

функція з локальною модифікацією.

а повернутий результат g_n + n + o.n- 30.


1
Регрес цієї помилки відстежується за посиланням, наведеним у відповіді Брайана .
Майк

7

Це визнана помилка в Chrome Dev Tools:

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


Схоже, це було виправлено 21 березня 2013 року. Я не знаю, як визначити, в якій версії хрому він буде.
Девід

@David Вони виправили це в Blink, можливо, нам доведеться почекати деякий час, щоб отримати збірку Chrome, яка використовує Blink
Anshul

3
Він зламаний (знову) у версії Chrome 49.0.2623.87. Увійдіть у вищевказане посилання та позначте проблему зірочкою, якщо хочете підняти її важливість.
Mike

6

Так! Нарешті! Я щойно спробував це з Chrome, версія 66.0.3359.170 (Офіційна збірка) (64-розрядна версія) на Mac.

Ви можете змінити значення в областях, як на першому зображенні, або за допомогою консолі, як на другому зображенні.

Значення зміни налагоджувача Chrome

введіть тут опис зображення


Здається, це працює і для складних ситуацій (таких як Інтервали та тригери).
Герфрід

4

Здається, ні.

Поставте точку зупинки, коли вона перестане перемикатися на консоль, спробуйте встановити змінну. Це не призводить до помилки, коли ви присвоюєте йому інше значення, але якщо ви прочитаєте його після призначення, воно не зміниться. : - /


Гаразд ... принаймні ви бачите таку ж поведінку, як і я. Але ... Чи можливо це?
тато


2

Насправді є обхідний шлях. Скопіюйте весь метод, змініть його ім'я, наприклад originalName () на originalName2 (), але змініть змінну всередині, щоб прийняти будь-яке значення, яке ви хочете, або передайте його як параметр.

Тоді, якщо ви викликаєте цей метод безпосередньо з консолі, він матиме ту ж функціональність, але ви зможете змінити значення змінних.

Якщо метод викликається автоматично, замість цього введіть у консоль

originalName = null;
function originalName(original params..)
{
    alert("modified internals");
    add whatever original code you want
}

2

Я можу змінити значення змінної сценарію шляхом призначення в консолі. Здається найпростішим.


1

Я не знаю, чому команда chrome забороняє цю безглузду функцію ... але єдиний спосіб, яким я міг би успішно змінити значення змінних - це змінити скрипт безпосередньо в редакторі chrome на вкладці "Джерела" (це змінює поведінку сценарію, доки ви не оновите сторінку), але ці зміни будуть втрачені при оновленні, тому будьте обережні.


0

У мене була та сама проблема, я перейшов до розділу «Про Google Chrome» -> Довідка, і там сказали, що мені потрібно перезапустити браузер, щоб отримувати останні оновлення.

Я зробив це, і раптом тепер я можу змінювати локальні змінні. Просто клацніть на змінну, яку потрібно редагувати, у вікні Змінні сфери та введіть нове значення.

Однак я помітив деякі дивацтва, що мені довелося переступити через не пов'язані між собою призначення змін, перш ніж я зміг змінити текст у правому вікні (Змінні сфери).


Якщо ви використовували локальне сховище для зберігання властивостей, ви також можете перейти до Resources-> LocalStorage і відредагувати збережені вами властивості безпосередньо там.
GilesDMiddleton

0

Щоб змінити значення кожного разу, коли запускається блок коду, не порушуючи потік виконання :

Функція "Точки журналу" в налагоджувачі призначена для реєстрації довільних значень на консолі без порушення. Він обчислює код всередині потоку виконання, а це означає, що ви можете використовувати його для зміни значень на льоту, не зупиняючись.

Клацніть правою кнопкою миші номер рядка та виберіть "Точка входу", а потім введіть вираз призначення. Це виглядає приблизно так:

введіть тут опис зображення

Я вважаю це надзвичайно корисним для встановлення значень для стану, який не так легко відтворити, без необхідності перебудовувати мій проект із налагодженими рядками. ПАМ’ЯТАЙТЕ, щоб видалити точку зупинки, коли закінчите!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.