你点按 Connect,配置转了一秒,客户端却报告连接已断开。支持人员索要日志,你附上一张截图,线程却停了两天,因为没人说得清握手究竟在哪一步放弃。围绕一次尝试构建报告,配上狭窄的时间窗口和最后完成的阶段,工单就能一轮推进。反过来,送上整整一天的手机日志,通常只会让对方多出更多可查之处。

同一网关上的两台手机也可能表现不同,因为协议、证书存储、认证方式或流量策略未必一致。在我的手机上能用只是比较的起点,并不能证明 Android 出故障。

记录一次尝试,而不是一整天的历史

在复现之前先写下环境:Android 版本、厂商与型号、客户端名称与版本、所选配置、当前连接的网络,以及带时区的时钟时间。我也会记录省电模式或流量节省程序是否开启,因为两者都会改变屏幕熄灭后客户端能做什么。

然后判断你实际面对的是五种结果中的哪一种。同意或权限弹窗始终无法完成、端点根本不可达、认证被拒绝、登录成功后接口配置失败,或者隧道已经建立但某个特定资源始终访问不到。每一种的责任方和修法都不同,把它们混在一个包里,只会换来一句请重试。真正把一小时工单拖成一周往来的,正是在这些情况之间靠猜。

状态切换同样重要。如果故障只在锁屏之后或从 Wi-Fi 切到移动数据之后出现,请把它写在工单第一行,并注明发生的分钟。

先导出客户端自身的日志

第一份附件应当来自应用本身,而不是操作系统。多数客户端在设置里提供诊断日志或连接日志导出,有时要长按版本号才会出现,而这份输出已经理解自己的状态机。直接使用它即可,不要把关键几行重新敲进工单正文。

附上第一条错误及其紧邻的事件,而不是孤零零的最后一行断开记录。干净的结尾通常意味着真正的故障发生得更早:证书链无法验证、名称被解析到意想不到的地方,或者接口从未配置。

只为你说得清的问题添加 logcat

手机上的终端模拟器并不是系统日志器。Android 把各个缓冲区记录成各自独立的环形流,只有具备特权的进程才能完整读取。因此普通应用只能看到自己的输出加上有限的一段,而 logcat 是空的那句话,几乎证明不了平台到底记录了什么。

受支持的做法是在你掌控的电脑上建立已授权的 ADB 会话。打开开发者选项与 USB 调试,接上数据线,并在设备上接受 RSA 指纹弹窗;一旦关闭该提示,后续每条命令都会以 unauthorized 失败,抓取根本不会开始。

在投入时间抓取之前,先确认设备确实在线。adb devices 应当打印序列号,随后是 device 一词;任何显示 offline 或 unauthorized 的情况,都要先解决数据线、弹窗或驱动问题。

设备出现在列表后,在点按 Connect 前几秒开始抓取,并在客户端放弃后立刻停止。有意识开始的一次实时抓取,胜过后来的二十分钟才导出的快照,因为环形缓冲区已经轮转,你需要的早期行可能已经消失:

adb logcat -v threadtime -b main,system,crash > attempt.txt

按时间和标签筛选,而不是按 VPN 一词

在抓取里搜索 vpn,是最快丢掉那条解释故障的行的办法。证书验证、进程崩溃和连接变化都记录在从不提及 VPN 的标签下,所以关键字筛选只会留下噪声、扔掉证据。

先收窄时间窗口,再收窄优先级,最后收窄标签。当你只需要某个已知时刻之后的内容时,adb logcat -v threadtime -t '11-03 20:14:00.000' 会从该点回放最近的尾部,而 threadtime 格式能让时间戳与客户端自身的导出相互对照。

如果你知道客户端包名,就跟踪它的进程,而不是猜标签。adb shell pidof com.vendor.client 会返回 PID,adb logcat --pid=1234 -v threadtime 只打印该进程,而 adb logcat -g 显示每个缓冲区在开始覆盖前还有多少空间。

隐去敏感信息,再交付一个连贯的整包

在任何内容离开你的机器之前,先删除密码、令牌、私钥、会话凭据和完整的设备标识。保留错误码、事件顺序和地址关系,这些才让故障可读;越过这条线清理过的抓取,和从未筛选过的一样没用。

然后发送一个整包,而不是几个散落的文件:客户端导出、按起止时间命名的 ADB 窗口、失败阶段的两行摘要,以及本清单开头的环境说明。如果有部分内容不能公开发布,请使用服务商的私密支持渠道,并说明哪个文件需要该渠道。

发送之前,检查四件事。整包覆盖的是一次尝试,而不是一整个下午?客户端与系统的时间戳是否重叠?里面是否还留着令牌、密码或完整的订户标识?先修好最后一点,再把文件附到现有工单上,而不是新开一张,这样接手的人才能保住此前的上下文。

相关文章