先分清:窗口关闭、内核退出,还是整个客户端崩溃

双击图标后没看到窗口,不一定是 Clash 闪退。桌面客户端通常分成图形界面、代理内核和可选的后台服务三部分。窗口可能最小化到托盘,界面也可能正常启动、但 mihomo 内核因配置错误退出。只有把出问题的那一层找出来,修复才不会绕远路。

  1. 检查托盘或菜单栏。Windows 展开任务栏右侧隐藏图标;macOS 查看屏幕顶部菜单栏。有图标时先尝试“显示主界面”,不要连续启动多个副本。
  2. 检查进程。Windows 打开“任务管理器”→“详细信息”;macOS 打开“活动监视器”;Linux 使用系统监视器。分别看客户端进程与 mihomo 等内核进程是否还在。
  3. 记录触发时机。刚升级后打不开、更新订阅后退出、启用 TUN 后退出,分别优先指向程序环境、配置和权限问题。
  4. 退出重复实例后再试一次。先通过托盘退出,再确认进程结束。后台服务可能仍在运行,不能仅凭关闭窗口判断已经彻底退出。

找到启动日志:各平台从哪里看

还能打开界面时,优先在“设置”中寻找“打开日志目录”“打开配置目录”或“应用目录”入口。界面日志常记录内核输出,却不一定记录界面自身的崩溃;完全打不开时,需要同时查看系统的崩溃记录。

平台优先检查位置需要注意
Windows %APPDATA%、%LOCALAPPDATA% 中的客户端目录;“事件查看器”→“Windows 日志”→“应用程序” 传统 Clash for Windows 常使用 %USERPROFILE%\.config\clash;便携版可能把数据放在程序旁边。
macOS ~/Library/Logs/DiagnosticReports/;~/Library/Application Support/ 中的客户端目录 通过“访达”→“前往”→“前往文件夹”输入路径。系统崩溃报告常为 .ips 文件。
Linux ~/.config/、~/.local/share/、~/.local/state/ 中的应用目录;终端输出与 systemd 日志 Flatpak 数据通常在 ~/.var/app/ 对应应用目录内,与普通安装包不同。
Android 客户端内的日志导出;ADB 的 logcat 与 crash 缓冲区 应用私有目录通常无法由普通文件管理器直接读取。先导出,再考虑清除数据。

Windows:看异常模块,不只看“应用程序错误”

按 Win + R,输入 eventvwr.msc,按出问题的时间筛选应用程序事件。事件 ID 1000 常见于应用程序崩溃,1001 可能包含 Windows 错误报告信息;它们是线索,不是原因结论。记录“故障应用程序名称”“故障模块名称”和“异常代码”,再与客户端日志对照。

Linux 与 Android:保留可复现的输出

Linux 可从终端运行客户端的实际可执行文件;如果使用用户级 systemd 服务,可先查看最近十分钟日志。下面的 Android 命令需要已安装 ADB、开启 USB 调试并授权电脑,建议复现后立即执行:

# Linux:查看用户级会话日志
journalctl --user --since "10 minutes ago" --no-pager

# Android:导出崩溃缓冲区到电脑当前目录
adb logcat -b crash -d > clash-crash.txt

分享日志前,遮掉订阅地址中的令牌、节点密码、UUID、控制接口密钥和不想公开的访问域名。仅贴出报错前后约 30 行,通常比上传整个配置目录更容易定位,也更少暴露信息。

原因一:YAML 语法错误或配置与内核不兼容

如果问题从编辑配置、更新订阅或更换内核后开始,先找 yaml:、unmarshal、proxy group、not found 一类信息。YAML 使用空格缩进,不能用 Tab 代替;冒号后遗漏空格、列表缩进错位,都会让解析失败。

  • 语法错误:日志出现 line 18 时,检查第 18 行以及它前面的几行。报错位置可能只是解析器终于无法继续的位置。
  • 引用错误:代理组引用了不存在的节点名,或规则引用了未定义的代理组、规则集合,属于配置语义问题,单纯调整缩进不能修复。
  • 内核不匹配:Clash、Clash Premium 与 Clash Meta(现称 mihomo)的功能范围不同。某个协议或配置字段是否可用,要看实际启动的内核及其版本,而不只看界面品牌。
  • 下载内容不对:订阅地址过期后可能返回登录页面或错误文本。检查文件开头是否变成 HTML,不要把服务端错误页继续当作 YAML 导入。

