鸿蒙开发环境Unix调试失败?90%卡在这3个隐蔽配置
|
接口超时告警那一刻,我正蹲在茶水间扒拉微波炉里那盒冷透的咖喱饭——叮一声响,手机就炸了,三个群同时@我,其中俩是前端,一个是测试老张,头像还挂着“正在输入…”卡了三分钟才发出来:“鸿蒙调试器连不上Unix主机,adb shell全挂。” 我扒拉两口饭,米粒粘在叉子上掉不下去,就那么悬着。工位隔断上贴的便签卷了边,写着“dev-env-checklist v2”,但“v2”底下又被油笔狠狠划掉,改成“???”。咖啡机坏了,今天第三回,水槽底下积水漫到拖鞋边沿,运维小王蹲那儿拧螺丝,袖口全是油渍,听见我过来,头也不抬:“别问,等它自己好。” 去年五月,整个月都在跟这事儿耗。不是编译不过,不是SDK版本对不上——那些早被钉死了。是调试器起得来,但一attach进程,日志刷得太快看不清,啪啪啪滚屏,根本抓不住那一行“connect refused”在哪闪过去。我原以为是端口冲突,结果查了一天,端口通着,netstat看着活蹦乱跳,就是连不上。后来发现,鸿蒙的hdc-server根本没读/etc/hosts里那条本地映射,它认的是~/.hdc/config,而那文件默认空着,连注释都没有。谁写的?不记得。反正没人动过。 监控大盘上那条绿色的线一直在抖。不是崩,不是红,就是抖,像心电图快停没停。产品李雯站我背后看了三分钟,突然说:“要不先切安卓测?”我没理她。她走了,留了半杯凉掉的美式在桌面,杯底压着张A4纸,上面画了七个框,写满“鸿蒙兼容性待确认”,第七个框旁边潦草补了句“or我们真不搞了?” 第二个坑是那个debug.keystore的权限。Unix环境下,hdc要求私钥文件owner必须是当前用户,且不能有group-writable位——可你用mkcert或keytool生成的,默认都是644,或者更糟,600但owner是root。你chown一遍,刚跑通,CI机器又给你打回原形,因为jenkins agent用的是另一个UID。谁在工位上打电话谈房租?隔壁组老陈,声音大,反复说“押金不退就算了,但热水器修钱我真掏不起”。我听着,顺手chmod 600 ./debug.keystore,又加了-rw------- -f ~/.hdc/cache/,结果下一轮构建还是fail——原来cache目录下自动生成了个临时socket,mode是666,鸿蒙直接拒连。 第三个最绝:鸿蒙调试协议依赖系统级timeval结构体的纳秒精度校准。Unix环境(特别是CentOS7这种)默认关闭CONFIG_HIGH_RES_TIMERS,或者启用了tsc_deadline_timer这种老旧计时器。hdc-server启动时根本不出错,就是握手阶段僵住,等三秒,断。我们查了三天,最后靠gdb attach进去,在syscall writev之后、recvfrom之前,堆栈里看见一行“clock_gettime(CLOCK_MONOTONIC_RAW, …) → EINVAL”。我原以为是kernel patch问题,结果发现只要echo 1 > /proc/sys/kernel/timer_migration,它就能活三分钟——够调完一次session。三分钟之后,又死。 外卖筷子掉在地上,掰成两截,我捡起来擦擦接着用。这事儿没法上线前测,因为模拟器里不触发;也没法灰度,因为hdc是本地CLI工具,根本不走网关。只能让开发机一个个手动改配置。小刘试了七遍,最后一次成功时,他把键盘推到桌沿外十厘米,手指还悬在F5上没松开。 优胜劣汰不是说跑得快的赢,是扛得住配置污染的活下来。鸿蒙团队删掉了所有关于Unix调试的文档章节,不是忘了,是筛过三轮之后,留下的人,手里那台Ubuntu22.04+kernel5.15的机器,刚好撞对这三条配置。剩下的人?要么换Windows子系统,要么切回安卓。没有中间态。 说到Windows子系统——前天王磊问我,WSL2里能不能用hdc。我说能,但你得关掉WLS2的systemd,否则hdc-server会和dbus-daemon抢9009端口。他哦了一声,转身去翻微软文档。其实我没说实话,WSL2下hdc偶尔会丢第一个包,需要手动重连两次。这事我没报bug,因为上周五测试部提了同样问题,Jira编号HDC-1782,状态是“Won’t Fix(by design)”。他们写了四个字:“Unix非一级支持平台”。 我电脑机箱嗡嗡响,风扇声比平时高半档。可能是显卡温度上去了,也可能只是灰尘太多。去年五月那会儿,我还觉得这是配置问题;现在觉得,这是选型问题——当一个开发环境把调试路径当成可裁剪模块时,它本质上已经不认为你是“开发者”,而是“适配者”。你在替它验证边缘case,而不是让它服务你。 我自己不敢动的那块,是hdc源码里的socket_timeout.c。他们用setsockopt(SO_RCVTIMEO)硬编码了3000ms,但Unix网络栈实际响应延迟浮动极大,特别是在kdump启用的机器上。我想改,但build链路闭源,连clang-tidy都没法跑。所以现在我的做法是——每次调试前,在终端里敲:sleep 0.1; hdc t -r -p $PORT。多等100毫秒,成功率从72%跳到94%。我自己试的,没统计,大概那个量级。
文章配图,仅供参考 老张刚才又进来了,手里捏着打印纸,边角都毛了:“你说的那三个配置……第三个,是不是得改grub参数?我服务器没root权限。”我点头,他叹了口气,没再问。门外李雯还在跟设计讨论按钮圆角是8px还是12px。谁管你底层timeval怎么校准。下一步?我下午准备给新来的实习生讲这个。不教他改配置,教他怎么看hdc log最后一行——如果出现“[TRACE] recv timeout: -1”,那就直接关机,回家。明天再来。真不行,就换台机器。这不是玄学,是优胜劣汰的最后一道筛子。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


Unix调试总卡壳?5个隐性陷阱你中招没
