跳转到内容

排障

mtty 默认在启动时及每 30 秒记录一次进程资源,采样在后台线程执行。 启动前设置 MTTY_MONITOR=0 可关闭。需要运行包含此功能的新版本; 已经运行的旧版本不会自动获得记录功能。

平台 记录目录
macOS ~/Library/Logs/mtty/monitor/
Linux $XDG_STATE_HOME/mtty/monitor/,或 ~/.local/state/mtty/monitor/
Windows %LOCALAPPDATA%\\mtty\\logs\\monitor\\

每次运行生成 process-<timestamp>-<pid>.jsonl。记录包括版本、平台、运行时间、 RSS 字节数、累计进程 CPU 微秒数、区间 CPU 百分比(100% 表示一个逻辑核心), 以及累计渲染调用次数和渲染墙钟耗时。渲染统计覆盖主窗口和画中画,包括提前返回 的调用,不代表 GPU 执行耗时。macOS/Linux 支持线程数,Linux 支持文件描述符数; 不支持或读取失败的指标记录为 null,而非零。统计只覆盖 mtty 本体, 不包含 PTY 后台、shell 或 agent 子进程。RSS 与 macOS 活动监视器的内存 footprint 不是同一口径。

比较相邻记录:CPU 时间增长但渲染计数不变,提示非渲染工作; 空闲时渲染计数持续增加,提示不必要的刷新。应观察多轮相近任务及空闲期的内存 趋势,不要仅凭一个高数值判断泄漏。

单文件超过 4 MiB 前轮转,保留一份 .previous.jsonl 备份。保留最近 16 个已退出 进程的日志及其备份,同时受 资源日志目录总量 64 MiB 的限制。启动时清理多余 历史记录,每次写入也会按需清理旧备份或已退出进程日志。活跃进程的主日志保留; 如果它们占满预算,则丢弃新采样,不继续增加磁盘占用。跨进程写入锁避免多个实例 同时通过预算检查。采样或写入失败不会终止应用。 同级 panic.log 限制为 单文件 1 MiB 加一份备份,总计 2 MiB, 启动时也会清理超限的旧版崩溃日志。日志不包含终端内容、命令参数或工作目录。Rust panic 记录位于 同级 panic.log,资源日志可用于查看崩溃前的采样。

构建失败,或首次构建要好几分钟

Section titled “构建失败,或首次构建要好几分钟”
要求 说明
Rust stable 工具链,锁定于 rust-toolchain.toml;MSRV 1.80
GPU 支持 Metal(macOS)、Vulkan(Linux)或 DX12(Windows)的驱动
Linux 常见的 winit/wgpu 系统库(X11 或 Wayland 开发包)

首次构建会编译 wgpu 与 glyphon,可能需要几分钟;之后的构建是增量的。

macOS 提示应用来自未识别的开发者

Section titled “macOS 提示应用来自未识别的开发者”

scripts/package-macos.sh 产出的是 ad-hoc 签名的 bundle。只有在发布流程里配置了可选的签名 密钥,发布包才带 Developer ID 签名与公证;Windows MSI 签名同理。在此之前,macOS 会在首次打开时 要求确认,标准路径是「系统设置 → 隐私与安全性 → 仍要打开」。

可以确认当前用的是哪个构建:

终端窗口
mtty --version # 输出 "mtty <版本号> (native)"

配置就是一个文件:

平台 路径
Linux / macOS ~/.config/mtty/config.toml,或 $XDG_CONFIG_HOME/mtty/config.toml
Windows %APPDATA%\mtty\config.toml

两个常见的坑:

  • Git Bash 下的 Windows。 若 Git Bash 设置的 HOME 下已存在 ~/.config/mtty,会继续使用它, 而不是 %APPDATA%。
  • 从 miaotty 升级过来。 首次启动时,若 $XDG_CONFIG_HOME/mtty 不存在,会把 $XDG_CONFIG_HOME/miaotty 复制过去。旧目录会保留,所以改它不会生效 —— 请把改动挪到新路径。

