memory-leaks - 在 Jest 中调试内存泄漏的步骤是什么?
问题描述
我在 Jest 中的测试似乎正在泄漏:
调试此类问题的推荐步骤是什么?
我是这种问题的新手。如您所见,我尝试传入Jest 中记录的选项(--forceExit --detectOpenHandles --runInBand --logHeapUsage),但这并不能解决我的问题。
解决方案
我遇到了我需要调试一些泄漏内存的测试,并发现对运行测试的进程进行 Heapdump 比预期的要棘手。如果你--inspect
在 cli 命令中添加标志,它只会检查jest
进程。
为了将调试器附加到您的测试执行器,请进入node_modules/jest_worker/build/worker.js
并将--inspect
标志添加到工作人员。开玩笑通常会剥去--inspect
旗帜。
使用此代码:
_initialize() {
const args = process.execArgv.filter(v => !/^--(debug|inspect)/.test(v));
args.push('--inspect');
const child = (_child_process || _load_child_process()).default.fork(
require.resolve('./child'),
// $FlowFixMe: Flow does not work well with Object.assign.
Object.assign(
{
cwd: process.cwd(),
env: Object.assign({}, process.env, {
JEST_WORKER_ID: this._options.workerId,
}),
// Suppress --debug / --inspect flags while preserving others (like --harmony).
execArgv: args,
silent: true,
},
this._options.forkOptions,
),
);
...
}
最后像这样运行你的测试:
node --expose-gc scripts/test.js --env=jsdom --runInBand --logHeapUsage
如果你没有弹出你的测试react-scripts
,你可能必须先这样做,在你完成调试后可以恢复更改。--runInBand
很重要,否则你会得到太多的工人,开玩笑创造的工人比你的计算机中的核心少一个,所以很难检查/与他们一起工作。
不要将--inspect
标志添加到node --expose-gc scripts/test.js --env=jsdom --runInBand --logHeapUsage
命令中,因为这样 jest 进程将采用默认调试器端口。
在这一步之后,您运行测试并打开Google Chrome
,导航到chrome://inspect/
您的进程将出现在列表中Remote Targets
,您可以从那里进行内存分析并获取测试进程的堆转储。
推荐阅读
- node.js - 如何在环回模型查询中对嵌套对象应用字段过滤器?
- asp.net - AbpAuthorize 属性所需的覆盖权限
- javascript - 尝试调试 TestCafe 测试时 VS 代码出错
- r - 缩放数据框会阻止按特定列(dplyr,R)排列?
- python - 基于其他 Array 访问 Numpy Array
- arm - STL 指令和内存观察器
- php - json_decode 返回 null 如果 json 带有特殊字符,例如 &,#
- c# - 在 EmguCV 中按强度对灰度图像的像素进行排序
- sql - 如何通过多个值获取记录?
- c# - MongoDB多文档事务,读取未提交数据