尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

OpenHarmony调试三板斧:串口、hilog与hdc实战指南

OpenHarmony调试三板斧:串口、hilog与hdc实战指南 做OpenHarmony硬件开发我最常被问到的一句话是“板子拿到手系统也烧进去了接下来该干嘛”我的回答永远是一样的——先别急着写业务代码把调试三板斧练熟串口、日志、hdc。这三样东西就是你跟开发板之间的“眼睛”和“耳朵”。系统起没起来、内核报了什么错、应用为什么崩溃、网络通不通所有问题的答案都得靠它们挖出来。这篇内容原本是我们“万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程”里硬件调试部分的底稿面向的是刚拿到开发板、准备从零开始啃OpenHarmony的开发者也欢迎那些已经在ARM板子上跑过Linux、想快速上手OpenHarmony的老手。不管你是做智能家居、物联网网关还是想折腾一下x86电脑版OpenHarmony这套调试方法都是通用的。我还会把最近折腾电脑版x86 OpenHarmony时踩过的坑一并整理进来这块环境比ARM开发板更特殊调试思路也有差异值得单独聊聊。1. 内容整体设计与思路拆解1.1 为什么是“三板斧”而不是一套完整方法论“三板斧”这个说法源自程咬金的故事意思是招数不多但招招管用。硬件调试所谓的完整方法论其实可以写一本书JTAG调试、逻辑分析仪、示波器、性能剖析、内存检测、功耗分析……工具链极其庞大。但对绝大多数做OpenHarmony应用开发、系统移植或者设备适配的工程师来说日常高频使用的就是串口终端、日志系统和hdc调试桥这三板斧。这三板斧覆盖了调试最主要的三个场景。第一系统起不来你要看引导日志和内核日志这得靠串口。第二系统起来了但行为不对你要看应用日志和系统服务日志这得靠OpenHarmony的hilog日志系统。第三你想直接操作设备、传文件、查进程、抓trace这得靠hdc。换句话说串口是“生命的体征”日志是“行为的记录”hdc是“医生的双手”。把这三样用好90%以上的问题都能快速定位到模块级别剩下的才是示波器、逻辑分析仪的活儿。设计这套内容时我刻意没有把工具安装和命令参数堆在一起而是按“问题现象 - 需要什么工具 - 怎么操作 - 常见坑”的逻辑展开。这样做的原因很简单调试是一项以问题为导向的工作你只有先知道“要解决什么问题”才会真正理解“为什么要用这个命令”。如果上来就背一串串口参数和hdc命令用不了三天就全忘了。1.2 这套调试方案适用的硬件场景OpenHarmony的硬件形态非常多样。小而全的有Hi3861这样的WiFi IoT模组主流的是DAYU200RK3568、DAYU210这样的开发板还有人在各种派、国产化板卡上移植甚至有人直接在x86的迷你主机上装OpenHarmony。不同硬件调试手段的侧重点略有不同但三板斧的底层逻辑完全一致。对IoT小设备串口几乎是你唯一的调试通道日志系统相对精简hdc通常不可用。对标准开发板串口、hilog、hdc三者缺一不可配合起来效率非常高。对x86电脑版串口不一定方便引出hdc网络调试反而成了主力日志拷出来分析也是常见做法。所以我这篇内容会尽量覆盖这些差异特别是在“板斧二”和“板斧三”里我会特别说明x86环境下的变通方案。你先把ARM开发板上这套逻辑跑通再去看x86环境会发现底层原理全是通的。2. 上手前的关键准备串口线、烧录镜像与基础环境2.1 串口连接三根线里的门道串口是调试的第一板斧但很多人第一关就卡住——插上没输出。这里面的坑远不止“TX接RX”这么简单。首先硬件连接。绝大多数开发板比如DAYU200、DAYU210、各种派类板卡上都有调试串口引脚通常是3.3V TTL电平通过USB转串口模块CP2102、CH340、FT232等连接电脑。接法口诀是板子的TX接模块的RX板子的RX接模块的TX地线必须共地。光说不练容易记混我的习惯是拿万用表量一下电平或者直接看板子丝印确认是3.3V还是1.8V电平。之前有块板子是1.8V电平直接用3.3V的模块去怼结果串口芯片烧了板子直接变砖这个教训非常深刻。注意如果你的开发板丝印上没有明确标注调试串口一定要先查原理图确认引脚定义千万不要拿杜邦线乱插。TTL串口的RX/TX接反不会烧板子但输出乱码电平不匹配则可能烧毁芯片。其次串口工具软件。Windows上我习惯用MobaXterm因为它自带串口会话支持日志高亮、自动滚动比PuTTY好用了不知道多少倍。macOS/Linux下用minicom或者screen都行但我个人更推荐minicom因为它的配置文件管理清晰不容易把参数搞乱。各大平台的工具列表和参数区别我整理了一个表格方便你对照平台推荐工具波特率设置备注WindowsMobaXterm / PuTTY1500000OpenHarmony默认用1500000不是115200这里是个大坑macOSminicom / screen1500000minicom的配置文件路径是/etc/minirc.*注意权限Linuxminicom / picocom1500000如果/dev/ttyUSB0没权限先加用户到dialout组2.2 OpenHarmony镜像烧录搞懂引导链再刷机在开始调试之前你得先把系统跑起来。OpenHarmony的烧录方式和传统嵌入式Linux有一些区别。标准开发板通常通过烧录工具将整个镜像包写入存储介质这些镜像包括引导程序U-Boot或Bootloader、内核Kernel、ramdisk和system镜像等。烧录后开发板的启动顺序是Bootloader - Kernel - init - 系统服务。这块我有一个建议刚开始调试时先不要用自己编译的镜像直接用官方发布的dayu200标准镜像跑通一遍确认“官方固件能启动”之后再折腾自己的代码。这样后续出问题你才能很明确地判断是不是自己改动引入的。x86电脑版OpenHarmony的烧录方式又有点不同。它本质上像装一个常规操作系统一样U盘启动或者直接在硬盘上部署引导用GRUB内核是专门为x86编译的。如果你手头有闲置的迷你主机不妨拿来试试。系统起来之后串口不一定能很方便地看到日志得靠hdc网络调试和系统日志文件来排查这也是我后面要专门聊x86场景的原因。2.3 开发者模式与USB调试hdc的前置条件hdc是OpenHarmony的调试桥工具类似Android的adb。但要让它工作你得先打开设备的开发者模式。在标准开发板上通常需要在“设置 - 关于 - 版本号”里连点多次或者在系统参数里开启开发者选项。在部分开发板上这个选项在出厂固件里默认就是打开的但为了保险还是确认一遍比较好。打开开发者模式后还需要通过USB连接电脑并在设备上授权“允许USB调试”。这一步骤和Android手机非常像。连接成功后电脑终端输入hdc list targets如果能看到设备序列号一串字符说明连接已经建立。这个环节看起来简单但经常出问题我在后面“常见问题速查”里整理了集中症状和对策。3. 板斧一串口终端系统是否活着就看这里3.1 串口输出的阶段拆解从Bootloader到用户态串口终端是OpenHarmony硬件调试的第一个观察窗口。接好线、打开终端按下开发板复位键或重新上电你会看到屏幕上刷出一大堆启动日志。对新手来说这部分日志可能有点吓人但其实内容是有阶段性的搞清楚每个阶段在干什么你就抓住了串口调试的命脉。首先是Bootloader阶段。OpenHarmony在标准ARM开发板上用的是U-Boot它会初始化DDR、加载内核镜像打印的日志通常以U-Boot 2017.09或类似版本号开头。这个阶段如果卡住说明Bootloader配置不对或者镜像有问题。其次是内核阶段这里会打印大量Kernel日志包括CPU信息、内存布局、设备树、驱动初始化等。内核阶段的日志末尾通常会挂载根文件系统然后启动第一个用户态进程。最后是用户态阶段init进程会启动各种系统服务这个阶段串口上可能看不到太多输出因为主要日志开始走hilog了。我在调试一块RK3568开发板时系统一直卡住无法进入用户态串口最后的输出停在内核的某个驱动初始化位置。通过串口日志快速定位到是该驱动的电源域配置有问题而不是去翻几十个系统服务日志效率高了不止一个量级。所以看串口日志时特别注意“停在哪一句”往往就是问题所在。3.2 串口无输出的5个排查点串口无输出是所有调试问题的起点也是最磨人的问题。总结下来99%的情况出在这5个环节。接线错误TX/RX接反、地线没接、杜邦线松动。这个最常见先排除。波特率不对OpenHarmony默认1500000如果工具里配成115200屏幕上就是乱码或者完全没反应。串口被占用电脑上开了多个串口工具或者USB转串口模块被其他程序占用导致终端拿不到数据。串口芯片驱动没装好CP2102、CH340这类芯片在Windows下需要安装驱动设备管理器里看到感叹号就是没装好。板子没上电或复位没按这看着像废话但有时候你线接对了、参数也调好了就是忘了给板子上电。这几个点我建议做成一个检查清单调试之前照着过一遍。实际踩坑经验是新手60%的问题出在第1和第2项老手偶尔也会在第4项上翻车——尤其是换了一台电脑驱动忘了装。3.3 串口日志的保存与分析技巧调试时光在终端上看日志是不行的日志刷新太快你想回翻某一段经常翻不到。正确的姿势是把日志从最开始就保存到文件。MobaXterm下可以设置日志记录Settings - Terminal - Logging把串口会话的所有输出实时写入本地文件。使用minicom时可以用CtrlA然后按L开启日志捕获。这样调试完你就有一份完整的启动日志文件可以用编辑器或日志分析工具慢慢搜关键字比如搜索error、fail、panic等。我当时调试x86版OpenHarmony启动问题时就是靠把串口日志全部存下来然后按时间线逐段排查才定位到某个AHCI驱动在特定主板上初始化超时。另有一个小技巧串口日志内容过长时不要盲目从头看优先看末尾最后50行的报错信息。内核启动日志的特点是关键错误后面往往会跟着调用栈或驱动回滚信息这些信息足以帮你定位到具体的模块。3.4 常见串口调试问题速查根据我自己的经验把串口调试中比较常见的症状和根因做成了一张速查表保存下来能省不少折腾时间。现象可能原因解决方向完全没有字符输出接线错误、串口占用、波特率不对、板子没上电按前面5个点逐项检查输出乱码波特率不匹配确认是1500000还是115200只有第一行输出Bootloader阶段失败检查Bootloader镜像、内存初始化配置内核日志卡在某处对应驱动初始化失败查该驱动的设备树配置与内核选项特定驱动报错但系统继续启动非关键驱动失败记录日志后续通过日志定位4. 板斧二hilog日志别再用printf排查问题4.1 hilog和串口日志的分工逻辑很多从Linux转过来的开发者习惯了用printf往串口打日志。在OpenHarmony上这个习惯得改改。OpenHarmony有一套独立的日志系统叫hilog。它和内核日志是完全不同层面的东西串口/内核日志主要负责启动阶段和内核态的调试而hilog负责用户态系统服务和应用层的日志输出。为什么要单独立一套日志系统因为系统起来之后用户态服务的日志量非常大如果全部往串口上打会严重拖慢系统响应串口本身也会成为瓶颈。hilog会将日志写入内存缓冲区或日志文件开发者可以通过hdc hilog命令按域、按级别、按进程名过滤查看效率极高。从使用感受上说hilog和Android的logcat非常像但也有一些差异。最明显的差异是域domain概念。OpenHarmony的日志会划分不同的域比如系统能力域、应用域、驱动域等。日志格式通常是时间、进程号、线程号、域、日志级别、标签tag、日志内容。看懂了这一行格式你就能快速定位到日志来源是哪个模块。4.2 hilog常用命令实战使用hilog之前先确认你的hdc已经连上了开发板。然后在电脑终端输入hdc hilog即可实时查看设备日志。但直接裸跑hdc hilog日志量很大关键信息会被淹没。我实际使用中最常用的就是组合过滤命令。第一按级别过滤。比如只要错误和致命级别hdc hilog -e只查看错误级别ERROR和致命级别FATALhdc hilog -w只查看警告WARN及以上级别。这个能快速筛掉大量无用的info日志。第二按标签或进程过滤。如果你知道某一个进程的名字例如foundation或com.example.myapp可以用hdc hilog -T [tag]按标签过滤。OpenHarmony的hilog命令和Android的logcat不完全一样我更常用的是先用hdc shell进入设备终端再用hilog -T xx查看某个具体标签的日志这样更直观。第三输出到文件。日志量太大时可以先把日志拉到本地再分析hdc shell hilog -x /data/log/hilog.txt然后通过hdc的file recv命令拉取到电脑。4.3 日志级别与过滤参数的配置心得很多应用开发者会遇到一个问题在DevEco Studio里调试应用时console.log的输出在哪看通过hdc hilog的过滤是能看到这些JS层日志的。但如果你在代码里使用了console.debug默认级别可能不会输出到终端因为hilog默认的显示级别是INFO及以上。这时候你可以用hdc hilog -D调整日志显示级别或者直接在设备上改日志持久化级别配置文件。这里有个关键点hilog的日志级别分为DEBUG、INFO、WARN、ERROR、FATAL五级。默认显示级别通常是INFO所以DEBUG级别的日志不会显示。你在做性能分析和逻辑追踪时想在代码里加console.debug输出结果发现终端里什么都没有不要怀疑是代码没执行先检查是不是日志级别过滤掉了。这个坑我踩过好几次后来干脆统一用console.info以上的级别去打关键日志DEBUG级别只留给临时调试用。4.4 用两个终端配合效率翻倍实际调试过程中我强烈建议开两个终端窗口。一个窗口串口保持连接专门看内核日志和早期启动日志另一个窗口用hdc连着跑hdc hilog查看应用日志和服务日志。两个窗口同时滚动信息互补。我在调试系统服务启动崩溃时就是这样操作的串口窗口看到init进程启动某服务的痕迹hilog窗口同时看到该服务报出的ERROR日志两边时间一对照立刻就能定位到崩溃点是在初始化流程的哪个阶段。如果只依赖其中一个窗口你可能要反复试错好几次才能凑齐完整信息。5. 板斧三hdc调试桥远程指挥开发的“双手”5.1 hdc到底能干什么如果说串口负责“看”那么hdc就是“手”。你可以把它理解为OpenHarmony设备的远程控制通道它可以在电脑上直接操作OpenHarmony设备完成进程管理、文件传输、命令执行、日志查看、应用安装、崩溃抓取等操作。hdc支持USB连接也支持网络连接。USB连接适合ARM开发板网络连接在x86电脑版OpenHarmony上几乎成了标配调试方式。hdc这个工具本体在OpenHarmony的SDK或官方工具目录里Windows、Linux、macOS都有对应版本。配置好环境变量后在终端输入hdc就能看到帮助文档。一个容易忽略的点是hdc版本和设备端系统版本最好保持一致否则可能出现协议不兼容导致无法连接。当年hdc协议有过几次更新老版本的hdc连新系统连不上新版本hdc连老系统也时有异常这个一定要注意。5.2 最常用的hdc命令组合我把自己工作中使用频率最高的hdc命令整理成了一份清单基本覆盖日常调试的各个场景。建议新手先把这些命令敲熟练再慢慢探索其他功能。命令功能使用场景hdc list targets查看已连接的设备确认设备是否连上、有没有驱动问题hdc shell进入设备Shell在设备端直接执行命令hdc shell ps -ef查看设备进程列表确认某个服务进程是否存活hdc file send本地文件发送到设备推送可执行文件或配置文件到设备hdc file recv设备文件拉取到本地拉取日志、崩溃文件、截图文件hdc hilog查看设备日志过滤查看hilog日志hdc install安装HAP应用应用开发调试时安装包hdc uninstall卸载HAP应用卸载应用hdc fport端口转发将设备端口映射到电脑方便网络调试hdc shell reboot重启设备调试后恢复状态或验证重启流程举个例子你写了一个C Native服务编译好之后想放到板子上跑就可以用hdc file send推到/data/local/tmp目录再用hdc shell修改权限并执行。这套流程比反复烧镜像高效得多是迭代开发的核心节奏。5.3 x86电脑版OpenHarmony的hdc网络调试配置这里专门说一下电脑版x86 OpenHarmony的hdc配置因为最近很多人在折腾这个。x86电脑通常没有方便引出的调试串口USB调试口也不像开发板那样固定所以网络调试成了最实际的路子。前提是x86电脑已经连上局域网OpenHarmony系统已经正常启动。然后在电脑终端执行hdc tconn ip:port这里的ip是设备的局域网IP端口默认一般是8710。如果网络通、版本匹配输入hdc list targets就能看到设备。用这个方式连接后hdc shell、hdc hilog、hdc file send全都能用了。网络调试的不稳定因素通常出在防火墙和IP地址变动上。建议在路由器上给设备绑定静态DHCP或者在系统设置里配静态IP避免每次重启后IP变化。另外OpenHarmony系统本身的网络服务要正常启动否则hdc tconn会一直显示连接超时。这时可以参考我们系列教程里网络配置相关的内容先把系统网络调通。5.4 hdc调试的常见问题hdc调试也不是百分之百顺畅。除了版本不匹配最常见的问题就是连接不上。hdc list targets输出为空。先检查USB线缆和数据通道建议用支持数据传输的USB线不要用那种只能充电的线再确认设备的开发者模式及USB调试权限是否已授权。连接USB时有设备但在Windows设备管理器里显示未知设备。通常是驱动问题重新安装hdc配套的USB驱动解决。hdc shell进去后经常掉线。可能是USB线质量差、接触不良或者设备端USB服务不稳定。换一根短线通常能改善。网络连接时提示超时。可以用ping测一下IP连通性再用telnet ip 8710确认端口能不能通。端口不通就要检查设备端调试服务。6. 实战案例一块新板子从零开始跑通OpenHarmony6.1 用三板斧排查系统启动失败理论讲再多不如来一次完整实战。假设我拿到一块全新的RK3568开发板烧录了OpenHarmony标准镜像但上电后系统起不来。我会严格按照三板斧的思路来排查。第一步连接串口看到底卡在哪。串口日志显示内核已经启动但最终在mount /vendor时失败然后进入ramdisk的emergency模式。这一步说明Bootloader和内核镜像没问题问题出在根文件系统挂载环节。第二步进入串口的shell手动检查/dev/block下有没有对应的vendor分区设备节点再用lsblk或cat /proc/partitions确认分区是否正常。第三步如果分区没问题看/etc/fstab或对应的配置里分区挂载点是否写错。多半是镜像打包时分区表信息和实际烧录分区不对应。整个排查过程串口提供线索shell提供操作界面日志提供细节。这就是典型的“三板斧协同作战”范例串口发现症状shell确认状态日志定位细节。三者配合不用示波器也能八九不离十地找出问题。6.2 x86电脑版OpenHarmony的启动调试实录再看一个x86电脑版OpenHarmony的启动调试场景。我手头一台迷你主机装好x86版OpenHarmony后第一次开机卡在OpenHarmony的启动动画无法进入桌面。由于这台机器没有引出串口我先尝试网络hdc连接但系统没完全起来网络服务可能也没启动连不上。这种情况下我选择外接显示器和键盘用本地console观察系统输出。OpenHarmony启动到图形界面之前会有一段时间的内核启动日志显示在屏幕上按CtrlAltF1部分版本可能用其他组合键可以切换到虚拟终端看到console输出和shell提示符。通过这个方式我能看到系统其实卡在某个驱动初始化阶段日志提示和显卡驱动有关。于是我在启动参数里加入nomodeset绕过显卡驱动初始化系统就能继续启动了。虽然图形界面会有一些功能缺失但至少系统可用了后续再通过hdc安装对应驱动。这个案例说明了x86调试的特殊性串口不响我们就用显示器和键盘hdc不通我们就想办法先让系统跑起来再开网络调试。工具是死的思路是活的。7. 高频问题排查技巧与独家避坑经验7.1 问题排查速查表为了让你在真正遇到问题时能快速对照我把这些年高频遇到的问题汇总成了一张速查表。表里没有写太细节的原理都是直接能用的操作方向。问题可能原因速查命令/操作系统启动后无法进入桌面图形驱动初始化失败启动参数加nomodeset或更换内核参数hdc连不上设备开发者模式未开、USB线不支持数据、版本不匹配hdc list targets逐项排查hilog看不到应用日志日志级别过滤、应用日志走JS层console级别低hdc hilog -D调级别或检查代码日志级别应用安装失败HAP包签名问题、系统API版本不兼容hdc install看报错信息确认包和系统版本匹配系统频繁重启关键服务崩溃触发重启机制串口和hilog配合找crash堆栈网络不通网卡驱动未加载、IP配置错误hdc shell ifconfig或串口查看网络服务日志某个传感器无数据驱动加载失败、设备节点权限不足串口查内核驱动日志ls -l /dev看节点权限7.2 独家避坑技巧三板斧之外的3个习惯我见过太多开发者在调试上卡很久最后发现都是小问题。平时养成下面3个习惯可以省掉大半的调试时间。第一个习惯是保留复现现场日志。遇到问题第一时间把串口日志、hilog日志全部存档标注时间点和操作步骤。很多时候你以为是玄学问题回头看日志才发现是某个操作的必然结果。所有“偶发”问题基本都是日志没抓全。第二个习惯是学会二分定位。不要指望一次就能看到正确的日志。遇到启动失败先看最后50行日志遇到应用崩溃先看crash堆栈前几行遇到驱动无响应先确认设备节点在不在。把问题范围先缩小到某一层再逐步展开。这是硬件调试最核心的思维方式。第三个习惯是不要盲目重刷系统。重刷是最终手段不是首选调试手段。每次重刷都会丢失现场信息特别是内核崩溃后的内存转储信息。我调试一个内核panic问题时连续几次重刷系统以为自己代码有bug最后才发现是某次烧录时分区表写错导致的。如果当时不急着重刷先保留一个崩溃现场这个问题能早两天定位。8. 从三板斧到调试体系的进阶路径8.1 三板斧之后下一步学什么当你把串口、hilog、hdc都玩得比较溜就会发现它们解决的是“能不能跑、跑得对不对”的问题但还无法回答“跑得稳不稳、快不快”的问题。这时候就需要引入更高级的调试手段。一个方向是性能分析。OpenHarmony系统里有perf、hiperf之类的性能剖析工具可以统计CPU占用、函数热点、内存分配情况。另一个方向是崩溃栈分析hdc可以抓取应用崩溃的调用栈信息结合符号表反解出代码行号。还有一个方向是内核调试如果你在做内核和驱动开发学会使用内核的动态调试dynamic debug和ftrace效率会大幅提升。x86环境下还有一个优势就是可以接JTAG调试器对内核做单步调试这是ARM开发板不太容易实现的。我的建议是先把三板斧练到不需要动脑就能用的程度再去学工具链。工具再高级基础调试思维没建立照样玩不转。8.2 如何利用社区与官方资源加速成长OpenHarmony的生态还在快速生长中很多坑大家都会踩多逛逛技术社区、看看别人的调试记录能避开不少弯路。我自己的习惯是遇到问题先在官方文档查找对应模块的调试说明再去社区搜索有没有人遇到类似现象最后实在不行才按三板斧的思路自己硬啃。社区资源里最值得关注的是各家开发板厂商提供的BSP包、补丁说明和已知问题列表。比如有些开发板适配OpenHarmony时会有特定的内核补丁如果你直接编译主线内核就是起不来。这时候去查厂商适配记录往往比埋头调试更有效。x86电脑版OpenHarmony也一样很多大神在社区分享了搭建步骤、驱动适配情况和启动参数调整的帖子非常值得参考。不过参考别人的方案时要注意版本差异OpenHarmony迭代很快半年前的帖子可能已经不完全适用了。最后再说一点做OpenHarmony开发千万别怕折腾。硬件调试最迷人的地方就在于每一次串口刷出日志、每一次hdc连上设备、每一次系统从崩溃边缘救回来带来的成就感是纯软件调试给不了的。三板斧练熟了后面遇到再大的问题你心里也会有底气无非是串口、日志、hdc三样大不了慢慢查。这种解决问题的思路也是我这些年在嵌入式上最大的收获。
返回列表