鸿蒙开发环境Unix调试失败?90%卡在这3个隐蔽配置
|
上周四下午三点零七分,我盯着屏幕右下角那个跳动的十六进制进程ID——它卡在0x7f0000000000不动了,而devtools窗口里只剩个灰掉的“Resuming…”。旁边显示器上还贴着上周三校样的打印纸,边角卷起来了,墨迹有点晕,写着“HarmonyOS SDK 4.1.0.32-DEBUG-ARM64”,底下用红笔划了两道:“libhdc.so路径没走symlink链”。这纸我拿下来过三次,又粘回去两次。 你信不信?90%不是统计数字,是工位巡检时瞟见的——前天路过A组工位,三个屏,两个黑着,一个挂着gdb --tui连着hdc shell,调试器停在asm_view,光标在mov x0, #0x1那行闪。旁边人叼着半截没点的烟,左手在键盘上悬着,右手正捏着手机回微信:“改完SDK_ROOT再试试?”他根本没碰过~/.hdc/config.json里那行disable_pty:true。不是不知道,是压根没往那儿想。这个我敢打包票。 第一个坑:SSH隧道不传pty,但hdc debug非得它活着。你ssh -o RequestTTY=yes连过去,看着终端亮了,就以为成了;结果hdc debug -t usb://xxx启动后,底层那个libusbdm会默默把/dev/pts/4挂成no-tty mode,再塞进ptrace上下文——它不报错,只吐个[WARN] hdc::debug::session: fallback to stdio pipe,然后静音。我原以为这是兼容模式提示,结果扒源码发现它是fallback到纯pipe后,断点信号直接被内核丢给父进程了。那天晚上十一点二十三分,老张蹲在机房门口啃冷掉的黄焖鸡外卖,汤都结膜了,一边用adb shell ps | grep hdc一边念叨:“明明端口通啊……” 第二个坑更邪门:不是hdc不认你机器,是你自己Linux发行版的/lib64/ld-linux-aarch64.so.1版本太新。鸿蒙3.1 SDK里那堆prebuilt .so是绑死2.28的,你装了个glibc 2.35的统信UOS或者麒麟V10SP1,ldd看全绿,run起来也跑得欢,可一进debug session——符号表读一半,libhdc_debugger_core.so就return EILSEQ。审稿间的灯那天特别晃眼,白光带蓝调,照得我手写的复现步骤本子上字发虚。我抄了三遍LD_PRELOAD=/usr/lib64/ld-2.28.so hdc debug,才想起还得加--in-process-pipe,否则hdc_host进程根本不加载preload段。 第三个,真他妈绝。不是证书,不是USB权限,是你的XDG_RUNTIME_DIR目录名里带中文空格。我们有个兄弟,用户名是“王建国-测试”,XDG_RUNTIME_DIR自动设成/run/user/1001/systemd-private-xxx-gnome-session-王建国-测试@.service-xxxxx.tmp,中间那个“@”后面跟了一串随机符,但目录名末尾的“测试”俩字,让hdc_server_init里的path_is_valid_utf8()函数返了个false——注意,它不abort,它只是跳过初始化debug channel。后台日志里一行都没写,但Wireshark抓包发现所有hdc debug handshake包,server端全当垃圾包drop。领导那天发来六十秒语音,开头三秒是叹气,中间十七秒讲季度交付节奏,结尾说“你们先跑通,不急”,说完就挂了。我听了四遍,愣是没听清他第三句说的到底是不是“先跑通”。 这仨坑合起来,不是bug,是筛选机制。优胜劣汰——真话难听。你得愿意蹲在hdc log level=5的日志堆里翻七百页文本;得在strace -e trace=openat,socket,connect hdc debug里突然意识到openat最后那个AT_FDCWD不是路径错了,是fd被前面的ioctl偷偷关了;还得有耐心等docker exec -it hdc_host bash进去,手动chmod 777 /dev/pts/再试。不是技术不行,是这套工具链压根没把Unix老炮当用户预设——它默认你是鸿蒙原生团队的C++开发,顺手敲make clean && make install就完事。 B组李娜昨天拉了个issue,标题叫《hdc debug should fail fast on XDG_RUNTIME_DIR invalid chars》,被打回三次。第三次她改成了《hdc_server_init: add path validation failure panic with errno in log》,还是被驳回。理由是“影响发布节奏”。我今天早上重装了一遍Ubuntu 22.04,用的镜像来自内部CDN,sha256校验过了,结果刚解压SDK,/tmp/harmonyos-sdk/.ohpm/cache/_tmp里面自动生成的package-lock.json里有一行"resolved": "https://repo.huawei.com/artifactory/npm-harmonyos/xxx.tgz"——这地址里有个冒号后多打了空格,npm install直接跪。我删了重解压两次,第三次才留意到是压缩包里自带的坏数据。
文章配图,仅供参考 所以我说90%,不是说剩下10%能绕开。是剩下的10%里,有7%靠降级glibc硬扛,2%靠在VM里套一层旧系统,还有1%——比如我们隔壁做嵌入式安全的孙工——直接改了hdc源码,在init_pthread_debug()里加了setenv("HDC_DEBUG_FORCE_PTY", "1", 1),编译出来扔进/usr/local/bin覆盖掉官方hdc。他没提PR,说“懒得填CLAtest”,就放网盘链接群里了。我下完试了五分钟,成功命中断点。但我没用他的二进制,我自己重新打了一遍patch。这个我说不准是不是更稳。现在我把hdc调试流程写进了团队共享笔记第十七页,标题栏写着:“以下操作仅对已确认host为aarch64-linux-gnu且未启用systemd-resolved的环境有效”。下一行空白处,我留了半句没写完:“如果……”后面删掉了“你看到的是‘Failed to open debug port’而不是‘Connection refused’,建议检查……”——算了,写了也没人看。我点了杯冰美式,第二口已经化水了。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

