مصحح الأخطاء
[مستقر: 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('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
: فتح وحدة تحكم مُحسّن الأخطاء لتقييمها في سياق البرنامج النصي المُحسّن للأخطاء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 لنظام Node.js
يسمح تكامل مُفتّش V8 بإرفاق Chrome DevTools بمثيلات Node.js للتحقق من الأخطاء وتحديد ملفات التعريف. وهو يستخدم بروتوكول Chrome DevTools.
يمكن تمكين مُفتّش V8 عن طريق تمرير علم --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 لتصحيح أخطائها.