Skip to content

مصحح الأخطاء

[مستقر: 2 - مستقر]

مستقر: 2 استقرار: 2 - مستقر

يتضمن Node.js أداة مساعدة تصحيح أخطاء سطر الأوامر. عميل تصحيح أخطاء Node.js ليس مصحح أخطاء كامل الميزات، ولكن التتبع والفحص البسيط ممكنان.

لاستخدامه، قم بتشغيل Node.js مع وسيطة inspect متبوعة بمسار البرنامج النصي المراد تصحيحه.

bash
$ 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.

bash
$ 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

من الممكن أيضًا تعيين نقطة توقف في ملف (وحدة) لم يتم تحميلها بعد:

bash
$ 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:

bash
$ 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'): حفظ جلسة تعريف ملف تعريف وحدة المعالجة المركزية على القرص كملف JSON
  • takeHeapSnapshot(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، ضع في اعتبارك ما إذا كنت تريد أن يبدأ تنفيذ الكود على الفور، أو الانتظار حتى يتم إرفاق مُحسّن الأخطاء قبل التنفيذ، أو التوقف عند السطر الأول للتصحيح خطوة بخطوة.

bash
$ 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 لتصحيح أخطائها.