使用同一个内核做配置测试

先复制待检查配置,避免直接修改订阅生成的文件。对使用 mihomo 的客户端,可调用其实际内核执行测试;如果配置引用了相对路径文件,还应指定原工作目录。以下为 Windows PowerShell 示例,须先进入实际内核所在目录,并准备对应文件:

.\mihomo.exe -v
.\mihomo.exe -t -d "C:\Clash-Debug" -f "C:\Clash-Debug\config.yaml"

-v 用于确认版本,-t 用于检查配置。将配置及其需要的本地规则文件放进测试目录后再运行;资源缺失或远程下载失败,也可能令测试失败。不要把一切失败都归结为 YAML 缩进。测试通过只说明该次检查通过,并不保证 TUN 权限、端口绑定和网络访问都正常。

原因二:7890 或控制接口端口已被占用

日志出现 bind: address already in use,或 Windows 提示“通常每个套接字地址只允许使用一次”时,检查监听端口。混合端口常见为 7890,控制接口常见为 9090,但两者都能修改,应以当前配置为准。端口冲突通常导致内核启动失败,不一定让整个图形界面退出。

# Windows PowerShell:按实际端口筛选监听项
Get-NetTCPConnection -State Listen -LocalPort 7890,9090 |
  Select-Object LocalAddress,LocalPort,OwningProcess

# macOS:查看 7890 的 TCP 监听进程
lsof -nP -iTCP:7890 -sTCP:LISTEN

# Linux:列出 TCP 监听端口及进程
ss -ltnp

Windows 可用 Get-Process -Id 进程编号 查询上一步显示的 PID。常见占用者是另一个代理客户端、旧内核进程或仍在运行的服务。先确认进程身份,再通过对应程序正常退出;不要看到端口被占就直接强制结束系统进程。

  1. 退出其他代理客户端及不再需要的后台服务,重新启动一次。
  2. 如果两个程序确实需要同时运行,把其中一个混合端口改为未被占用的端口,例如 7897,然后重新确认监听状态。
  3. 同步修改手动填写代理的浏览器、终端和局域网设备。只改内核端口、不改应用代理地址,会出现“客户端启动了,但应用断网”。

permission denied 或“以一种访问权限不允许的方式做了一个访问套接字的尝试”不等同于端口已占用。它也可能涉及系统保留端口、安全策略或绑定权限,应继续查看完整错误。

原因三:内核文件缺失、架构不对或安装不完整

若出现 no such file or directory、failed to spawn、exec format error,先检查程序是否完整安装。部分发行方式把界面与内核分开放置,只复制一个主程序,可能遗漏随包提供的资源和辅助程序。

  • 核对架构:Windows 在“设置”→“系统”→“系统信息”查看系统类型;macOS 在“关于本机”查看芯片;Linux 执行 uname -m。x86_64 与 aarch64 对应的构建不同,不能随意互换。
  • 检查安装方式:压缩包先完整解压到固定目录,再启动。macOS 将应用复制到“应用程序”后运行,不要长期从磁盘映像里启动。
  • 检查安全软件记录:Windows 打开“Windows 安全中心”→“病毒和威胁防护”→“保护历史记录”。先核对文件来源与检测详情,不要为了启动程序直接关闭整套防护。
  • 重新安装程序文件:从项目正式发布渠道取得与系统匹配的安装包。先保留用户数据,不要把“重装程序”和“删除配置”混成一步。

Linux 报“文件不存在”时,即使目标文件确实存在,也可能是动态加载器或依赖库缺失。对可信来源的二进制可使用 file 查看架构,再结合终端的依赖报错处理。不要仅凭文件大小正常就断定程序完整可运行。

原因四与五:TUN 权限、服务异常和运行库缺失

只在启用 TUN 后退出,先回到普通代理测试

