Skip to content

المفتش (Inspector)

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

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

كود المصدر: lib/inspector.js

توفر وحدة node:inspector واجهة برمجة تطبيقات (API) للتفاعل مع مفتش V8.

يمكن الوصول إليه باستخدام:

js
import * as inspector from 'node:inspector/promises';
js
const inspector = require('node:inspector/promises');

أو

js
import * as inspector from 'node:inspector';
js
const inspector = require('node:inspector');

واجهة برمجة تطبيقات الوعود (Promises API)

[مستقر: 1 - تجريبي]

مستقر: 1 الاستقرار: 1 - تجريبي

تمت الإضافة في: v19.0.0

الصنف: inspector.Session

يُستخدم inspector.Session لإرسال الرسائل إلى الواجهة الخلفية لمفتش V8 وتلقي استجابات الرسائل والإشعارات.

new inspector.Session()

تمت الإضافة في: v8.0.0

إنشاء نسخة جديدة من الصنف inspector.Session. يجب توصيل جلسة المفتش من خلال session.connect() قبل إمكانية إرسال الرسائل إلى الواجهة الخلفية للمفتش.

عند استخدام Session، لن يتم تحرير الكائن الناتج بواسطة واجهة برمجة تطبيقات وحدة التحكم (console API)، إلا إذا نفذنا يدويًا الأمر Runtime.DiscardConsoleEntries.

الحدث: 'inspectorNotification'

تمت الإضافة في: v8.0.0

  • <Object> كائن رسالة الإشعار

يتم إطلاقه عند تلقي أي إشعار من مفتش V8.

js
session.on('inspectorNotification', (message) => console.log(message.method));
// Debugger.paused
// Debugger.resumed

من الممكن أيضًا الاشتراك فقط في الإشعارات ذات طريقة محددة:

