Windows下mitmdump抓安卓请求报too many file descriptors错误求助
报错根因
你遇到的ValueError: too many file descriptors in select()是Windows平台的固有限制:Windows默认的select()系统调用最多仅支持同时监听512个文件描述符,当mitmdump处理的并发请求量超过阈值时就会触发该错误,和mitmdump本身源码逻辑无关,无需修改源码即可解决。
可行解决方案
- 方案1:替换Python异步事件循环(最优先推荐)
在你配合mitmdump使用的自定义Python脚本的最开头添加如下代码,将默认的SelectorEventLoop替换为Windows专属的ProactorEventLoop,该事件循环没有512个文件描述符的限制:
import asyncio asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())
- 方案2:限制mitmdump并发连接数
启动mitmdump时添加--max-connections参数主动限制同时处理的连接数,避免并发量超过阈值,适合请求量不大的场景,示例启动命令:
mitmdump -s your_script.py --max-connections 200
- 方案3:调高Windows系统文件描述符上限
Windows默认C运行时最多允许打开512个文件,可通过pywin32库调整上限到最高2048,首先安装依赖:
pip install pywin32
之后在你的自定义脚本开头添加如下代码:
import win32file win32file._setmaxstdio(2048)
- 方案4:使用WSL2运行mitmdump
如果需要处理高并发请求,推荐在WSL2(Windows子系统Linux)环境中运行mitmdump,Linux平台默认的文件描述符上限远高于Windows,且不存在select调用的512阈值限制,稳定性远高于原生Windows运行。
额外排查点
检查你的自定义Python脚本是否存在文件描述符泄漏问题:比如打开的文件句柄用完未关闭、发起的额外网络连接未正确释放,这类泄漏会快速消耗文件描述符,即使并发量不高也会触发报错。
内容的提问来源于stack exchange,提问作者kkkino
相关产品推荐
相关产品推荐