如果完全不存在 mtty 配置,会自动导入 ghostty 的 config 与 alacritty 的 alacritty.toml, 所以某项设置也可能是从那里来的。见配置。

那是 shell shim 的职责。shim 先加载你自己的启动文件,且绝不修改它们:

Shell shim 的加载方式
zsh 一个 ZDOTDIR,其 .zshenv 会恢复真实的 ZDOTDIR
bash --rcfile,先 source ~/.bashrc;bash 4.4+ 用 PS0,更老的 bash(macOS 3.2)用 DEBUG trap
fish 经 XDG_DATA_DIRS 找到的 vendor_conf.d 脚本
PowerShell 在 profile 之后用 -NoExit -Command 加载;PSReadLine 历史需 PowerShell 7

如果某个启动文件在 shim 运行之后重置 ZDOTDIR、XDG_DATA_DIRS 或 PS0,上报就会失效。这些 shim 都在真实 PTY 中做过端到端测试(Linux 上的 zsh、bash 3.2/5.x、fish 3.7、PowerShell 7.5; Windows 上的 PowerShell 由 CI 运行)。

恢复会话后,之前运行的东西没回来

Section titled “恢复会话后,之前运行的东西没回来”

更新、重启 mtty(保留运行中的程序) 和崩溃都不会结束正在运行的程序:每个 shell 运行在 PTY 宿主中(pty-host,默认开启),重启后的 mtty 会重新接上。普通退出会结束它们,除非设置:

keep-sessions-on-quit = true

pty-host = false 时打开的 pane,以及 SSH、串口、Telnet、TCP 标签,会重新开始:布局和内容会恢复,进程不会。

检查项 说明
socket $XDG_RUNTIME_DIR/mtty.sock(回退到 $TMPDIR);用 --socket PATH 或设置 MTTY_SOCKET 覆盖
更早的客户端 miaotty.sock 链接到 mtty.sock;mtty-cli 也会回退到更早宿主的 socket 或管道
远程 TCP 未设 MTTY_MTP_TOKEN 时 remote-listen 拒绝启动;设了之后每个请求都必须携带令牌
能力 MTTY_MTP_ALLOW 会以 forbidden 拒绝白名单之外的请求

mtty-cli ping 会在 allowed 里报告宿主实际允许的能力。见控制面。

这是有意的:第二次启动会经已有的控制 socket 转发给正在运行的实例,而不是再起一个进程。要再开一个 终端,请用 ⌘⇧T / Ctrl+Shift+Alt+T(快速终端)或新建标签。

项目 行为
URL scheme macOS 与 Linux 注册 mtty://、ssh:// 与 x-man-page://;Windows MSI 只注册 mtty://
mtty:// 与 miaotty:// 两者都会打开 mtty
agent 钩子 已安装的钩子脚本与 miao 的集成读取 MIAOTTY_PANE_ID / MIAOTTY_CLI,这些变量仍然导出,因此它们会继续上报状态;新安装的钩子使用 MTTY_* 名字
macOS 通知 更名改变了 bundle ID,macOS 会重新询问通知权限

完整对照见应用身份与迁移。

编辑器没有补全、诊断或悬停提示

Section titled “编辑器没有补全、诊断或悬停提示”

编辑器窗格会为登录 shell 的 PATH 上存在的 rust-analyzer、 typescript-language-server、pyright-langserver、gopls 或 clangd 启动语言服务器。检查两点:

  • 语言服务器未安装,或不在登录 shell 的 PATH 上 —— 应用不会读取某个 shell 的交互式别名。
  • 文件超过 2 MB,不启动语言服务器。

显式设置 [lsp] enabled = false 会全部关闭。见配置。

其余文档在仓库里:安装、视图规则,以及带注释的 config.example.toml。其他问题请在 oxdingzg/mtty 开 issue,或写信到 contact@mtty.dev。


Synced from oxdingzg/mtty@b65a3d1.