الحدث: &lt;inspector-protocol-method&gt;; {#event-<inspector-protocol-method>;}

أُضيف في: الإصدار v8.0.0

  • <Object> كائن رسالة الإشعار

يتم إصداره عند استلام إشعار من المُدقق يحتوي على حقل method مُعيّنًا إلى القيمة \<inspector-protocol-method\>.

يقوم المقتطف التالي بتثبيت مستمع على الحدث 'Debugger.paused'، وطباعة سبب تعليق البرنامج كلما تم تعليق تنفيذ البرنامج (من خلال نقاط التوقف، على سبيل المثال):

js
session.on('Debugger.paused', ({ params }) => {
  console.log(params.hitBreakpoints);
});
// [ '/the/file/that/has/the/breakpoint.js:11:0' ]

session.connect()

أُضيف في: الإصدار v8.0.0

يربط جلسة بالواجهة الخلفية للمُدقق.

session.connectToMainThread()

أُضيف في: الإصدار v12.11.0

يربط جلسة بالواجهة الخلفية للمُدقق للخيط الرئيسي. سيتم طرح استثناء إذا لم يتم استدعاء واجهة برمجة التطبيقات هذه في خيط العامل.

session.disconnect()

أُضيف في: الإصدار v8.0.0

يغلق الجلسة على الفور. سيتم استدعاء جميع عمليات معاودة الاتصال بالرسائل المعلقة بخطأ. يجب استدعاء session.connect() لتتمكن من إرسال الرسائل مرة أخرى. ستفقد الجلسة التي أعيد توصيلها جميع حالات المُدقق، مثل العوامل الممكنة أو نقاط التوقف التي تم تكوينها.

session.post(method[, params])

أُضيف في: الإصدار v19.0.0

ينشر رسالة إلى الواجهة الخلفية للمُدقق.

js
import { Session } from 'node:inspector/promises';
try {
  const session = new Session();
  session.connect();
  const result = await session.post('Runtime.evaluate', { expression: '2 + 2' });
  console.log(result);
} catch (error) {
  console.error(error);
}
// Output: { result: { type: 'number', value: 4, description: '4' } }

يتم نشر أحدث إصدار من بروتوكول V8 للمُدقق على عارض بروتوكول Chrome DevTools.

يدعم مُدقق Node.js جميع نطاقات بروتوكول Chrome DevTools التي أعلنتها V8. يوفر نطاق بروتوكول Chrome DevTools واجهة للتفاعل مع أحد عوامل وقت التشغيل المستخدمة لفحص حالة التطبيق والاستماع إلى أحداث وقت التشغيل.

مثال للاستخدام

بصرف النظر عن مصحح الأخطاء، تتوفر العديد من أدوات V8 Profilers من خلال بروتوكول DevTools.

محلل وحدة المعالجة المركزية (CPU)

إليك مثال يوضح كيفية استخدام محلل وحدة المعالجة المركزية (CPU):

js
import { Session } from 'node:inspector/promises';
import fs from 'node:fs';
const session = new Session();
session.connect();

await session.post('Profiler.enable');
await session.post('Profiler.start');
// Invoke business logic under measurement here...

// some time later...
const { profile } = await session.post('Profiler.stop');

// Write profile to disk, upload, etc.
fs.writeFileSync('./profile.cpuprofile', JSON.stringify(profile));
محلل الذاكرة المكدسة (Heap)

إليك مثال يوضح كيفية استخدام محلل الذاكرة المكدسة (Heap):

js
import { Session } from 'node:inspector/promises';
import fs from 'node:fs';
const session = new Session();

const fd = fs.openSync('profile.heapsnapshot', 'w');

session.connect();

session.on('HeapProfiler.addHeapSnapshotChunk', (m) => {
  fs.writeSync(fd, m.params.chunk);
});

const result = await session.post('HeapProfiler.takeHeapSnapshot', null);
console.log('HeapProfiler.takeHeapSnapshot done:', result);
session.disconnect();
fs.closeSync(fd);

واجهة برمجة تطبيقات الاستدعاء (Callback API)

صنف: inspector.Session

يتم استخدام inspector.Session لإرسال الرسائل إلى الواجهة الخلفية لمفتش V8 وتلقي استجابات الرسائل والإشعارات.

new inspector.Session()

تمت الإضافة في: v8.0.0

قم بإنشاء مثيل جديد لفئة inspector.Session. يجب توصيل جلسة المفتش من خلال session.connect() قبل أن يتم إرسال الرسائل إلى الواجهة الخلفية للمفتش.

عند استخدام Session، لن يتم تحرير الكائن الناتج عن واجهة برمجة تطبيقات وحدة التحكم (console API)، ما لم ننفذ أمر Runtime.DiscardConsoleEntries يدويًا.

الحدث: 'inspectorNotification'

تمت إضافته في: الإصدار 8.0.0

  • <Object> كائن رسالة الإشعار

يُطلق هذا الحدث عند تلقي أي إشعار من V8 Inspector.

js
session.on('inspectorNotification', (message) => console.log(message.method));
// Debugger.paused
// Debugger.resumed

من الممكن أيضًا الاشتراك فقط في الإشعارات التي لها طريقة محددة:

الحدث: &lt;inspector-protocol-method&gt;؛ {#event-<inspector-protocol-method>;_1}

تمت إضافته في: الإصدار 8.0.0

  • <Object> كائن رسالة الإشعار

يُطلق هذا الحدث عند تلقي إشعار Inspector تم تعيين حقله method إلى قيمة \<inspector-protocol-method\>.

يقوم المقتطف التالي بتثبيت مستمع على حدث 'Debugger.paused'، ويطبع سبب تعليق البرنامج متى تم تعليق تنفيذ البرنامج (من خلال نقاط التوقف، على سبيل المثال):

js
session.on('Debugger.paused', ({ params }) => {
  console.log(params.hitBreakpoints);
});
// [ '/the/file/that/has/the/breakpoint.js:11:0' ]

session.connect()

تمت إضافته في: الإصدار 8.0.0

يقوم بتوصيل جلسة عمل بالواجهة الخلفية لـ Inspector.

session.connectToMainThread()

تمت إضافته في: الإصدار 12.11.0

يقوم بتوصيل جلسة عمل بالواجهة الخلفية لـ Inspector في مؤشر الترابط الرئيسي. سيتم طرح استثناء إذا لم يتم استدعاء واجهة برمجة التطبيقات هذه في مؤشر ترابط Worker.

session.disconnect()

تمت إضافته في: الإصدار 8.0.0

أغلق الجلسة على الفور. سيتم استدعاء جميع استدعاءات الرسائل المعلقة مع وجود خطأ. يجب استدعاء session.connect() لتتمكن من إرسال الرسائل مرة أخرى. ستفقد الجلسة المعاد توصيلها جميع حالات Inspector، مثل الوكلاء الممكّنين أو نقاط التوقف التي تم تكوينها.

session.post(method[, params][, callback])

[سجل التغييرات]

الإصدارالتغييرات
الإصدار 18.0.0تمرير استدعاء غير صالح إلى وسيطة callback يطرح الآن ERR_INVALID_ARG_TYPE بدلاً من ERR_INVALID_CALLBACK.
الإصدار 8.0.0تمت إضافته في: الإصدار 8.0.0

ينشر رسالة إلى الواجهة الخلفية لـ Inspector. سيتم إعلام callback عند تلقي رد. callback هي دالة تقبل وسيطتين اختياريتين: خطأ ونتيجة خاصة بالرسالة.

js
session.post('Runtime.evaluate', { expression: '2 + 2' },
             (error, { result }) => console.log(result));
// Output: { type: 'number', value: 4, description: '4' }

يتم نشر أحدث إصدار من بروتوكول V8 Inspector على عارض بروتوكول Chrome DevTools.

يدعم Node.js Inspector جميع مجالات بروتوكول Chrome DevTools التي أعلنتها V8. يوفر مجال بروتوكول Chrome DevTools واجهة للتفاعل مع أحد وكلاء وقت التشغيل المستخدمين لفحص حالة التطبيق والاستماع إلى أحداث وقت التشغيل.

لا يمكنك تعيين reportProgress إلى true عند إرسال أمر HeapProfiler.takeHeapSnapshot أو HeapProfiler.stopTrackingHeapObjects إلى V8.

مثال على الاستخدام

بالإضافة إلى مصحح الأخطاء، تتوفر العديد من مُحلِّلات V8 Profilers من خلال بروتوكول DevTools.

محلل CPU

فيما يلي مثال يوضح كيفية استخدام محلل CPU:

js
const inspector = require('node:inspector');
const fs = require('node:fs');
const session = new inspector.Session();
session.connect();

session.post('Profiler.enable', () => {
  session.post('Profiler.start', () => {
    // Invoke business logic under measurement here...

    // some time later...
    session.post('Profiler.stop', (err, { profile }) => {
      // Write profile to disk, upload, etc.
      if (!err) {
        fs.writeFileSync('./profile.cpuprofile', JSON.stringify(profile));
      }
    });
  });
});
محلل الذاكرة المؤقتة (Heap)

فيما يلي مثال يوضح كيفية استخدام محلل الذاكرة المؤقتة:

js
const inspector = require('node:inspector');
const fs = require('node:fs');
const session = new inspector.Session();

const fd = fs.openSync('profile.heapsnapshot', 'w');

session.connect();

session.on('HeapProfiler.addHeapSnapshotChunk', (m) => {
  fs.writeSync(fd, m.params.chunk);
});

session.post('HeapProfiler.takeHeapSnapshot', null, (err, r) => {
  console.log('HeapProfiler.takeHeapSnapshot done:', err, r);
  session.disconnect();
  fs.closeSync(fd);
});

الكائنات الشائعة

inspector.close()

[السجل]

الإصدارالتغييرات
v18.10.0يتم عرض واجهة برمجة التطبيقات في سلاسل العمل (worker threads).
v9.0.0تمت الإضافة في: v9.0.0

يحاول إغلاق جميع الاتصالات المتبقية، مما يمنع حلقة الأحداث حتى يتم إغلاقها جميعًا. بمجرد إغلاق جميع الاتصالات، يتم إلغاء تنشيط الفاحص.

inspector.console

  • <Object> كائن لإرسال الرسائل إلى وحدة تحكم الفاحص البعيدة.
js
require('node:inspector').console.log('a message');

لا تتمتع وحدة تحكم الفاحص بتكافؤ واجهة برمجة التطبيقات (API) مع وحدة تحكم Node.js.

inspector.open([port[, host[, wait]]])

[التاريخ]

الإصدارالتغييرات
v20.6.0تُرجع الآن inspector.open() كائن Disposable.
  • port <number> المنفذ للاستماع لاتصالات المدقق. اختياري. افتراضي: ما تم تحديده في CLI.
  • host <string> المضيف للاستماع لاتصالات المدقق. اختياري. افتراضي: ما تم تحديده في CLI.
  • wait <boolean> حظر حتى يتم توصيل عميل. اختياري. افتراضي: false.
  • يُرجع: <Disposable> كائن Disposable يستدعي inspector.close().

تفعيل المدقق على المضيف والمنفذ. مكافئ لـ node --inspect=[[host:]port], ولكن يمكن القيام بذلك برمجيًا بعد بدء تشغيل node.

إذا كانت قيمة wait هي true, فسيتم الحظر حتى يتم توصيل عميل بمنفذ الفحص ويتم تمرير التحكم في التدفق إلى عميل التصحيح.

راجع تحذير الأمان بشأن استخدام معلمة host.

inspector.url()

إرجاع عنوان URL للمدقق النشط، أو undefined إذا لم يكن هناك أي مدقق نشط.

bash
$ node --inspect -p 'inspector.url()'
Debugger listening on ws://127.0.0.1:9229/166e272e-7a30-4d09-97ce-f1c012b43c34
For help, see: https://nodejs.org/en/docs/inspector
ws://127.0.0.1:9229/166e272e-7a30-4d09-97ce-f1c012b43c34

$ node --inspect=localhost:3000 -p 'inspector.url()'
Debugger listening on ws://localhost:3000/51cf8d0e-3c36-4c59-8efd-54519839e56a
For help, see: https://nodejs.org/en/docs/inspector
ws://localhost:3000/51cf8d0e-3c36-4c59-8efd-54519839e56a

$ node -p 'inspector.url()'
undefined

inspector.waitForDebugger()

إضافة في: v12.7.0

يحظر حتى يرسل عميل (موجود أو متصل لاحقًا) أمر Runtime.runIfWaitingForDebugger.

سيتم طرح استثناء إذا لم يكن هناك مدقق نشط.

التكامل مع أدوات المطورين

توفر الوحدة node:inspector واجهة برمجة تطبيقات للتكامل مع أدوات المطورين التي تدعم بروتوكول أدوات المطورين في Chrome. يمكن لواجهات أدوات المطورين المتصلة بمثيل Node.js قيد التشغيل التقاط أحداث البروتوكول المنبعثة من المثيل وعرضها وفقًا لذلك لتسهيل التصحيح. تقوم الطرق التالية ببث حدث بروتوكول إلى جميع الواجهات الأمامية المتصلة. يمكن أن تكون params التي تم تمريرها إلى الطرق اختيارية، اعتمادًا على البروتوكول.

js
// سيتم إطلاق حدث `Network.requestWillBeSent`.
inspector.Network.requestWillBeSent({
  requestId: 'request-id-1',
  timestamp: Date.now() / 1000,
  wallTime: Date.now(),
  request: {
    url: 'https://nodejs.org/en',
    method: 'GET',
  },
});

inspector.Network.requestWillBeSent([params])

إضافة في: v22.6.0, v20.18.0

[مستقر: 1 - تجريبي]

مستقر: 1 الاستقرار: 1 - تجريبي

هذه الميزة متاحة فقط مع تمكين العلامة --experimental-network-inspection.

يبث حدث Network.requestWillBeSent إلى الواجهات الأمامية المتصلة. يشير هذا الحدث إلى أن التطبيق على وشك إرسال طلب HTTP.

inspector.Network.responseReceived([params])

إضافة في: v22.6.0, v20.18.0

[مستقر: 1 - تجريبي]

مستقر: 1 الاستقرار: 1 - تجريبي

هذه الميزة متاحة فقط مع تمكين العلامة --experimental-network-inspection.

يبث حدث Network.responseReceived إلى الواجهات الأمامية المتصلة. يشير هذا الحدث إلى أن استجابة HTTP متاحة.

inspector.Network.loadingFinished([params])

أضيف في: v22.6.0, v20.18.0

[مستقر: 1 - تجريبي]

مستقر: 1 الاستقرار: 1 - تجريبي

هذه الميزة متاحة فقط مع تمكين علامة --experimental-network-inspection.

يبث حدث Network.loadingFinished إلى الواجهات الأمامية المتصلة. يشير هذا الحدث إلى أن تحميل طلب HTTP قد انتهى.

inspector.Network.loadingFailed([params])

أضيف في: v22.7.0, v20.18.0

[مستقر: 1 - تجريبي]

مستقر: 1 الاستقرار: 1 - تجريبي

هذه الميزة متاحة فقط مع تمكين علامة --experimental-network-inspection.

يبث حدث Network.loadingFailed إلى الواجهات الأمامية المتصلة. يشير هذا الحدث إلى أن تحميل طلب HTTP قد فشل.

دعم نقاط التوقف

يسمح نطاق Debugger في بروتوكول Chrome DevTools لـ inspector.Session بالاتصال ببرنامج وتعيين نقاط توقف للتنقل عبر التعليمات البرمجية.

ومع ذلك، يجب تجنب تعيين نقاط التوقف باستخدام inspector.Session في نفس سلسلة الرسائل، والتي يتم توصيلها بواسطة session.connect()، حيث أن البرنامج الذي يتم إرفاقه وإيقافه مؤقتًا هو المصحح نفسه تمامًا. بدلاً من ذلك، حاول الاتصال بالسلسلة الرئيسية بواسطة session.connectToMainThread() وتعيين نقاط التوقف في سلسلة عامل، أو الاتصال ببرنامج Debugger عبر اتصال WebSocket.