TUN 需要创建虚拟网卡、设置路由,部分配置还会接管 DNS,这些操作通常依赖更高权限。若关闭 TUN 后能正常启动,应先检查客户端的“服务模式”或特权辅助程序,而不是反复更换订阅。

  1. 退出其他正在接管网络的 VPN 或代理工具,保留一个客户端测试。
  2. 如果界面可打开,关闭 TUN 后重新启动,确认普通代理是否可用。
  3. 通过当前客户端提供的安装或修复入口处理服务,核对服务是否与当前安装目录对应。移动便携版目录后,旧服务可能仍指向原路径。
  4. macOS 检查特权辅助程序授权;Linux 检查服务日志中的权限错误。不要把整个配置目录改成任何人可写,也不要长期以 root 运行图形界面来掩盖问题。

Android 的 VPN 授权被拒绝、或另一个应用占用 VPN 连接时,通常表现为连接失败,而不是应用进程崩溃。只有系统崩溃记录明确指向应用异常时,才继续按闪退排查。

窗口白屏或一闪而过,检查界面运行环境

不同界面技术依赖不同。使用 Tauri 的 Windows 客户端通常依赖 Microsoft Edge WebView2;基于 Electron 的客户端通常随包携带自己的 Chromium 环境,不能把所有白屏都归因于 WebView2。根据该客户端发布说明检查运行要求,再安装或修复微软提供的对应组件。

遇到 VCRUNTIME140.dll 或 MSVCP140.dll 缺失提示,按软件要求安装 Microsoft Visual C++ Redistributable,并匹配程序架构。不要从 DLL 下载站单独补文件。Linux 如果报告缺少共享库,按发行版和项目依赖说明安装对应软件包;同样不要复制来源不明的库到系统目录。

安全重置配置:改名隔离,比直接删除更稳妥

配置检查没有结论,或者客户端升级后读取旧界面状态就崩溃,可以用全新用户数据验证。但这一步可能影响订阅、规则覆写、代理组选择、快捷键、服务和 TUN 设置,因此应放在日志检查之后。

  1. 先导出或复制。保存订阅来源、本地配置、规则覆写、脚本及客户端设置。备份包含凭据,应放在受控位置。
  2. 彻底退出。关闭托盘进程,并确认相关内核已停止;需要处理服务时,使用客户端提供的服务管理入口。
  3. 隔离实际用户数据目录。确认是当前客户端正在使用的目录后,将其改名,例如追加 .backup-20261021。不要改名整个 AppData 或 .config。
  4. 以默认状态启动。如果能够打开,先不启用 TUN,仅导入一份确认可用的配置,验证启动与退出。
  5. 逐项恢复。依次恢复订阅、规则覆写、界面设置和 TUN,每恢复一项重启一次。不要把旧目录全部复制回去,否则可能连故障一起恢复。

全新数据仍然崩溃,说明排查重点应转向程序构建、运行环境或系统兼容性。此时重复重置配置通常没有帮助;可以保留备份,按项目发行说明测试另一个兼容版本,并避免让旧版本直接写入新版本的数据目录。

提交问题前的复查清单

求助时,把“打不开”改成能够复现的步骤。下面这些信息足以让维护者先判断属于界面、内核还是系统环境问题,也能减少来回追问。

  • 客户端名称与完整版本、内核名称与版本、系统版本与 CPU 架构。
  • 安装包类型、安装目录是否移动过,以及是否从旧版升级。
  • 复现步骤,例如“启动后 2 秒退出”或“开启 TUN 后立即退出”,不要把观察到的现象写成未经确认的原因。
  • 故障时间、相关日志、系统崩溃模块,以及配置测试的完整错误。
  • 关闭 TUN、停止其他客户端、使用全新数据目录之后,结果分别如何。

修复后再做一次闭环检查:主界面能够重复打开;代理内核持续运行;本地端口确实处于监听状态;手动设置代理的应用使用了正确端口;正常退出后系统代理不会残留。若此前启用了 TUN,再单独验证其启动和关闭。这样才能区分“窗口终于出现”与“代理链路恢复正常”。