调试指南
本文档介绍如何使用调试配置 API 来排查 Cap'n Proto RPC 连接和消息处理中的问题。
启用调试模式
环境变量 (Node.js)
最简单的启用方式是通过 CAPNP_DEBUG 环境变量:
bash
CAPNP_DEBUG=1 node your-app.js或者在导入库之前设置:
typescript
process.env.CAPNP_DEBUG = '1';
import { enableDebug } from '@naeemo/capnp';程序化 API
你也可以在运行时通过代码启用调试模式:
typescript
import { enableDebug, disableDebug, isDebugEnabled } from '@naeemo/capnp';
// 使用默认选项启用
enableDebug();
// 使用自定义选项启用
enableDebug({
colors: true, // 启用彩色输出
maxBytes: 512, // 最多记录 512 字节的二进制数据
filter: 'Call' // 只记录包含 'Call' 的消息
});
// 检查是否已启用调试模式
if (isDebugEnabled()) {
console.log('调试模式已激活');
}
// 禁用调试模式
disableDebug();调试选项
colors?: boolean
在调试输出中启用 ANSI 颜色代码。默认:true
颜色有助于区分不同类型的消息,让终端中的日志更易读。
maxBytes?: number
记录二进制消息数据时显示的最大字节数。默认:256
大消息可能产生过多的输出,此选项限制显示的原始二进制数据量。
typescript
enableDebug({ maxBytes: 1024 }); // 最多显示 1KB 二进制数据filter?: string | RegExp
按消息类型或对端标识符过滤调试输出。默认:''(不过滤)
当你只想查看特定类型的消息时很有用:
typescript
// 按消息类型名称过滤
enableDebug({ filter: 'Call' });
// 使用正则表达式过滤
enableDebug({ filter: /^(Call|Return)$/ });
// 按对端过滤(格式:"messageType:peerId")
enableDebug({ filter: 'Call:client1' });记录的信息
启用调试模式后,会记录以下信息:
消息事件
- 发送/接收: 所有发送和接收的 RPC 消息
- 消息类型: Bootstrap、Call、Return、Finish、Resolve、Release 等
- 载荷大小: 消息的字节数
- 二进制预览: 消息内容的十六进制转储(遵守
maxBytes设置)
连接事件
- 连接建立: 当新的 RPC 连接建立时
- 连接关闭: 当连接终止时
- 能力解析: 当 Promise 被解析时
- 管道操作: Promise 管道活动
错误事件
- 序列化错误: 编码/解码消息时的问题
- 协议错误: RPC 协议违规
- 传输错误: WebSocket/TCP 连接问题
- 超时事件: 操作超时
调试输出示例
[CAPNP:DEBUG] [SND] Call (questionId=1, interfaceId=0x12345678, methodId=0)
Target: imported capability #5
Payload: 45 bytes
Hex: 00 00 00 00 05 00 00 00 00 00 00 00 ...
[CAPNP:DEBUG] [RCV] Return (answerId=1)
Result: success (30 bytes)
Hex: 00 00 00 00 00 00 00 00 0a 00 00 00 ...性能影响
调试模式有以下性能影响:
禁用时(默认)
当调试模式禁用时:
- 调试检查无运行时开销
- 调试代码在生产构建中可被 tree-shake
- 零内存开销
启用时
当调试模式启用时:
- CPU: 由于消息检查,约 5-10% 的开销
- 内存: 十六进制格式化需要额外的缓冲
- I/O: 控制台输出可能在高吞吐场景下拖慢速度
建议
- 开发环境: 开发时始终启用调试模式
- 生产环境: 使用环境变量条件启用
- 高吞吐: 使用过滤减少日志量
- 大数据: 在大消息场景下降低
maxBytes
typescript
// 生产环境安全的调试设置
import { enableDebug } from '@naeemo/capnp';
if (process.env.NODE_ENV !== 'production' || process.env.CAPNP_DEBUG) {
enableDebug({
colors: process.env.NODE_ENV !== 'production',
maxBytes: 128,
filter: process.env.CAPNP_FILTER
});
}故障排除技巧
无调试输出
- 验证调试模式是否启用:
console.log(isDebugEnabled()) - 检查过滤设置 - 可能过于严格
- 确保在启用调试后再导入其他模块
输出过多
- 使用
filter选项缩小范围 - 降低
maxBytes限制二进制数据 - 如果输出到文件,考虑禁用颜色
性能问题
- 生产构建中禁用调试
- 对高频消息使用积极的过滤
- 设置
maxBytes: 0完全跳过二进制数据
与日志库集成
调试 API 可以与结构化日志系统集成:
typescript
import { enableDebug, isDebugEnabled } from '@naeemo/capnp';
import { createLogger } from './my-logger';
const logger = createLogger();
// 启用 Cap'n Proto 调试模式
enableDebug({
colors: false, // 让日志库处理颜色
maxBytes: 256
});
// 重定向调试输出到你的日志库
const originalLog = console.log;
console.log = (...args) => {
if (isDebugEnabled() && args[0]?.includes('[CAPNP:DEBUG]')) {
logger.debug('capnp', args.join(' '));
} else {
originalLog.apply(console, args);
}
};