Node.js 的 inspector
模块提供了一种程序化的方式来与 V8 Inspector 协议通信,该协议支持通过 Chrome DevTools 或其他兼容工具来调试和分析 Node.js 应用程序。通过 inspector
模块,开发者可以启动和控制调试会话、设置断点、监控执行状态等。
以下是 inspector
模块的详细介绍,包括它的属性、方法以及如何使用它们。
inspector
模块首先,需要在你的 Node.js 应用程序中引入 inspector
模块:
const inspector = require('inspector');
inspector.Session
Session
类用于表示一个与 V8 Inspector 协议交互的会话。
session.connect()
const session = new inspector.Session();
session.connect();
session.disconnect()
session.disconnect();
session.post(method[, params][, callback])
method
: 要调用的 V8 Inspector 方法(例如 'Debugger.enable'
)。params
: 方法的参数(可选)。callback
: 命令完成时的回调(可选),回调参数是 error
和 result
。session.post('Runtime.enable', (err) => {
if (!err) {
console.log('Runtime enabled');
}
});
session.on(event, listener)
event
: 要监听的事件名称。listener
: 事件发生时调用的回调函数。session.on('Debugger.paused', (message) => {
console.log('Execution paused:', message);
});
以下是一个基本的例子,展示了如何启动一个调试会话并设置断点:
const session = new inspector.Session();
session.connect();
session.post('Debugger.enable', () => {
session.post('Debugger.setBreakpointByUrl', {
lineNumber: 5, // 设定断点的行号
url: 'file://' + __filename
}, (err, { breakpointId }) => {
console.log('Breakpoint set:', breakpointId);
});
});
Debugger.enable
session.post('Debugger.enable', (err) => {
if (!err) {
console.log('Debugger enabled');
}
});
Debugger.disable
session.post('Debugger.disable', (err) => {
if (!err) {
console.log('Debugger disabled');
}
});
Debugger.setBreakpointByUrl
lineNumber
: 要设置断点的行号。url
: 代码所在的文件 URL。session.post('Debugger.setBreakpointByUrl', {
lineNumber: 10,
url: 'file://' + __filename
}, (err, { breakpointId, locations }) => {
console.log('Breakpoint set at:', locations);
});
Debugger.resume
session.post('Debugger.resume', (err) => {
if (!err) {
console.log('Execution resumed');
}
});
Debugger.pause
session.post('Debugger.pause', (err) => {
if (!err) {
console.log('Execution paused');
}
});
Debugger.stepOver
session.post('Debugger.stepOver', (err) => {
if (!err) {
console.log('Stepped over');
}
});
HeapProfiler.enable
session.post('HeapProfiler.enable', (err) => {
if (!err) {
console.log('Heap Profiler enabled');
}
});
HeapProfiler.takeHeapSnapshot
session.post('HeapProfiler.takeHeapSnapshot', (err) => {
if (!err) {
console.log('Heap snapshot taken');
}
});
HeapProfiler.startTrackingHeapObjects
session.post('HeapProfiler.startTrackingHeapObjects', (err) => {
if (!err) {
console.log('Started tracking heap objects');
}
});
HeapProfiler.stopTrackingHeapObjects
session.post('HeapProfiler.stopTrackingHeapObjects', (err) => {
if (!err) {
console.log('Stopped tracking heap objects');
}
});
Profiler.enable
session.post('Profiler.enable', (err) => {
if (!err) {
console.log('CPU Profiler enabled');
}
});
Profiler.start
session.post('Profiler.start', (err) => {
if (!err) {
console.log('CPU profiling started');
}
});
Profiler.stop
session.post('Profiler.stop', (err, { profile }) => {
if (!err) {
console.log('CPU profiling stopped');
console.log(profile); // profile 包含了 CPU 分析的结果
}
});
Profiler.takePreciseCoverage
session.post('Profiler.takePreciseCoverage', (err, { result }) => {
if (!err) {
console.log('Precise coverage taken:', result);
}
});
Node.js 还添加了一些特定于 Node.js 的扩展到 V8 Inspector 协议中,以支持 Node.js 的特定调试和分析需求。
NodeRuntime.getProcessInfo
session.post('NodeRuntime.getProcessInfo', (err, { processInfo }) => {
if (!err) {
console.log('Process Info:', processInfo);
}
});
NodeRuntime.restart
session.post('NodeRuntime.restart', (err) => {
if (!err) {
console.log('Process restarted');
}
});
NodeHeapDump.writeHeapSnapshot
入堆内存快照到文件中。
session.post('NodeHeapDump.writeHeapSnapshot', (err, { dumpPath }) => {
if (!err) {
console.log('Heap snapshot written to', dumpPath);
}
});
Node.js 可以通过 WebSocket 连接来远程调试和分析应用。通过启动 Node.js 进程并指定 --inspect
或 --inspect-brk
参数,可以启用 WebSocket 调试。
node --inspect=localhost:9229 yourScript.js
之后,可以通过 WebSocket 连接到调试端点,或者使用 Chrome DevTools 进行远程调试。
inspector
模块为 Node.js 提供了强大的调试和分析能力。通过使用 inspector.Session
类和相应的 V8 Inspector 方法,开发者可以在代码运行时对其进行深入的调试、性能分析、内存分析等操作。这对于开发和维护复杂的 Node.js 应用程序尤为重要。