Отладчик
[Стабильность: 2 - Стабильный]
Стабильность: 2 Стабильность: 2 - Стабильный
Node.js включает в себя утилиту отладки из командной строки. Клиент отладчика Node.js не является полнофункциональным отладчиком, но простые шаги и инспекция возможны.
Для его использования запустите Node.js с аргументом inspect
, за которым следует путь к скрипту для отладки.
$ node inspect myscript.js
< Debugger listening on ws://127.0.0.1:9229/621111f9-ffcb-4e82-b718-48a145fa5db8
< For help, see: https://nodejs.org/en/docs/inspector
<
connecting to 127.0.0.1:9229 ... ok
< Debugger attached.
<
ok
Break on start in myscript.js:2
1 // myscript.js
> 2 global.x = 5;
3 setTimeout(() => {
4 debugger;
debug>
Отладчик автоматически останавливается на первой исполняемой строке. Чтобы вместо этого выполнить программу до первой точки останова (указанной оператором debugger
), установите переменную окружения NODE_INSPECT_RESUME_ON_START
в значение 1
.
$ cat myscript.js
// myscript.js
global.x = 5;
setTimeout(() => {
debugger;
console.log('world');
}, 1000);
console.log('hello');
$ NODE_INSPECT_RESUME_ON_START=1 node inspect myscript.js
< Debugger listening on ws://127.0.0.1:9229/f1ed133e-7876-495b-83ae-c32c6fc319c2
< For help, see: https://nodejs.org/en/docs/inspector
<
connecting to 127.0.0.1:9229 ... ok
< Debugger attached.
<
< hello
<
break in myscript.js:4
2 global.x = 5;
3 setTimeout(() => {
> 4 debugger;
5 console.log('world');
6 }, 1000);
debug> next
break in myscript.js:5
3 setTimeout(() => {
4 debugger;
> 5 console.log('world');
6 }, 1000);
7 console.log('hello');
debug> repl
Press Ctrl+C to leave debug repl
> x
5
> 2 + 2
4
debug> next
< world
<
break in myscript.js:6
4 debugger;
5 console.log('world');
> 6 }, 1000);
7 console.log('hello');
8
debug> .exit
$
Команда repl
позволяет удаленно оценивать код. Команда next
переходит к следующей строке. Введите help
, чтобы увидеть, какие еще команды доступны.
Нажатие enter
без ввода команды повторит предыдущую команду отладчика.
Наблюдатели
Во время отладки можно наблюдать за значениями выражений и переменных. При каждой точке останова каждое выражение из списка наблюдателей будет вычисляться в текущем контексте и отображаться непосредственно перед листингом исходного кода точки останова.
Чтобы начать наблюдение за выражением, введите watch('мое_выражение')
. Команда watchers
выведет список активных наблюдателей. Чтобы удалить наблюдателя, введите unwatch('мое_выражение')
.
Справочник по командам
Пошаговое выполнение
cont
,c
: Продолжить выполнениеnext
,n
: Шаг с обходомstep
,s
: Шаг с заходомout
,o
: Шаг с выходомpause
: Приостановить выполнение кода (как кнопка паузы в Инструментах разработчика)
Точки останова
setBreakpoint()
,sb()
: Установить точку останова на текущей строкеsetBreakpoint(line)
,sb(line)
: Установить точку останова на определенной строкеsetBreakpoint('fn()')
,sb(...)
: Установить точку останова на первом операторе в теле функцииsetBreakpoint('script.js', 1)
,sb(...)
: Установить точку останова на первой строкеscript.js
setBreakpoint('script.js', 1, 'num < 4')
,sb(...)
: Установить условную точку останова на первой строкеscript.js
, которая срабатывает только когдаnum < 4
вычисляется какtrue
clearBreakpoint('script.js', 1)
,cb(...)
: Очистить точку останова вscript.js
на строке 1
Также возможно установить точку останова в файле (модуле), который еще не загружен:
$ node inspect main.js
< Debugger listening on ws://127.0.0.1:9229/48a5b28a-550c-471b-b5e1-d13dd7165df9
< For help, see: https://nodejs.org/en/docs/inspector
<
connecting to 127.0.0.1:9229 ... ok
< Debugger attached.
<
Break on start in main.js:1
> 1 const mod = require('./mod.js');
2 mod.hello();
3 mod.hello();
debug> setBreakpoint('mod.js', 22)
Warning: script 'mod.js' was not loaded yet.
debug> c
break in mod.js:22
20 // USE OR OTHER DEALINGS IN THE SOFTWARE.
21
>22 exports.hello = function() {
23 return 'hello from module';
24 };
debug>
Также можно установить условную точку останова, которая срабатывает только тогда, когда заданное выражение вычисляется как true
:
$ node inspect main.js
< Debugger listening on ws://127.0.0.1:9229/ce24daa8-3816-44d4-b8ab-8273c8a66d35
< For help, see: https://nodejs.org/en/docs/inspector
<
connecting to 127.0.0.1:9229 ... ok
< Debugger attached.
Break on start in main.js:7
5 }
6
> 7 addOne(10);
8 addOne(-1);
9
debug> setBreakpoint('main.js', 4, 'num < 0')
1 'use strict';
2
3 function addOne(num) {
> 4 return num + 1;
5 }
6
7 addOne(10);
8 addOne(-1);
9
debug> cont
break in main.js:4
2
3 function addOne(num) {
> 4 return num + 1;
5 }
6
debug> exec('num')
-1
debug>
Информация
backtrace
,bt
: Вывести трассировку текущего кадра выполненияlist(5)
: Вывести исходный код скрипта с контекстом в 5 строк (5 строк до и после)watch(expr)
: Добавить выражение в список отслеживанияunwatch(expr)
: Удалить выражение из списка отслеживанияunwatch(index)
: Удалить выражение по указанному индексу из списка отслеживанияwatchers
: Вывести список всех отслеживаемых выражений и их значений (автоматически выводится при каждой точке останова)repl
: Открыть REPL отладчика для вычисления в контексте отлаживаемого скриптаexec expr
,p expr
: Выполнить выражение в контексте отлаживаемого скрипта и вывести его значениеprofile
: Начать сессию профилирования CPUprofileEnd
: Остановить текущую сессию профилирования CPUprofiles
: Вывести список всех завершенных сессий профилирования CPUprofiles[n].save(filepath = 'node.cpuprofile')
: Сохранить сессию профилирования CPU на диск в формате JSONtakeHeapSnapshot(filepath = 'node.heapsnapshot')
: Сделать снимок кучи и сохранить его на диск в формате JSON
Управление выполнением
run
: Запустить скрипт (автоматически запускается при старте отладчика)restart
: Перезапустить скриптkill
: Завершить скрипт
Разное
scripts
: Вывести список всех загруженных скриптовversion
: Отобразить версию V8
Расширенное использование
Интеграция V8 Inspector для Node.js
Интеграция V8 Inspector позволяет подключить Chrome DevTools к экземплярам Node.js для отладки и профилирования. Он использует протокол Chrome DevTools.
V8 Inspector можно включить, передав флаг --inspect
при запуске приложения Node.js. Также можно указать пользовательский порт с этим флагом, например, --inspect=9222
будет принимать соединения DevTools на порту 9222.
Использование флага --inspect
выполнит код немедленно перед подключением отладчика. Это означает, что код начнет выполняться до того, как вы сможете начать отладку, что может быть не идеально, если вы хотите отлаживать с самого начала.
В таких случаях у вас есть две альтернативы:
Итак, при выборе между --inspect
, --inspect-wait
и --inspect-brk
учитывайте, хотите ли вы, чтобы код начал выполняться немедленно, ждал подключения отладчика перед выполнением или остановился на первой строке для пошаговой отладки.
$ node --inspect index.js
Debugger listening on ws://127.0.0.1:9229/dc9010dd-f8b8-4ac5-a510-c1a114ec7d29
For help, see: https://nodejs.org/en/docs/inspector
(В примере выше UUID dc9010dd-f8b8-4ac5-a510-c1a114ec7d29 в конце URL-адреса генерируется на лету, он меняется в разных сеансах отладки.)
Если браузер Chrome старше версии 66.0.3345.0, используйте inspector.html
вместо js_app.html
в приведенном выше URL-адресе.
Chrome DevTools пока не поддерживает отладку рабочих потоков. Для их отладки можно использовать ndb.