先区分窗口关闭、界面崩溃与内核退出
“Clash 打开即闪退”可能对应三个不同问题:窗口隐藏到托盘、图形界面进程崩溃,或者界面仍在但内核启动失败。配置错误和端口冲突通常先影响内核,不一定导致整个客户端退出。先确认故障层级,再决定检查配置还是修复运行环境。
- 检查后台进程。Windows 按
Ctrl + Shift + Esc打开任务管理器;macOS 打开“活动监视器”;Linux 使用ps -ef。界面消失但客户端与内核仍在运行时,先查看托盘、菜单栏和多显示器窗口位置。 - 记录复现条件。区分首次安装就失败、升级后失败、导入订阅后失败,以及开启 TUN 后失败。记录操作系统版本、CPU 架构、客户端版本和内核版本,不要只写“最新版”。
- 完整退出一次。从托盘菜单退出客户端,确认相关进程已结束后再重试。后台旧实例可能继续占用端口;反复双击启动只会增加干扰。
日志定位:保留启动时间与第一条错误
客户端日志、内核日志和系统崩溃报告回答的问题不同。客户端日志关注界面初始化、内核路径和服务连接;内核日志关注 YAML、监听端口和规则加载;系统报告用于定位运行库、动态库与进程异常退出。
按系统找到启动失败记录
- Windows:按
Win + R,输入eventvwr.msc,进入“Windows 日志”→“应用程序”,按故障发生时间查看“Application Error”等记录,保留故障应用程序、故障模块与异常代码。客户端数据可能在%APPDATA%或%LOCALAPPDATA%下,便携版也可能写入程序旁的目录,应以该客户端文档和启动日志为准。 - macOS:打开“控制台”,查看崩溃报告;也可检查
~/Library/Logs/DiagnosticReports/。重点记录进程名、异常类型和终止原因,不要把另一款应用的同期报告当作代理客户端日志。 - Linux:从终端启动安装后的实际可执行文件,观察标准错误。若系统使用 systemd,可查看
journalctl --user -b --since "10 minutes ago";启用了崩溃收集时,再用coredumpctl list查找对应进程。不同发行版未必启用同一套收集机制。
用错误关键词决定下一步
| 日志片段 | 优先检查 | 验证方式 |
|---|---|---|
yaml: line、unmarshal | 缩进、字段类型、配置合并 | 使用同一内核测试实际加载文件 |
address already in use | 端口已有监听进程 | 查询日志中对应端口的 PID |
permission denied | 可执行权限、目录写权限、TUN 权限 | 区分失败对象是文件还是网络设备 |
no such file、exec format error | 内核路径、文件缺失、CPU 架构 | 检查文件是否存在及架构是否匹配 |
| WebView、动态库或故障模块记录 | 图形界面运行环境 | 结合客户端采用的界面技术确认依赖 |
日志末尾的“内核已停止”通常只是结果。应向前查找本次启动中最早的具体错误,并保留前后约 30 行。分享前隐藏订阅地址、认证信息、控制接口密钥和个人目录名;代理节点地址也可能属于敏感信息。
配置回滚:验证实际加载的 YAML
订阅更新后立即失败,优先考虑配置变化。订阅原始文件不一定就是内核读取的最终文件:客户端可能叠加覆写、脚本、规则片段或 TUN 设置。只验证下载下来的订阅,无法排除合并阶段产生的错误。
- 完整退出客户端,备份当前订阅、覆写文件和客户端设置,不直接删除数据目录。
- 恢复最近一次能启动的配置,同时暂时停用新加的覆写或脚本。若界面无法进入,可在备份后按客户端文档恢复对应配置文件,不猜测内部数据库结构。
- 使用客户端实际捆绑的内核测试最终配置。旧版 Clash 与 mihomo 支持的协议、字段不同,不能用另一个内核的通过结果代替。
- 恢复启动后,逐项启用订阅更新、规则集、自定义 DNS 和 TUN,找出重新触发故障的改动。
以 mihomo 为例,在终端进入内核所在目录,将待检查配置副本保存为该目录下的 config.yaml,再执行对应命令。若配置引用相对路径,应通过 -d 指定正确的数据目录,并保持相关文件位置一致。
# Windows PowerShell
.\mihomo.exe -t -f .\config.yaml
# macOS / Linux
./mihomo -t -f ./config.yaml
-t 用于测试配置,不代表所有远程规则集、节点连通性和运行时权限都已验证。若日志指向具体行号,同时检查前一行:漏掉冒号、Tab 缩进、列表层级错误,都可能让解析器在下一行才报错。
最小配置只用于隔离问题
下面的配置用于判断内核能否完成基本启动,不含代理节点,所有匹配流量都直连。将其保存为独立测试文件,完成检查后再恢复原配置;不要把它误当成可用的代理订阅。
mixed-port: 17890
allow-lan: false
mode: rule
log-level: info
rules:
- MATCH,DIRECT
如果最小配置能启动,原配置失败,优先回查节点协议、策略组引用、规则集路径和覆写结果。若最小配置也无法启动,继续检查端口、内核文件和系统环境。示例中的 17890 仍需确认未被占用。
端口冲突:从监听进程确认占用来源
常见配置会使用 7890 作为混合代理端口、9090 作为控制接口端口,但这些不是所有客户端的固定值。以日志和最终配置为准;HTTP、SOCKS、DNS 监听端口也可能各自发生冲突。
Windows 查询监听 PID
Get-NetTCPConnection -State Listen -LocalPort 7890,9090 |
Select-Object LocalAddress,LocalPort,OwningProcess
Get-Process -Id 4321
第二条命令中的 4321 是示例 PID,应替换为第一条命令返回的值。查到旧客户端时,优先从其托盘菜单退出;查到其他服务时,先确认用途,不直接结束不认识的系统进程。若无权限读取完整信息,再按需使用管理员终端。
macOS 与 Linux 查询端口
# macOS
lsof -nP -iTCP:7890 -sTCP:LISTEN
lsof -nP -iTCP:9090 -sTCP:LISTEN
# Linux
ss -lntp
这些命令针对 TCP 监听。若错误涉及 DNS 的 UDP 监听,还需使用 lsof -nP -iUDP:1053 或 Linux 的 ss -lnup,并将 1053 换成实际端口。端口调整后,同步更新系统代理、浏览器扩展和命令行代理环境变量,否则可能出现“客户端启动成功但应用无法联网”。
内核文件与 TUN 权限:按失败对象修复
升级中断、文件被安全软件隔离、安装目录不可写,均可能导致客户端找不到内核。先从日志确认实际内核路径,再检查文件是否存在。不要把任意下载的二进制重命名后替换进去,客户端可能依赖特定启动参数、控制接口行为或配套资源。
- Windows:在“Windows 安全中心”→“病毒和威胁防护”→“保护历史记录”中查看是否存在对应记录。核对来源与告警内容后再决定处理方式,不关闭全局防护。安装版优先用原安装包修复;便携版可解压到当前用户有写权限的新目录测试。
- macOS:确认安装包适配 Apple 芯片或 Intel 架构。若系统明确提示应用被阻止,在确认来源后查看“系统设置”→“隐私与安全性”中的相关选项;不要对整个下载目录批量移除安全属性。
- Linux:用
uname -m查看机器架构,用file ./mihomo查看内核类型。文件存在仍提示无法执行时,还应检查动态加载器、挂载选项和架构,而非只判断为“缺权限”。
Linux 上,只有确认目标文件可信且确实缺少执行位时,才对该文件执行 chmod u+x ./mihomo。不要对整个用户目录使用递归宽权限,也不要长期用 root 运行图形界面来绕过数据目录权限错误。
开启 TUN 后失败的隔离方法
先关闭 TUN,仅启动内核和本地代理端口。如果普通代理模式能运行,而 TUN 开启后出现设备创建、路由或权限错误,故障范围就收敛到虚拟网卡与特权服务。Windows 客户端通常通过管理员权限或服务模式完成相关操作;macOS 可能需要安装辅助程序;Linux 常涉及 /dev/net/tun 和网络管理权限。具体安装入口随客户端版本变化,应使用该版本提供的服务安装流程。
同时暂停其他 VPN 或另一套 TUN 客户端再测试,避免多套工具修改默认路由。修复后先验证普通代理,再启用 TUN;不要同时改 DNS、路由和订阅,否则难以确认哪项操作有效。
界面运行时:WebView2、Electron 与系统组件
内核可以独立启动,而窗口仍然白屏或立即消失时,再检查图形界面运行时。不同客户端采用的技术不同:部分 Windows 客户端依赖 WebView2,另一些使用 Electron 或 Flutter。看到“Clash”名称就统一重装 WebView2,可能与实际故障无关。
- 确认客户端依赖。查看该版本的安装说明和系统要求。对明确依赖 WebView2 的 Windows 客户端,可在“设置”→“应用”→“已安装的应用”中搜索 Microsoft Edge WebView2 Runtime;系统版本不同,列表位置可能有差异。
- 按官方流程修复。使用 Microsoft 官方分发的 WebView2 Runtime 安装程序修复或重新安装,并重启客户端。不要从不明网站单独下载 DLL 放入程序目录。
- 核对故障模块。Electron 或 Flutter 客户端应按其日志排查运行库、图形驱动和应用资源。只有客户端文档明确支持时才尝试禁用硬件加速,不照搬另一款客户端的启动参数。
Linux 的 WebKitGTK、图形会话和动态库依赖取决于安装包类型。优先从终端获取明确的缺失库名称,再使用发行版软件包管理器处理;不要混装来自其他发行版的库文件。macOS 则先确认系统版本满足当前安装包要求,再考虑重装客户端。
隔离数据目录:保留可恢复的旧状态
配置验证、端口检查和运行时修复均无结果时,再测试全新用户数据。卸载后重装并不一定清除用户目录,所以“重装仍闪退”不能直接证明安装包有问题。
- 退出所有相关进程。若后台服务仍在写入,先通过客户端支持的方式停止,避免备份期间文件变化。
- 确认实际目录。依据日志、文档或客户端的目录入口定位数据,不把安装目录、系统缓存与用户配置混为一谈。
- 复制并改名。先备份整个目录,再将原目录改为带日期的名称,例如
client-data-backup-20260929。不要立即永久删除,也不要公开上传整个目录。 - 空状态启动。不导入订阅、不启用 TUN,确认界面和内核都正常后,逐项恢复订阅、自定义规则、覆写和偏好设置。
如果空状态正常,恢复某一项后再次失败,就保留该项的最小复现副本。不要整目录覆盖回去,否则损坏的状态文件也会一并恢复。若空状态仍失败,且同一内核独立运行正常,应优先提交界面层的崩溃信息,而不是继续修改代理规则。
修复验收与故障反馈记录
窗口能打开只是第一步。修复后应验证内核持续运行、监听端口正确、订阅能够加载,以及开启所需功能后不会再次退出。测试系统代理与 TUN 时分别进行,并检查原有系统代理设置是否已恢复到预期状态。
- 启动验收:连续完成两次正常启动与退出,确认退出后没有遗留进程占用相同端口。
- 配置验收:手动更新一次订阅,查看最终配置测试与规则集加载结果;失败时保留旧配置,不自动覆盖唯一可用副本。
- 模式验收:先验证本地代理,再测试系统代理,最后按需开启 TUN,逐项观察日志。
- 反馈材料:提供系统版本、架构、客户端与内核版本、复现步骤、首条错误及脱敏日志,并注明最小配置和全新数据目录是否能启动。
提交问题时,把“升级后启动两秒退出,最小配置正常,恢复某段覆写后复现”写清楚,比只附一张错误弹窗更便于定位。排查结束后,将临时提升的日志等级恢复为日常设置,妥善保存可用配置备份,并清理含敏感信息的临时诊断文件。