先区分界面退出、内核退出和窗口隐藏
Clash 客户端通常由图形界面、代理内核和可选的后台服务组成。界面消失,不一定代表内核崩溃;节点全部超时,也不等于客户端闪退。先判断退出的是哪一层,再处理配置,能避免反复重装却保留同一个故障源。
| 观察到的现象 | 优先检查 | 判断依据 |
|---|---|---|
| 窗口消失,托盘图标仍在 | 关闭窗口后最小化到托盘的设置 | 从托盘菜单重新显示窗口,确认是否只是隐藏 |
| 界面正常,提示内核未连接 | 配置解析、内核进程与控制端口 | 查看内核日志,而不是先清除界面数据 |
| 窗口与进程同时退出 | 系统崩溃记录、运行环境与应用数据 | 记录退出时间和故障模块 |
| 开启 TUN 后才退出 | 服务权限、虚拟网卡与其他 VPN | 关闭 TUN 后是否可以稳定启动 |
Windows 用 Ctrl + Shift + Esc 打开任务管理器,在“详细信息”中观察客户端及内核进程。macOS 打开“活动监视器”搜索客户端名称和 mihomo。Android 到「设置」→「应用」→对应客户端,区分应用退出与 VPN 连接断开;不同系统厂商的菜单名称可能略有差异。
备份配置,再收集第一次错误
保留订阅和本地修改
先完整退出客户端及其后台服务,再备份配置目录。重点保留订阅地址、本地 YAML、覆写片段、规则集和策略组选择记录。配置目录由具体客户端决定,不应把某个产品的路径套到所有 Clash 客户端上。能够进入界面时,优先使用客户端提供的“打开配置目录”或“打开日志目录”入口。
界面无法打开时,可以检查安装说明和系统应用数据目录。Windows 常见位置位于 %APPDATA% 或 %LOCALAPPDATA% 下的应用子目录;macOS 通常在 ~/Library/Application Support/ 下。不要直接删除这两个上层目录。Android 的私有应用数据通常无法通过普通文件管理器读取,清除存储前应先确认订阅与本地配置已有外部备份。
日志按时间定位,不只看最后一行
- Windows:按 Win + R,输入
eventvwr.msc,进入「Windows 日志」→「应用程序」。查找退出时间附近的 Application Error、.NET Runtime 或 Windows Error Reporting 记录,保存故障应用、模块与异常代码。 - macOS:打开“控制台”,查看崩溃报告;也可检查
~/Library/Logs/DiagnosticReports/。保留异常类型、终止原因与崩溃线程信息。 - Android:熟悉 ADB 的用户可在启用 USB 调试后,用下列命令收集一次启动过程。先清空缓冲区会移除旧日志,仅在不需要保留旧记录时执行。
adb logcat -c
adb logcat -v time > clash-startup.txt
# 此时在手机上启动客户端,复现退出后按 Ctrl+C 停止记录
Android 日志中重点搜索 FATAL EXCEPTION、AndroidRuntime、Fatal signal 和应用包名。桌面端则关注 permission denied、address already in use、panic 及配置解析错误。最后一条“连接失败”可能只是内核退出后的连带提示,真正原因往往出现在更早的位置。
用最小配置判断 YAML 与内核兼容性
如果刚更新订阅、修改覆写或升级内核后出现异常,先回滚最近一次修改。订阅源文件、客户端覆写和最终运行配置不是同一份文件;检查的是内核实际加载的配置,而不只是订阅编辑器里的内容。
先做语法与加载测试
以下命令针对 mihomo,示例假设内核与配置放在同一测试目录。使用实际存在的内核文件;其他 Clash 分支应先查看其 -h 帮助,不能默认所有参数完全一致。
# Windows PowerShell
.\mihomo.exe -v
.\mihomo.exe -t -f .\config.yaml
# macOS / Linux
./mihomo -v
./mihomo -t -f ./config.yaml
-t 用于测试配置能否通过加载检查,不代表节点可连接,也不能替代真实启动。出现 YAML 行号错误时,先检查缩进是否混入制表符、冒号后是否缺少空格,以及策略组引用的名称是否存在。解析器可能在错误位置的下一行才停止,应同时查看报错行的前后几行。
隔离订阅、规则集和 TUN
备份后,在单独测试目录创建下列最小配置。它仅用于验证内核能否启动,全部流量按直连处理,不包含任何代理节点。测试时退出原客户端,避免同时启动两个内核。
mixed-port: 17890
allow-lan: false
mode: rule
log-level: info
tun:
enable: false
dns:
enable: false
rules:
- MATCH,DIRECT
用 .\mihomo.exe -f .\minimal.yaml 或 ./mihomo -f ./minimal.yaml 前台启动,观察是否持续运行,然后按 Ctrl + C 结束。这里选择 17890 是为了与常见的 7890 区分,并不保证该端口一定空闲。测试期间不要开启系统代理或 TUN。
- 最小配置仍退出:优先检查内核架构、文件权限、运行目录和系统崩溃记录。
- 最小配置正常:逐项恢复节点、策略组、规则集、DNS,最后恢复 TUN。
- 只在某个片段恢复后异常:保留该片段与准确错误信息,检查所需内核功能及配置格式。
Clash、Clash Meta 与 mihomo 的配置能力并不完全相同。某个字段被忽略或拒绝加载,都可能造成行为差异;不能仅凭 YAML 格式正确就认定配置适用于当前内核。对 proxy-providers、rule-providers 还要检查文件路径、远程响应内容及读写权限。
检查代理端口、控制端口与残留进程
address already in use 表示监听地址已被占用。代理监听端口和控制接口端口用途不同:例如 mixed-port: 7890 用于 HTTP/SOCKS 代理,external-controller: 127.0.0.1:9090 用于管理接口;这些只是常见配置值,应以当前运行配置为准。
Windows 查询占用者
netstat -ano | findstr ":7890"
netstat -ano | findstr ":9090"
# 示例:确认 PID 1234 的进程名称
tasklist /FI "PID eq 1234"
查看本地地址和 LISTENING 状态,再按 PID 定位进程,不要把远端地址中的相同端口误判为本地占用。若是上一次运行残留的内核,先从客户端或对应服务正常退出;若属于其他程序,应决定保留哪个监听服务,而不是直接终止陌生系统进程。
macOS 查询监听端口
lsof -nP -iTCP:7890 -sTCP:LISTEN
lsof -nP -iTCP:9090 -sTCP:LISTEN
若将代理端口从 7890 改为 17890,浏览器插件、命令行环境变量及系统代理也必须同步。修改客户端管理接口前,则要确认界面是否会自动跟随;控制端口不一致会表现为“内核未连接”,即使内核本身仍在运行。
按 Windows、macOS、Android 修复运行环境
Windows:先确认故障模块,再处理运行库
若日志指向界面运行时,应按该客户端的发布说明安装对应依赖。例如使用 WebView2 的客户端需要可用的 WebView2 Runtime,但这不意味着所有 Clash 客户端都依赖它。只有缺失 DLL 或发布说明明确要求时,才处理相应 Visual C++ 运行库;不要从不明站点单独下载 DLL 放进系统目录。
检查 Windows 安全中心的「病毒和威胁防护」→「保护历史记录」,确认内核是否被隔离。应先核实安装包来源与告警内容,不要通过长期关闭安全防护解决。界面初始化与配置解析通常不需要管理员权限;仅在安装服务或启用 TUN 等明确需要权限的步骤提权。
macOS:区分 Intel、Apple Silicon 与权限提示
在「关于本机」确认处理器:Apple 芯片优先选 arm64 包,Intel 处理器选择 x64 包。系统的“无法打开”安全提示与启动后崩溃是两种问题。对来源可信的应用,可按「系统设置」→「隐私与安全性」中的系统提示处理,不应批量移除所有应用的安全属性。
若报告包含 dyld、缺失动态库或架构不兼容,优先重新安装匹配系统的完整应用包,而不是从另一台机器复制内核。TUN 相关异常则先关闭其他 VPN,再按客户端文档检查辅助服务授权。
Android:启动闪退与后台断开分别排查
通过 adb shell getprop ro.product.cpu.abilist 可查看设备支持的 ABI。arm64、armv7 和通用安装包应按设备与客户端支持情况选择;APK 使用的 ABI、应用最低 Android 版本和系统实际版本都需要匹配。
先到「设置」→「应用」→客户端→「存储和缓存」尝试清除缓存。清除存储会删除本地配置,应放到备份之后。若只是锁屏几分钟后 VPN 断开,应检查电池优化与后台运行权限,这与点击图标后立即出现崩溃提示不是同一类故障。Android 同一用户下通常只能有一个活动的 VPN 服务,测试时先断开其他 VPN 应用。
重装内核与回滚版本的正确顺序
只有在最小配置仍不能启动、内核文件缺失,或升级后出现稳定可复现的退出时,才进入重装与版本回滚。随意替换内核可能破坏客户端与控制接口之间的兼容关系,不能把任意 mihomo 可执行文件改名后塞进安装目录。
- 保存现场:导出日志和配置备份,记录当前客户端与内核版本,不覆盖唯一的可用安装包。
- 停止相关进程:退出托盘程序,按客户端文档停止辅助服务,确认监听端口已释放。
- 恢复配套组件:优先使用客户端内置的内核恢复功能;无法启动界面时,重新安装同一版本的完整安装包。
- 隔离旧数据:备份后将应用自己的数据目录改名保留,让客户端生成新目录。不要删除整个系统应用数据目录。
- 先验证空白环境:不导入旧覆写,不开自动启动和 TUN,确认界面与内核均能持续运行。
- 逐项恢复:先导入一份已知可用配置,再恢复 DNS、规则集和 TUN。每次只改变一项,记录结果。
新版本在全新数据目录仍稳定复现,而同一设备上的上一版正常,才有较强依据怀疑版本回归。回滚时使用来源可信、与系统架构一致的安装包,并留意新版数据格式是否能被旧版读取;必要时分别使用独立数据目录测试。
修复后验证与故障反馈清单
修复完成不只看“窗口能打开”。建议依次验证:界面保持打开、内核完成初始化、代理端口开始监听、导入配置成功、规则模式可用,最后再开启 TUN。每一步确认日志没有重复启动或退出,再进行下一步。
- 正常退出并重新启动一次,检查是否仍加载正确配置。
- 重启系统后验证服务权限和代理开关,排除只有手动启动才正常的情况。
- 提供客户端版本、内核版本、系统版本和架构,并写清最近一次升级或配置变更。
- 附上脱敏日志、崩溃时间和最短复现步骤,说明最小配置是否也会触发退出。
处理顺序保持一致:先确认退出层级,再看日志;先回滚配置,再查端口;先验证运行环境,最后重装配套组件。这样既能保留已有规则,也能把“Clash 打开就闪退”缩小成可复现、可定位的具体问题。