مصحح الأخطاء
[Stable: 2 - Stable]
Stable: 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
< للمساعدة، راجع: 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
< للمساعدة، راجع: 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('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 أسطر قبل و 5 أسطر بعد)watch(expr)
: إضافة تعبير إلى قائمة المراقبةunwatch(expr)
: إزالة تعبير من قائمة المراقبةunwatch(index)
: إزالة تعبير في فهرس معين من قائمة المراقبةwatchers
: سرد جميع المراقبين وقيمهم (تُسرد تلقائيًا في كل نقطة توقف)repl
: فتح repl الخاص بالمصحح للتقييم في سياق البرنامج النصي للتصحيحexec expr
,p expr
: تنفيذ تعبير في سياق البرنامج النصي للتصحيح وطباعة قيمتهprofile
: بدء جلسة تحديد مواصفات وحدة المعالجة المركزيةprofileEnd
: إيقاف جلسة تحديد مواصفات وحدة المعالجة المركزية الحاليةprofiles
: سرد جميع جلسات تحديد مواصفات وحدة المعالجة المركزية المكتملةprofiles[n].save(filepath = 'node.cpuprofile')
: حفظ جلسة تحديد مواصفات وحدة المعالجة المركزية على القرص بتنسيق 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 لتصحيحها.