ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

OpenHarmony硬件调试三板斧:串口日志、崩溃分析与性能追踪实战

OpenHarmony硬件调试三板斧:串口日志、崩溃分析与性能追踪实战 1. 为什么硬件调试三板斧是OpenHarmony开发的必修课很多人拿到OpenHarmony开发板或者在自己的x86电脑上装好OpenHarmony系统之后做的第一件事就是接上屏幕、插上电源期待开机画面出现。结果往往是屏幕亮也不亮、启动卡在某处不动、或者在某个看起来一切正常但实际上系统不响应的状态里浪费几个小时。这中间最容易让人抓狂的不是系统本身有多难而是你看不到系统内部到底在做什么。我在早期接触OpenHarmony的时候也走过这段弯路。当时在一款开发板上跑系统明明编译烧录都成功上电后串口却一个字符都不输出当时的第一反应是代码有问题于是反复重编固件、反复烧录折腾了整整两天。后来才发现问题根本不在代码而是串口工具的参数没配对波特率设错了数据当然全是乱码。那次之后我彻底明白了一件事在OpenHarmony这种涉及内核、HAL层、系统服务、应用框架的多层系统里靠肉眼和猜是干不了活的必须有一套系统化的硬件调试方法。这套方法说白了就是三样东西串口日志、崩溃现场分析、性能追踪。我习惯把它们称为硬件调试三板斧。你不需要一开始就掌握各种花哨的调试手段把这三板斧用熟就能解决OpenHarmony开发中绝大部分的“系统跑不起来”、“莫名其妙重启”、“卡顿无响应”问题。这篇内容面向的是正在做OpenHarmony系统移植、硬件适配、驱动开发或者应用层疑难问题排查的开发者。如果你手里有一块OpenHarmony开发板或者正在折腾x86 PC版OpenHarmony的硬件兼容问题这篇文章里的思路和命令可以直接照抄。即便你之前没有接触过嵌入式调试照着这个流程走一遍也能很快建立起自己的调试节奏。2. 第一板斧串口日志系统活没活、跑到哪一步全看它串口日志是OpenHarmony开发里最重要、也是最先应该掌握的手段。内核起来了没有、驱动加载是否成功、init进程有没有拉起关键服务这些信息全在串口输出里。很多时候系统屏幕没有输出但串口已经在汇报大量信息了所以不要只盯着HDMI或者MIPI屏幕看先把串口这条通道打通。2.1 串口连接与终端参数选择开发板通常板载UART调试串口一般是3.3V TTL电平需要USB转串口模块连接。PC平台就要注意很多x86电脑没有物理串口建议直接使用USB转串口芯片的转接线选CP2102或者CH340芯片的比较稳定。连接方式并不复杂转接板的TX接开发板串口的RX、转接板的RX接开发板的TX、GND共地然后插入电脑USB口。以Linux下的minicom为例sudo minicom -s进入设置界面后选择“Serial port setup”把串口设备改成类似/dev/ttyUSB0的具体设备名波特率设成115200数据位8、无校验、1停止位也就是大家常说的115200 8N1。硬件流控建议关掉。Windows下我一般用MobaXterm或者PuTTY同样选Serial协议、选对COM口、波特率115200即可。这里给一个常见参数对照表方便保存项目推荐值说明波特率115200OpenHarmony各平台默认UART调试波特率数据位8常规8位数据校验位None无校验停止位11位停止位流控关闭硬件流控开启经常导致输入无效连接好之后先按一下开发板或PC的复位键看串口终端是否出现启动日志。如果什么都接收不到重点排查三点TX/RX是否接反、波特率是否匹配、GND是否共地。这三点占了串口不通原因的九成以上。如果串口能收到大量日志但全是乱码那就是波特率不对或者收发两端电平不匹配。2.2 内核日志与hilog的配合使用系统跑起来之后OpenHarmony的日志分为两层内核层和用户态层。内核启动早期的信息通过dmesg查看用户态系统服务和应用的日志通过hilog查看。这两个命令分别对应不同的排查场景。内核启动阶段卡住先看串口上有多少内核日志输出。比如你发现日志停在了某个驱动的probe函数附近那大概率是驱动初始化没有返回可以从日志里最后出现活跃信息的那一行开始查。进入系统后也可以随时敲dmesg查看内核环形缓冲区的内容比如dmesg | grep -i fail dmesg | grep -i error我常用这两个过滤条件先扫一遍看内核态有没有明显的初始化失败项。如果驱动加载失败、中断冲突这类问题通常在这里会留下线索。用户态的问题就要靠hilog了。hilog是OpenHarmony的日志系统默认按类型和优先级过滤输出hilog -x-x表示退出时会清理日志缓冲区适合在做完一次复现操作后立即查看刚才产生的日志。更常用的方式是先清空缓冲区再操作再看日志hilog -w # 清空日志 # 执行你的操作比如启动某个应用或插拔某类设备 hilog -x # 查看缓冲区中的新日志如果日志量太大刷屏看不清可以用管道加grep过滤hilog | grep -i my_service\|fatal\|error我在排查具体的硬件设备时习惯先在hilog里关注和硬件节点相关的关键字比如/dev/input、i2c、spi、gpio、usb这类词能比较快地定位到对应设备的日志区域。2.3 从串口日志读懂系统启动的三个关键阶段看串口日志不是从头看到尾关键是抓住三个时间点引导加载阶段、内核初始化阶段、用户态启动阶段。引导加载阶段的日志通常很短uboot或者grub会打印内存信息、加载地址、设备树信息等。这里如果停了先检查存储介质和引导配置比如分区表是否被破坏、boot.img是否完整。内核初始化阶段日志量非常大从“Booting Linux”到init进程启动之前涉及设备树解析、各个驱动的initcall、根文件系统挂载。如果系统卡在这里把最后几行日志重点看一下常用命令是dmesg | tail -20用户态启动阶段以init进程启动为标志日志中会出现服务拉起、权限配置、应用管理初始化等记录。这个阶段出问题日志往往涉及SELinux权限、服务依赖关系、配置文件格式错误需要结合hilog的报错信息逐条排查。有一次我遇到系统卡在开机动画循环重启的问题串口日志里只有一行可疑的Failed to start ability_manager_service顺着这个服务查下去发现是某个新增的HA包目录权限不对修改权限后重启就恢复正常了。这种问题如果不看串口日志光盯着屏幕上的开机动画基本无从下手。3. 第二板斧崩溃现场还原crash与faultlog的深度分析日志能告诉你系统“跑到了哪里”但系统真正崩溃、重启、某个进程突然消失的时候需要的是一套更专门的现场还原工具。OpenHarmony把这类信息统一称为faultlog获取和分析faultlog是我认为整个调试三板斧里信息密度最高的一环。3.1 OpenHarmony中的常见崩溃类型在OpenHarmony系统里崩溃大致可以分为三类CPP崩溃、JS崩溃和系统级复位。CPP崩溃指的是native层应用或服务发生空指针、内存越界、断言失败等错误通常会有一条backtrace调用栈。JS崩溃发生在前端应用逻辑层一般是未捕获异常定位起来相对直观。系统级复位则是内核panic、看门狗超时或者硬件异常导致整机重启这类问题往往最难查因为它可能涉及到驱动、中断、内存映射等底层逻辑。faultlog的存放位置在不同版本上略有差异但常见路径是/data/log/faultlog/。进入设备shellhdc shell cd /data/log/faultlog ls目录下会按崩溃类型和文件名区分比如cppcrash-*、jscrash-*、syscrash-*。文件内容包含了进程基本信息、崩溃时的寄存器状态、backtrace调用栈、内存映射信息等是一个完整的“事故现场”。3.2 手动触发与现场保留有些崩溃不是启动时必现而是某种操作后概率出现。遇到这种情况最好手动保留现场避免反复复现时丢失关键日志。步骤是先清空faultlog目录里旧的临时文件然后复现问题再去查看新增的文件。hdc shell mkdir -p /data/log/faultlog/temp rm -rf /data/log/faultlog/temp/* # 复现问题 ls -lt /data/log/faultlog/temp/我特别强调temp目录是因为OpenHarmony的crash文件最初是写到temp目录的等系统空闲后才归档到正式目录。如果你只看正式目录可能漏掉刚刚产生的崩溃记录。所以排查时优先看temp下按时间倒序排列的新文件。在开发过程中如果faultlog目录写满了也会导致崩溃信息丢失建议养成一个习惯每次复现问题之前先把faultlog里之前的旧文件清一遍这样新增文件就是一次有效现场。3.3 从backtrace到源码行号的定位链路拿到faultlog之后核心工作是分析backtrace。比如一份cppcrash文件里的调用栈信息形如下面这样#00 pc 0001c4c8 /system/lib/ld-musl-arm.so.1 #01 pc 00004270 /system/lib/libhilog.so面对这种十六进制地址大多数人的第一反应是无从下手。正确的做法是把这些地址转换成具体函数和源码行号具体手段是用addr2line配合编译时生成的符号文件或ELF文件。addr2line -e out/ohos-arm64-release/rootfs/system/lib/libhilog.so 00004270这里的关键是你用来转换的so文件必须和当时烧录进设备的完全一致否则地址对不上转换结果没有意义。所以开发机上要注意保留每次编译输出的产物目录特别是带符号信息的库文件这是排查崩溃的宝贵资料。拿到函数名和行号之后再去源码里看上下文重点看崩溃附近有没有空指针解引用、数组越界、资源未初始化。这类问题的修复一般都比较直接难的是“如何准确定位”backtrace给了你最短路径。如果崩溃栈比较深、涉及跨进程IPC单看一段backtrace不一定能看出全貌这时候建议结合hilog里该进程之前一段时间的最后几十行日志往往能看到崩溃前的业务动作比如正在读取某个设备节点、正在处理某个IPC消息。这种“日志backtrace”的组合定位比单看任何一项都快。4. 第三板斧性能追踪与资源监控卡顿和延迟的真正来源前两板斧解决的是“系统不工作”和“系统崩溃”的问题第三板斧解决的是“系统工作但不正常”的问题。具体表现就是界面拖动掉帧、应用启动明显慢、某个设备的响应时延忽高忽低。这类问题不像崩溃有明确的faultlog文件也不像启动失败有清晰的日志停点需要依靠性能追踪工具从系统调度和资源占用中找证据。4.1 hitrace的使用逻辑OpenHarmony自带性能追踪工具hitrace使用方法类似Linux下的atrace按tag抓取不同模块的trace数据。hitrace --trace_begin app_api # 执行需要分析的业务操作 hitrace --trace_dump /data/trace_output.txt hitrace --trace_finish抓取出来的trace文件可以用相关工具打开查看各函数的耗时定位耗时热点。使用hitrace要注意两点一是抓取时间窗口不要太长最好只覆盖目标操作的前后几秒否则数据量太大反而不利于分析二是tag选择要有针对性不确定先抓什么的时候优先抓sched和ability。比如我遇到过一个应用启动慢的问题从点击图标到第一帧画面出现接近三秒。通过hitrace抓取启动阶段的trace发现大部分时间不是耗在业务初始化上而是耗在了某个系统服务的IPC等待上进一步排查是那个服务在等待一个慢速设备的异步回调。如果没有hitrace这种问题只能靠猜效率极低。4.2 CPU、内存与中断的实时监控三板斧除了hitraceOpenHarmony的设备shell里还保留了常规的资源监控手段性能和系统排障时建议配合使用。toptop命令可以看到当前各进程CPU和内存占用适合先瞄一眼到底是哪个进程CPU跑满。然后结合/proc下的状态信息深入排查cat /proc/meminfo cat /proc/interruptsmeminfo能看内存总量与剩余内存如果可用内存长期偏低排查是否有内存泄漏就需要配合反复采样。interrupts里的各中断号触发次数是排查硬件中断风暴很直接的证据——如果某个中断号数值在短时间内暴涨几十万次那对应的设备驱动大概率在疯狂触发中断即使业务看起来没有跑什么任务CPU占用也会居高不下。这类问题在硬件适配阶段特别常见。比如某个外设驱动在探测不到设备的时候如果中断处理函数没有正确关闭中断源就会形成中断风暴直接拖垮整个系统。看到top里CPU占用异常但业务进程都很正常时一定要去翻/proc/interrupts这是很多人容易遗漏的关键步骤。4.3 用trace数据反推硬件瓶颈的实战思路在OpenHarmony的硬件开发里性能问题表面上是系统层的调度、服务和资源的平衡问题往深处看往往是硬件能力与软件需求不匹配。比如一个触摸驱动的上报频率明显偏低导致界面滑动不跟手一块存储芯片的顺序读速度上不去导致应用加载资源缓慢。用trace数据反推硬件瓶颈的基本思路是先从trace里找到时间消耗最大的区间再把该区间内的调用映射到具体的硬件路径比如是I2C读取设备寄存器慢、还是SPI传输大块数据慢、还是中断响应被其他高优先级任务阻塞。定位到具体硬件路径后再用示波器或逻辑分析仪在硬件层面对信号时序做二次确认。我遇到过一例Wi-Fi吞吐率远低于规格的情况从hitrace看驱动进程CPU占用并不高数据一直卡在某个缓冲区队列里。后来用逻辑分析仪抓SPI接口时序发现SPI时钟频率在设备休眠唤醒后被重置为默认低频导致吞吐率上不去。这是一个典型的“软件层面看正常、硬件层面见真章”的问题也说明了性能追踪和硬件测量要相互印证不能只信一头。5. x86 PC版OpenHarmony的调试差异与硬件适配要点最近社区里讨论得比较热烈的话题是OpenHarmony的PC版和x86镜像很多人希望在一台普通电脑上跑OpenHarmony系统。和ARM开发板的硬件调试相比x86平台的调试方法有共同的三板斧逻辑但细节上有明显差异值得单独拆开说。5.1 PC版调试三板斧的变通PC版OpenHarmony同样是串口日志、崩溃分析、性能追踪这套体系但实际落地时有几个地方需要变通。串口方面x86电脑通常没有原生物理串口推荐用USB转串口调试线或者直接在系统启动的GRUB阶段加内核参数把日志输出重定向到虚拟控制台。很多人装完PC版发现屏幕卡死第一反应是想在root分区上做手脚其实更有效的做法是在GRUB启动项里临时增加参数启用串口调试输出或者图形界面的详细日志级别。OMG参数的添加方式是在GRUB菜单项上按e键进入编辑找到对应的kernel行追加类似consoletty0 consolettyS0,115200这样系统日志会同时输出到显示器和串口利用USB转串口线在另一台电脑上就能看到串口日志。这是PC平台硬件调试三板斧中“第一板斧”的关键变通也是排查PC版黑屏问题的首选路径。崩溃分析和性能追踪在PC版上大同小异faultlog路径和hilog用法全局一致。区别在于PC平台上驱动的种类更多、外设型号更杂有时crash不一定出现在业务进程里而是在某个网卡、声卡或显卡驱动模块里这类问题更依赖内核日志和dmesg的配合。5.2 常见硬件适配问题的三个经典排查方向在x86 PC上跑OpenHarmony实际反馈最多的问题集中在显卡显示输出、网卡识别和存储设备稳定性这三个方向。显卡问题最典型的表现包括系统启动后屏幕无信号、分辨率异常、窗口管理器渲染卡顿。排查时先确认内核日志里有没有加载对应的显卡驱动模块例如Intel核显对应的i915模组。日志里如果出现类似Direct firmware load failed的信息优先排查固件文件是否拷贝到了/lib/firmware的正确位置。这类问题多半不是OpenHarmony框架的问题而是内核固件与硬件型号的匹配问题。网卡识别失败通常和PCI设备枚举有关。遇到网卡不上电或者识别不到MAC地址先执行类似lspci | grep -i ethernet确认设备在PCI总线上是否被枚举出来。如果lspci能看到设备但驱动没有绑定需要检查内核.config里是否启用了对应的驱动模块如果设备枚举都没有就要从PCIe链路训练、硬件供电这些方向入手。存储设备问题常见于SSD或NVMe盘在系统休眠唤醒后出现文件系统异常。排查优先级是先看dmesg里的ATA/NVMe错误信息再检查分区的读写方式是否触发了设备固件的某种边界情况。对于这类问题短时间内最稳妥的处理是先在系统层面避开低功耗状态确认功能稳定后再逐步放开关闭低功耗状态的限制。5.3 我的PC版调试顺序建议如果你手头正有一台x86设备要适配OpenHarmony我的习惯是严格按照下面这个顺序做硬件调试第一步确保串口能看到完整启动日志这一步排第一因为看不见日志基本上后续所有工作都是在盲人摸象。第二步让系统稳定跑起来期间所有崩溃都通过faultlog定位解决保证基础稳定性。第三步逐个验证外设硬件每验证一个外设就看一次dmesg和hilog确认没有异常上报。第四步才做性能打磨和低功耗测试。这个顺序我在多款开发板和x86设备上验证过最大的收益是避免了“在性能问题上反复折腾最后发现是驱动稳定性不过关”的无效劳动。先把系统调到稳定再谈快不快、省不省电这条经验在OpenHarmony开发里几乎是普适的。说起来也是有意思很多人刚接触OpenHarmony硬件开发时总觉得调试技巧越高级越好动不动就想去接仿真器、搞硬件断点。可实际上我绝大多数疑难问题最后都是靠串口日志一眼一行看出来的真正需要开仿真器的场景反而少之又少。把串口这只“眼睛”实实在在用透让每个字段都变成你能读懂的信息就已经超过大多数人了。三板斧听起来朴素用熟了是真能救命的。
返回列表