Отладчик
[Стабильность: 2 - Стабильно]
Стабильность: 2 Стабильность: 2 - Стабильно
Node.js включает в себя утилиту отладки из командной строки. Клиент отладчика Node.js не является полнофункциональным отладчиком, но возможна простая пошаговая отладка и инспекция.
Для его использования запустите Node.js с аргументом inspect
, за которым следует путь к отлаживаемому скрипту.
$ node inspect myscript.js
< Отладчик прослушивает ws://127.0.0.1:9229/621111f9-ffcb-4e82-b718-48a145fa5db8
< Для справки: https://nodejs.org/en/docs/inspector
<
подключение к 127.0.0.1:9229 ... ok
< Отладчик подключен.
<
ok
Остановка в начале 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
< Отладчик прослушивает ws://127.0.0.1:9229/f1ed133e-7876-495b-83ae-c32c6fc319c2
< Для справки: https://nodejs.org/en/docs/inspector
<
подключение к 127.0.0.1:9229 ... ok
< Отладчик подключен.
<
< hello
<
остановка в myscript.js:4
2 global.x = 5;
3 setTimeout(() => {
> 4 debugger;
5 console.log('world');
6 }, 1000);
debug> next
остановка в myscript.js:5
3 setTimeout(() => {
4 debugger;
> 5 console.log('world');
6 }, 1000);
7 console.log('hello');
debug> repl
Нажмите Ctrl+C для выхода из отладочного repl
> x
5
> 2 + 2
4
debug> next
< world
<
остановка в myscript.js:6
4 debugger;
5 console.log('world');
> 6 }, 1000);
7 console.log('hello');
8
debug> .exit
$
Команда repl
позволяет удаленно оценивать код. Команда next
переходит к следующей строке. Введите help
, чтобы увидеть другие доступные команды.
Нажатие enter
без ввода команды повторит предыдущую команду отладчика.
Наблюдатели
Возможно наблюдать за выражениями и значениями переменных во время отладки. При каждой точке останова каждое выражение из списка наблюдателей будет вычислено в текущем контексте и отображено непосредственно перед листингом исходного кода точки останова.
Чтобы начать наблюдение за выражением, введите watch('my_expression')
. Команда watchers
выведет список активных наблюдателей. Чтобы удалить наблюдателя, введите unwatch('my_expression')
.
Справочник команд
Пошаговое выполнение
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 Protocol.
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.