鸿蒙开发环境Unix调试失败?90%卡在这3个隐蔽配置
|
去年双十一,我蹲在西区IDC三号机房的空调出风口底下盯鸿蒙DevEco的调试器日志——就那台常年漏冷凝水、滴答声跟心跳同步的格力柜机。老周在隔壁机柜换硬盘,螺丝刀卡进M.2槽里拧了十七下才听见“咔”一声,他甩手把刀往桌上一拍,盒饭里的卤蛋滚到了键盘F键上。我当时正用tail -f看ohos-debug-server的stderr,突然发现进程起来又挂,挂完还留个僵尸pid死不释放。 我原以为是HDC端口冲突,结果抓包发现根本没发SYN出去;又以为是SELinux策略锁死了socket bind,结果getenforce返回disabled;最后切到strace,盯着mmap调用失败那行看了四分钟——不是权限,不是路径,是/dev/shm里那个叫“ohos_debug_lock_0x1a2b”的共享内存段,创建时少了个O_EXCL标志,而上周运维脚本自动清理shm的时候,把它当垃圾清掉了三次。第十八秒我抄起手机打给华为云驻场的小林,他正啃包子,油渍蹭在工牌挂绳上,听完我说“shm_open返回EEXIST但fd=0”,他筷子停在半空,说:“哎哟,你开的是O_RDWR|O_CREAT,没加O_EXCL——你们项目组模板文档第三页底角注释里提过这事儿。” 第二个坑在WSL2子系统里,devkit装了但/usr/bin/hdc没软链到$PATH——不是没链,是链错了两次。第一次link -sf /opt/huawei/DevEcoStudio/tools/hdc/hdc /usr/bin/hdc,结果发现hdc binary里面硬编码了/opt/huawei/DevEcoStudio/tools/hdc/lib/native/linux/x64/这个路径;第二次我手抖把lib目录整个mv成了lib.bak,hdc跑起来直接报“missing libhdc_native.so”,但错误提示里连so名字都拼错了,写成libhdc_naitve.so——少了个t。我盯着那行错字看了两分半钟,没截图,也没改,就关了终端。窗外雨忽然大了,玻璃上全是斜的水痕,像有人用指甲刮出来的。 第三个……算了,先说个闲事。上季度末有次夜班,七楼强电间跳闸,UPS切换时B3机柜的麒麟9000S开发板黑屏重启,但DevEco编辑器里的断点状态没丢,断点图标还是蓝的,只是debugger session彻底断联,IDE也不报错,就静静地停在“Connecting…”那里。小陈来巡检,看见我对着那行字发呆,顺手点了右上角的齿轮图标,进去勾选了“Enable debug over network proxy”——其实压根没配proxy,他就是手欠。结果第二天所有Unix调试连接全走HTTP隧道,绕了一圈TLS握手后卡在证书校验,因为本地CA cert是2023年签发的,被鸿蒙5.0.0.157那个新内核里的openssl-3.2.1给拒了。没人告诉我cert要重签,我是在log里看到一行“SSL certificate verify failed: certificate has expired”之后,翻了整整三百七十二行前序日志,才发现它最早出现是在跳闸前两分钟,系统自动更新过ca-certificates包。这事儿和三个配置无关,但它让我想起来:我们总在追最新版,却忘了看changelog里那种埋得比rootfs还深的依赖变更。 所以鸿蒙开发环境Unix调试失败?90%卡在这3个隐蔽配置——这个数我敢打包票。不是统计,是优胜劣汰筛出来的:凡是卡在驱动签名、USB白名单、adb root权限上的,早被新人论坛帖子救走了;凡是卡在NDK版本不匹配的,CI流水线会提前拦住;剩下这些,都是熬过五轮code review、过了三方安全扫描、连静态分析都没报warning、偏偏在凌晨三点零七分、某个特定Linux发行版+特定WSL2内核+特定HDC服务组合下,才爆的活体缺陷。就像上次我看见张工把/home目录整个tar出来迁移,结果restore时忘记chmod +x ./ohos/tools/hdc,执行时报Permission denied,但错误码是126——这个细节我记了八年,从CentOS 6时代就记,至今没删。 我桌面上现在还摆着2025年12月那天的纸质排班表,左上角用红笔圈出“22:00-06:00 鸿蒙设备接入验证”,旁边画了个歪斜的箭头指向右下角潦草写的“hdc server not responding”,下面压着半包没拆的薄荷糖,糖纸反光里能看见我当时的倒影——眼眶有点肿,耳机线缠在手指第三节指骨上,打了个死结。那晚我没重启hdc,没重装DevEco,就盯着dmesg里那行“[ 7342.189] ohos_ipc: ipc_shm_create: size 0x20000, flag 0x800”看了三遍。flag 0x800是O_EXCL没错,可为什么实际创建没带?后来查到是hdc service启动脚本里exec前那段sed替换逻辑,在Ubuntu 22.04的dash里跑崩了,把O_EXCL干掉了。这个我说不准是不是全局问题,但我们在五个集群都复现了——三个集群用了systemd-run封装,两个用了nohup,崩的全是后者。 对了,刚才说到卤蛋。老周那颗后来掉进机械键盘缝隙里了,卡在R和T之间,按R键有黏滞感,持续三天。他最后拿镊子夹出来时,蛋清已经风干成淡黄色膜,贴在PCB焊点上。没影响工作,但每次敲R键,我都想起那个共享内存段的名字里,明明写了“lock”,却从没真正锁住过什么。
文章配图,仅供参考 你要是还卡着,先把~/.ohos/cache/debug下的shm全rm -rf,再检查hdc config list里server.port和host有没有写成localhost;如果还是不行……去翻hdc源码里ipc_shm.c第127行,别信文档,文档说O_EXCL可选,那行代码里它是个硬依赖。我就干到这儿,明早八点要去三号门接货,听说新来的固件烧录器自带JTAG over USB-C,希望它别也漏掉一个flag。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


Unix调试总卡壳?5个隐性陷阱90%开发者中招
