Node.js v24.0.0 文档
- Node.js v24.0.0
- 目录
-
索引
- 断言测试
- 异步上下文跟踪
- 异步钩子
- Buffer
- C++ 插件
- 使用 Node-API 的 C/C++ 插件
- C++ 嵌入器 API
- 子进程
- 集群
- 命令行选项
- Console
- Crypto
- Debugger
- 已弃用的 API
- 诊断通道
- DNS
- Domain
- 错误
- Events
- 文件系统
- 全局变量
- HTTP
- HTTP/2
- HTTPS
- Inspector
- 国际化
- 模块:CommonJS 模块
- 模块:ECMAScript 模块
- 模块:
node:module
API - 模块:包
- 模块:TypeScript
- Net
- OS
- Path
- 性能钩子
- 权限
- Process
- Punycode
- 查询字符串
- Readline
- REPL
- Report
- 单执行文件应用程序
- SQLite
- Stream
- 字符串解码器
- 测试运行器
- Timers
- TLS/SSL
- 跟踪事件
- TTY
- UDP/datagram
- URL
- Utilities
- V8
- VM
- WASI
- Web Crypto API
- Web Streams API
- Worker threads
- Zlib
- 其他版本
- 选项
Inspector#
源码: lib/inspector.js
node:inspector
模块提供了一个与 V8 检查器交互的 API。
可以使用以下方式访问它:
import * as inspector from 'node:inspector/promises';
const inspector = require('node:inspector/promises');
或
import * as inspector from 'node:inspector';
const inspector = require('node:inspector');
Promises API#
类:inspector.Session
#
- 继承自: <EventEmitter>
inspector.Session
用于将消息调度到 V8 检查器后端,并接收消息响应和通知。
new inspector.Session()
#
创建 inspector.Session
类的新实例。 检查器会话需要通过 session.connect()
连接,然后才能将消息分派到检查器后端。
当使用 Session
时,控制台 API 输出的对象将不会被释放,除非我们手动执行 Runtime.DiscardConsoleEntries
命令。
事件:'inspectorNotification'
#
- <Object> 通知消息对象
当接收到来自 V8 Inspector 的任何通知时触发。
session.on('inspectorNotification', (message) => console.log(message.method));
// Debugger.paused
// Debugger.resumed
注意 不建议使用同线程会话的断点,请参阅 支持断点。
也可以只订阅具有特定方法的通知
事件:<inspector-protocol-method>
;#
- <Object> 通知消息对象
当接收到检查器通知时触发,该通知的 method 字段设置为 <inspector-protocol-method>
值。
以下代码片段在 'Debugger.paused'
事件上安装侦听器,并在程序执行暂停时(例如,通过断点)打印程序暂停的原因
session.on('Debugger.paused', ({ params }) => {
console.log(params.hitBreakpoints);
});
// [ '/the/file/that/has/the/breakpoint.js:11:0' ]
注意 不建议使用同线程会话的断点,请参阅 支持断点。
session.connect()
#
将会话连接到检查器后端。
session.connectToMainThread()
#
将会话连接到主线程检查器后端。 如果未在 Worker 线程上调用此 API,则会抛出异常。
session.disconnect()
#
立即关闭会话。 所有待处理的消息回调都将以错误形式调用。 需要调用 session.connect()
才能再次发送消息。 重新连接的会话将丢失所有检查器状态,例如启用的代理或配置的断点。
session.post(method[, params])
#
将消息发布到检查器后端。
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 Protocol Viewer 上。
Node.js 检查器支持 V8 声明的所有 Chrome DevTools Protocol 域。 Chrome DevTools Protocol 域提供了一个接口,用于与用于检查应用程序状态和侦听运行时事件的运行时代理之一进行交互。
用法示例#
除了调试器之外,还可以通过 DevTools 协议使用各种 V8 分析器。
CPU 分析器#
这是一个展示如何使用 CPU 分析器 的示例
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));
堆分析器#
这是一个展示如何使用 堆分析器 的示例
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
#
- 继承自: <EventEmitter>
inspector.Session
用于将消息调度到 V8 检查器后端,并接收消息响应和通知。
new inspector.Session()
#
创建 inspector.Session
类的新实例。 检查器会话需要通过 session.connect()
连接,然后才能将消息分派到检查器后端。
当使用 Session
时,控制台 API 输出的对象将不会被释放,除非我们手动执行 Runtime.DiscardConsoleEntries
命令。
事件:'inspectorNotification'
#
- <Object> 通知消息对象
当接收到来自 V8 Inspector 的任何通知时触发。
session.on('inspectorNotification', (message) => console.log(message.method));
// Debugger.paused
// Debugger.resumed
注意 不建议使用同线程会话的断点,请参阅 支持断点。
也可以只订阅具有特定方法的通知
事件:<inspector-protocol-method>
;#
- <Object> 通知消息对象
当接收到检查器通知时触发,该通知的 method 字段设置为 <inspector-protocol-method>
值。
以下代码片段在 'Debugger.paused'
事件上安装侦听器,并在程序执行暂停时(例如,通过断点)打印程序暂停的原因
session.on('Debugger.paused', ({ params }) => {
console.log(params.hitBreakpoints);
});
// [ '/the/file/that/has/the/breakpoint.js:11:0' ]
注意 不建议使用同线程会话的断点,请参阅 支持断点。
session.connect()
#
将会话连接到检查器后端。
session.connectToMainThread()
#
将会话连接到主线程检查器后端。 如果未在 Worker 线程上调用此 API,则会抛出异常。
session.disconnect()
#
立即关闭会话。 所有待处理的消息回调都将以错误形式调用。 需要调用 session.connect()
才能再次发送消息。 重新连接的会话将丢失所有检查器状态,例如启用的代理或配置的断点。
session.post(method[, params][, callback])
#
method
<string>params
<Object>callback
<Function>
将消息发布到检查器后端。 收到响应时会通知 callback
。 callback
是一个函数,它接受两个可选参数:error 和特定于消息的结果。
session.post('Runtime.evaluate', { expression: '2 + 2' },
(error, { result }) => console.log(result));
// Output: { type: 'number', value: 4, description: '4' }
V8 检查器协议的最新版本发布在 Chrome DevTools Protocol Viewer 上。
Node.js 检查器支持 V8 声明的所有 Chrome DevTools Protocol 域。 Chrome DevTools Protocol 域提供了一个接口,用于与用于检查应用程序状态和侦听运行时事件的运行时代理之一进行交互。
当发送 HeapProfiler.takeHeapSnapshot
或 HeapProfiler.stopTrackingHeapObjects
命令到 V8 时,不能将 reportProgress
设置为 true
。
用法示例#
除了调试器之外,还可以通过 DevTools 协议使用各种 V8 分析器。
CPU 分析器#
这是一个展示如何使用 CPU 分析器 的示例
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));
}
});
});
});
堆分析器#
这是一个展示如何使用 堆分析器 的示例
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()
#
尝试关闭所有剩余的连接,阻止事件循环,直到所有连接都关闭。 一旦所有连接都关闭,则停用检查器。
inspector.console
#
- <Object> 一个用于将消息发送到远程检查器控制台的对象。
require('node:inspector').console.log('a message');
检查器控制台与 Node.js 控制台没有 API 对等性。
inspector.open([port[, host[, wait]]])
#
port
<number> 用于侦听检查器连接的端口。 可选。 默认: 命令行上指定的端口。host
<string> 用于侦听检查器连接的主机。 可选。 默认: 命令行上指定的主机。wait
<boolean> 阻塞直到客户端连接。 可选。 默认:false
。- 返回: <Disposable> 调用
inspector.close()
的 Disposable。
在主机和端口上激活检查器。 等效于 node --inspect=[[host:]port]
,但可以在节点启动后以编程方式完成。
如果 wait 为 true
,则会阻塞,直到客户端连接到检查端口,并且流控制已传递到调试器客户端。
请参阅关于 host
参数用法的 安全警告。
inspector.url()
#
- 返回值: <string> | <undefined>
返回活动检查器的 URL,如果没有,则返回 undefined
。
$ node --inspect -p 'inspector.url()'
Debugger listening on ws://127.0.0.1:9229/166e272e-7a30-4d09-97ce-f1c012b43c34
For help, see: https://node.org.cn/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://node.org.cn/en/docs/inspector
ws://localhost:3000/51cf8d0e-3c36-4c59-8efd-54519839e56a
$ node -p 'inspector.url()'
undefined
inspector.waitForDebugger()
#
阻塞直到客户端(已存在的或稍后连接的)发送 Runtime.runIfWaitingForDebugger
命令。
如果没有活动的检查器,将会抛出一个异常。
与 DevTools 集成#
node:inspector
模块提供了一个 API,用于与支持 Chrome DevTools 协议的开发工具集成。 连接到正在运行的 Node.js 实例的 DevTools 前端可以捕获从该实例发出的协议事件,并相应地显示它们以方便调试。 以下方法将协议事件广播到所有连接的前端。 传递给这些方法的 params
可以是可选的,具体取决于协议。
// The `Network.requestWillBeSent` event will be fired.
inspector.Network.requestWillBeSent({
requestId: 'request-id-1',
timestamp: Date.now() / 1000,
wallTime: Date.now(),
request: {
url: 'https://node.org.cn/en',
method: 'GET',
},
});
inspector.Network.requestWillBeSent([params])
#
params
<Object>
此功能仅在启用 --experimental-network-inspection
标志时可用。
将 Network.requestWillBeSent
事件广播到连接的前端。 此事件表明应用程序即将发送 HTTP 请求。
inspector.Network.responseReceived([params])
#
params
<Object>
此功能仅在启用 --experimental-network-inspection
标志时可用。
将 Network.responseReceived
事件广播到连接的前端。 此事件表明 HTTP 响应可用。
对断点的支持#
Chrome DevTools 协议 Debugger
域 允许 inspector.Session
附加到程序并设置断点以单步执行代码。
但是,应避免使用同线程的 inspector.Session
设置断点,该断点通过 session.connect()
连接,因为附加和暂停的程序正是调试器本身。 而是尝试通过 session.connectToMainThread()
连接到主线程,并在工作线程中设置断点,或者通过 WebSocket 连接与 Debugger 程序连接。