前阵子有朋友问我:OpenHarmony设备开发到底难不难?我说,代码编译、烧录这些流程学几天就会,真正拉开差距的是硬件调试。尤其做开源鸿蒙这类系统级开发,板子一旦跑不起来,日志看不到、串口没输出、CPU又不听话,新手很容易卡在那里一整天。其实在我眼里,硬件调试从来没有玄学,翻来覆去就是三板斧:打日志、连串口、上调试工具。
这篇内容就围绕OpenHarmony系统实战开发中的硬件调试展开,我会把这三板斧怎么用、为什么这么用、遇到问题时怎么配合起来一起用,全部摊开来讲。不管你是刚从单片机转过来的嵌入式开发,还是第一次碰开源鸿蒙标准系统的软件工程师,这篇文章都够你少走不少弯路。
1. 为什么是“三板斧”?——先把硬件调试的思路捋顺
1.1 OpenHarmony开发中的“三无声”困境
做OpenHarmony设备开发,最容易遇到的其实是三个“没反应”:上电没反应、外设没反应、崩溃没头绪。
上电没反应最常见,板子电源灯不亮,或者亮了但串口一个字符都没有。这时候你根本不知道是芯片没跑起来、DDR初始化失败、还是镜像根本没烧进去。第二个没反应是针对外设的,代码编译通过、镜像也烧录成功,但是接在I2C总线上的传感器就是读不到数据,GPIO控制的灯死活不亮。第三个最让人头疼,系统运行几分钟后偶发死机,有时候一天都不出问题,一出问题就让人怀疑人生。
这三种情况有个共同点:你看不到系统内部到底发生了什么。软件层能给的线索非常有限,编译通过只能代表语法没错,烧录成功只能代表镜像进了Flash,而硬件调试的目标就是在这种情况下,用最小的成本把“黑盒”变成“白盒”。
OpenHarmony和传统单片机开发不太一样。它的系统分层多、组件复杂,纯靠看代码猜问题,效率极低。我在刚开始做开源鸿蒙适配的时候,也曾经拿着示波器到处戳,后来发现没有日志支撑的示波器完全是盲人摸象。最终沉淀下来的思路,就是三板斧按顺序出手,从最容易获取信息的手段开始,一层层逼近问题本质。
1.2 三板斧各司其职:日志、串口、调试器
所谓的“三板斧”,其实是三个不同层级的调试工具,每一板斧解决一类问题。
第一板斧是日志,这是系统的“黑匣子”。只要系统能跑起来,日志就能把执行路径、错误码、关键变量值全部记录下来。遇到功能逻辑问题,日志几乎是第一选择,因为它成本最低、最快,不需要额外硬件,代码里加几行打印就行。
第二板斧是串口,这是开发者的“对讲机”。当系统起不来、日志系统本身还没初始化好、甚至内核还没解压的时候,串口往往是唯一能和板子建立联系的手段。很多情况下,你只需要一根USB转串口线,就能在boot阶段看到启动信息,还能进入交互Shell执行命令,相当于隔着屏幕伸了一只手进板子里。
第三板斧是调试器和外部测量工具,包括hdc调试通道、JTAG/SWD调试器、逻辑分析仪、示波器。日志告诉你“发生了什么”,串口让你“能跟它说话”,而调试器是真正的“手术刀”,能让你断点单步、看寄存器、抓总线波形,直接看到时序层面的真相。
这三板斧不是孤立的。我个人的习惯是:先看日志能不能定位,不能定位就用串口确认系统状态,再不行就上调试工具看硬件信号。绝大多数情况下,问题的答案在前两板斧里就找到了,第三板斧是用来兜底和验证的。
2. 第一板斧:日志调试——让系统开口说话
2.1 理解OpenHarmony的日志体系和hilog
OpenHarmony的日志体系和传统Linux的dmesg/logcat不完全一样,它有一套统一的日志组件叫做hilog。无论你是在标准系统写应用,还是做系统组件适配,日志最终都会汇聚到hilog里统一管理。
hilog有分级的概念,从低到高分别是DEBUG、INFO、WARN、ERROR、FATAL。这和我们平时写代码用的log4j、syslog很类似。DEBUG适合打印调试过程中的变量值,INFO适合记录关键流程,WARN用来提示可能有问题但不影响主流程,ERROR是明确的错误,FATAL则是致命异常。
除了级别,hilog还引入了domain和tag两个维度。domain是十六进制的模块标识,用来区分不同子系统,比如内核、HDF框架、某个驱动,都由各自的domain范围;tag则是更细的字符串标签,通常对应到某个具体模块或文件。这两个字段最大的用处是过滤——当整个系统刷日志刷得飞起的时候,你能用domain和tag快速锁定自己关心的那一片日志,而不是在一堆无关信息里大海捞针。
我刚开始用hilog的时候,总觉得印出来的日志就完事了,后来才意识到:日志不分类、不打标签,等于没写。真正到系统规模大了、多模块协同的时候,没有domain和tag过滤,你根本没法在几百行滚动日志里找到自己想要的那一行。所以建议从一开始就把domain规划好,tag命名统一,这个习惯越早养成越省事。
2.2 代码里怎么打日志:级别、格式与隐私保护
在OpenHarmony的C/C++组件里,最常用的是HiLog接口。一个标准的使用方式是这样的:
#include "hilog/log.h" static constexpr HiLogLabel LABEL = {LOG_CORE, 0xD001234, "MyI2CDevice"}; void TestTransfer(int addr) { HiLog::Info(LABEL, "enter %{public}s, line=%{public}d", __FUNCTION__, __LINE__); int ret = I2cTransfer(addr); if (ret != 0) { HiLog::Error(LABEL, "i2c transfer failed, ret=%{public}d, addr=0x%{public}x", ret, addr); } }这里有几个细节值得注意。HiLogLabel结构体里首先标明了日志类型LOG_CORE,后面是domain,我一般会用一个十六进制且不和其他模块冲突的值,最后是tag字符串。实际打印的时候,%{public}和%{private}是OpenHarmony特有的一种格式控制,public表示该参数可以明文输出到日志,private则会在日志系统中被自动脱敏,用于保护敏感信息。
这个隐私保护机制一开始我是不以为然的,直到有一次同事打印MAC地址用错了格式,导致日志里全是星号,排查问题时才发现关键信息被脱敏了。反过来,如果你打印的是明文地址、密钥这类敏感数据,又会引发安全风险。所以我的建议很明确:普通调试信息用%{public},但涉及用户数据、证书、密码相关内容,一律用%{private}。
关于级别选择,我见过不少人在调试时一律用ERROR,这样其实是有问题的。日志量大了之后,真正的错误会被无意义的ERROR刷屏淹没,团队协作时别人也不敢信任ERROR日志了。我个人习惯是:流程节点用INFO,潜在风险用WARN,明确失败用ERROR,只在本地调试阶段才用DEBUG。DEBUG一般不带到正式版本,或者交给日志框架的开关宏控制。
2.3 日志采集与过滤:设备端与PC端联动
日志打出来了还不够,关键是如何高效地抓到它。在OpenHarmony设备上,你可以直接通过串口Shell执行hilog命令查看实时日志,但这在调试阶段不太够用,因为日志量太大,你需要过滤。
我最常用的命令是直接带grep过滤:
hilog | grep MyI2CDevice这会把包含tag为MyI2CDevice的日志全部过滤出来,简单粗暴,适合快速定位。如果日志量非常大,我还会配合hilog -z清空缓冲,让系统只记录新产生的日志,避免旧日志干扰。
在PC端,如果你用的是标准系统并且设备支持hdc连接,那就更方便了。hdc hilog可以直接把设备上的日志流重定向到PC上,再用文本处理工具做过滤和分析。我通常在电脑上这样操作:
hdc hilog > device.log & tail -f device.log | grep "MyI2CDevice"先把完整日志落盘,再用tail和grep实时筛选,这样既能保证不丢日志,又能快速聚焦问题。如果遇到复现性问题,我会把完整日志保存下来,等复现后再回头翻找细节。
2.4 日志打法的经验:打点要打在“决策点”上
日志调试最容易犯的错误,是在代码里乱打一气,满屏都是日志,还是找不到问题。我总结的经验是:打点要打在“决策点”上。
什么叫决策点?就是代码里出现分支、返回值、关键状态变化的地方。比如一个函数,在进入时打一条INFO,在return出错时打一条ERROR,在某个条件分支执行时打一条带分支逻辑的DEBUG。这样系统运行时,你能通过日志把整个执行路径还原出来,一眼看它走了哪个分支、到了哪一步、因什么原因退出。
还有一个小技巧是善用开关宏。正式发布和本地调试经常需要不同的日志密度,可以加一个编译期开关:
#ifdef MODULE_DEBUG_ENABLE #define DBG_LOGI(fmt, ...) HiLog::Info(LABEL, fmt, ##__VA_ARGS__) #else #define DBG_LOGI(fmt, ...) #endif这样你在开发阶段打开宏,日志铺满屏;交付阶段关掉宏,只保留ERROR级别的核心日志,对系统性能几乎没有影响。这个看起来很简单,但很多项目到后期都在吃日志太多导致系统变慢的亏,提前用宏控制能省很多事。
3. 第二板斧:串口调试——系统不听话时的保底通道
3.1 为什么串口是硬件调试的最后防线
很多从纯软件转过来的开发对串口是不够重视的,觉得有了hdc、有了日志系统,还要什么串口?但真正做过硬件适配的人都知道,串口是最后一道保险。原因说起来很朴素:日志系统和hdc都是建立在系统已经跑起来的前提上,而串口从芯片上电那一刻就可以工作,不需要操作系统,不需要网络,不需要驱动完整初始化。
举个最简单的例子,OpenHarmony标准系统在启动早期,bootloader阶段的消息、内核解压阶段的消息,都是通过串口输出的。如果这一步串口没有输出,你连系统是否在跑都不知道,谈后面的调试都是空的。反过来说,只要串口有输出,哪怕系统反复重启、卡死在某个环节,你至少能看到卡在哪一行,这样就有了排查方向。
我通常拿到一块新板子,第一步就是接好串口,确认“一亮二响”——电源灯亮,串口有启动输出。如果这两个条件都满足,说明硬件最小系统基本没问题,后面的工作才有意义。这种习惯救过我太多次,有一次客户板子怎么都不启动,我把串口接上后发现输出停在DDR初始化阶段,立刻判断是内存参数配置问题,半小时就定位了,要是没有串口,真不知道要从哪里下手。
3.2 串口连接、参数与工具选择
串口调试的硬件准备并不复杂,但容易在小细节上翻车。绝大多数开发板都引出了UART调试口,通常是三根线:TX、RX、GND。注意是交叉连接,也就是板子的TX接USB转串口工具的RX,板子的RX接工具的TX,GND接GND。这个交叉是新手最容易忽略的地方,很多“为什么没输出”其实就是TX/RX接反了。
USB转串口芯片最常见的是CH340、CP2102、FT232这几类。CH340便宜量大,CP2102稳定性好,FT232在高端场合更常见。开发阶段买一条质量稍好的CH340或者CP2102线基本就够用了,关键是驱动要装好,Windows下可以在设备管理器里看到COM口号,Linux下可以用dmesg | grep ttyUSB查看设备节点。
串口参数方面,OpenHarmony相关开发板默认最常用的组合是:波特率115200、8个数据位、无校验、1个停止位,也就是常说的115200 8N1,不启用流控。工具选择上,Windows下我习惯用MobaXterm或者SecureCRT,Linux下用picocom或minicom。picocom的命令很简洁:
picocom -b 115200 /dev/ttyUSB0退出组合键是Ctrl+A Ctrl+X。如果不记得,也可以直接关掉终端,但那样有时会残留进程占用串口。
3.3 在串口Shell里操作OpenHarmony
标准系统起来之后,串口终端里通常会有交互式Shell,也就是说你不只是能看日志,还能通过串口向系统发指令,这相当于在串口里拥有一套“系统后门”。
以OpenHarmony标准系统为例,串口Shell里可以执行常见的文件、进程、设备节点操作命令,比如ls查看目录、cat读取设备节点、ps查看进程列表、mount查看挂载信息等。这些命令在日常调试中非常实用,我曾经在一个I2C外设不工作的问题里,通过串口Shell检查设备节点是否存在,从而快速判断是设备没有注册成功还是上层应用的问题。
这里要说一个重要思路:串口Shell不只能用来“看”,还能用来“试”。你可以直接在Shell里触发一次业务操作,然后观察系统日志和硬件行为。比如外设驱动有对应的工具或测试程序时,直接在Shell里跑一遍,比反复改代码、重新编译、烧录要高效得多。我在调试HDF驱动时经常这么干:先用串口确认驱动加载了,再手动触发一次读写操作,看返回值和错误码,基本能把问题裁掉一大半。
3.4 用串口分析启动日志、panic与复位问题
串口最有价值的场景之一,是分析系统启动和异常复位问题。启动日志就像系统的“出生记录”,从第一个字符开始,每一行都对应一个硬件模块的初始化进度。通过看日志停在哪一行,就能知道系统卡在什么位置。
比如日志停在[Init] Start init xxx...之后就没了,说明系统在这个初始化环节出问题了。就要去核对对应模块的配置、硬件连接、依赖的资源是否就绪。我遇到过好几次,日志停在某个设备驱动初始化,最后查出来是该驱动依赖的时钟没有使能,这是典型的软件初始化和硬件实际状态不匹配。
还有一类很头疼的问题是偶发panic或者死机重启。这种情况下,串口日志里的调用栈信息就是破案关键。panic发生时,系统会打印异常类型、触发地址、寄存器上下文和调用回溯。你不要只看“程序死在哪”,还要把调用栈往上翻,看它是由哪个函数、哪个操作触发的。我以前碰到过一个看门狗超时重启的问题,表面上崩溃在一个随机地址,实际上通过调用栈追根溯源,最后发现是一个线程在持有锁的情况下睡眠超过了看门狗阈值。这个如果没有串口完整保存崩溃前后信息,几乎不可能定位。
3.5 串口调试的典型坑
串口调试本身并不复杂,但有几个坑很经典,我一个个说。
第一个坑是乱码。很多人一看到串口输出乱码就懵了,其实十个里有八个是波特率不对,或者板子实际输出的波特率和工具设置不一致。先检查是不是115200,再检查工具里有没有选错串口。还有一个常见原因是GND没接好,也就是开发板和USB转串口工具没有共地,导致信号参考电压不对,也会出现乱码。
第二个坑是完全没输出。先别急着怀疑板子坏了,大概率是TX/RX接反,或者串口工具被其他程序占用。Windows下如果MobaXterm连不上,先看看设备管理器里COM口有没有被别的软件打开。另外有些开发板要求使用特定的USB口或者跳线来使能调试串口,这个建议先查一下板子手册,不要上来就怀疑硬件。
第三个坑是数据会丢或时序不对。这种情况通常和流控有关,默认配置下不要开启RTS/CTS流控,不然很容易出现“能收不能发”的怪问题。另外串口线不宜过长,我见过有人用了两三米的杜邦线连串口,结果高速日志下频繁丢字,换成短线和屏蔽线以后就正常了。
4. 第三板斧:hdc与调试工具——深入系统内部
4.1 hdc:OpenHarmony的调试瑞士军刀
如果说串口是“笨办法里的可靠办法”,那hdc就是OpenHarmony体系里最趁手的调试通道。hdc的全称是HarmonyOS Device Connector,用过Android开发的同学看它就像看到了adb,基本功能逻辑很接近,都是通过USB让PC端和设备端建立通信,然后执行设备管理、Shell命令、文件传输等操作。
我日常最常用的hdc命令是这几个:
hdc list targets # 查看当前连接的设备 hdc shell # 进入设备Shell hdc shell hilog # 抓取设备日志 hdc file send local remote # 把本地文件推送到设备 hdc file recv remote local # 把设备文件拉到本地hdc最大的优势是传输文件非常方便。比如我想把编译好的可执行程序或测试脚本放到设备上跑,直接用hdc file send推过去再hdc shell执行就行了,不用反复烧录镜像。我还习惯把设备上的日志文件用hdc file recv拉到PC上慢慢分析,比在终端里翻滚动日志舒服得多。
要注意的是,hdc调试需要设备处于正常启动状态,并且通过USB连接后需要确认设备被正确识别。我在实际使用中见过几次hdc连不上的情况,大部分原因是USB驱动没装好、设备没有开启调试模式,或者第一次连接时设备端弹出了授权确认,而你没有及时在屏幕上点击允许。
4.2 DevEco Studio与DevEco Device Tool搭配使用
OpenHarmony的工具链生态中,日常打交道最多的是两个IDE:DevEco Studio和DevEco Device Tool。前者偏应用开发,后者偏设备/驱动开发。在硬件调试的场景里,Device Tool的重要性更高。
DevEco Device Tool集成了从源码导入、编译配置、烧录下载到串口监视的完整流程,所以你可以在一个工具里完成“改代码→编译→烧录→看串口日志”的闭环,省去了在多个工具间来回切换的麻烦。烧录环节尤其重要,OpenHarmony标准系统的镜像文件和分区结构比单片机复杂得多,手工用命令行烧录容易弄错分区,而Device Tool会根据产品配置文件自动分配合适的烧录策略。
实际使用中有个很重要的经验:工具链版本要和SDK版本匹配。我有一次升级了DevEco Device Tool,结果编译出的镜像烧录到旧板子上完全起不来,查了好几个小时才发现是工具链版本和系统BSP不兼容。所以搭建开发环境时,尽量按照官方文档推荐的版本组合来配置,不要手欠随意升级独占工具。
如果你做的是标准系统上的应用开发,那DevEco Studio会更常用。它可以通过hdc连接真实设备,进行应用安装、启动、日志抓取,还能做断点调试。不过它主要面向应用层调试,如果问题出在内核或驱动层面,还是得回到代码打印和串口来看。
4.3 逻辑分析仪与示波器:把三板斧焊得更牢
有时候问题到了软件和硬件边界上,日志和串口就说不清了。比如I2C设备无应答、SPI时序不对、GPIO电平始终拉不高,这些情况你不能光靠代码猜,必须看到真实的信号波形。这时候逻辑分析仪和示波器就要登场了。
逻辑分析仪适合抓协议信号,比如UART、I2C、SPI、PWM这类数字信号。它能把总线上的电平变化按照时间顺序记录下来,然后帮你解析成协议帧。我用的最多的是一款几十块钱的USB逻辑分析仪,虽然采样率不高,但调试I2C和SPI完全够用。抓I2C波形时,你可以很直观地看到主控发出了什么地址、设备有没有在第9个时钟周期拉低SDA应答,一眼看穿“设备没应答”到底是主控没发出去,还是从设备没有拉电平。
示波器则更适合看模拟信号、电源质量、时钟稳定性这类问题。比如系统上电后不稳定、芯片复位异常,先用示波器测一下电源电压是不是有跌落,再用探头看晶振引脚有没有正常起振,很多看起来诡异的问题其实是供电纹波超标导致的。相比之下,示波器比逻辑分析仪贵不少,我刚入门时先买了一台入门款台式示波器,后来用得频率不高,但遇到电源问题时它确实是唯一能说明问题的工具。
5. 三板斧联动实战:一次I2C外设问题的完整排查
前面把三把斧头单独讲完了,接下来用一个真实场景把它们串起来。这个案例是我在某块OpenHarmony开发板上排查I2C温湿度传感器无数据时走过的完整过程,非常典型。
5.1 问题现象与第一板斧:日志初判
现象很直接:系统启动后,应用读到的温湿度数据一直是初始值,换成命令行工具手动读取也一样。我第一反应就是抓日志,因为这是成本最低的手段。
通过hdc抓取hilog,过滤I2C和传感器相关tag之后,果然看到了如下错误信息:
[ERROR] I2cTransfer failed, err=5, addr=0x48 [ERROR] sensor read no data, check bus or device powererr=5在I2C驱动里通常表示传输过程中没有得到从设备的ACK应答。这就说明主控确实尝试和地址为0x48的设备通信了,但设备没有正常回应。到这里,第一板斧已经给出了很重要的线索:问题大概率出在硬件连接、设备地址、或者从设备供电上,而不是上层业务代码。
5.2 第二板斧介入:串口shell确认系统状态
日志只能告诉我“没应答”,接下来要用串口Shell确认系统层面的状态。如果是在标准系统上,我会通过串口Shell查看I2C控制器有没有注册成功、设备节点是否创建。
我进入串口Shell后,先查看对应的设备节点是否存在,再查看内核日志确认I2C控制器的初始化情况。确认I2C控制器正常注册后,问题范围就进一步缩小了——控制器是好的,但外设不应答,那就要么是外设没上电,要么是地址不对,要么是硬件连线有问题。
这一步之所以串口比hdc更稳,是因为串口在系统大部分情况下都能用,哪怕HDF框架某个组件加载失败,串口Shell仍然可能可以操作。在面对“驱动起不来”一类的问题时,串口往往是你能找到的最后一根救命稻草。
5.3 第三板斧升级:逻辑分析仪抓波形
到了这一步,软件层面能确认的都已经确认了,但“为什么不应答”还需要硬件信号来验证。我拿出逻辑分析仪,把通道接到I2C总线的SCL和SDA上,然后再次触发一次软件读操作。
抓到的波形非常有意思:SCL时钟每一拍都很正常,但SDA在地址发送阶段始终为高,尤其是从设备应该在第9个时钟周期拉低SDA表示ACK的位置,SDA一点动静都没有。这说明主控发地址发得很标准,但地址所对应的从设备根本不理会,或者总线上压根没有这个地址的设备。
我又顺手测了一下传感器的电源引脚,发现VDD对地电压只有0.3V左右,基本可以判定传感器没有处于工作状态。到这里,问题已经从“软件通信失败”变成了“从设备没供电”的硬件问题。
5.4 修复与回归:三板斧的闭环
排查到这里,后面的工作就变得很简单了。我对照硬件原理图确认,这颗传感器的VDD引脚应该由某个GPIO控制的电源开关供电,而这个GPIO默认状态没有被置为高电平,所以传感器一直处于断电状态。
修复方法是在系统启动初始化阶段,把对应的电源控制GPIO拉到高电平,然后重新编译、烧录、上电。再次重复前面的调试流程:先用日志确认传感器ID能够正确读取,再用串口Shell手动执行一次数据读取,最后设备上报的温湿度数据已经恢复正常。
这个案例最典型的地方在于:单靠任何一把斧头都能定位到一部分,但完整走完还需要三把斧头互相印证。日志给了方向,串口排除了系统层面问题,逻辑分析仪直接锁定了硬件故障点,最后用日志回归验证修复结果。如果你只会在代码层ebug,这种问题可能要耗上好几天。
6. 常见问题速查与调试心得
6.1 硬件调试常见问题速查表
整理了我在OpenHarmony项目里遇到频率较高的一些问题,做成一张速查表,平时调试时可以对照着排查。
| 问题现象 | 常见原因 | 优先排查路径 |
|---|---|---|
| 上电后串口无任何输出 | 板子最小系统没跑起来、TX/RX接反、串口驱动没装 | 先量电源和晶振,再看boot串口,最后确认工具设置 |
| 串口输出乱码 | 波特率不匹配、未共地、线材过长 | 确认波特率115200,检查GND连接,换短线 |
| 系统启动卡住 | 某驱动初始化失败、资源冲突、DDR参数不对 | 看卡住前最后一条日志,查对应模块配置和硬件 |
| hdc连接不上设备 | USB驱动缺失、开发者模式未开、未授权 | 设备管理器查驱动,设备端确认调试开关和授权 |
| I2C设备无应答 | 地址错误、供电未开、上拉电阻缺失 | 逻辑分析仪抓波形,看第9个时钟ACK是否有拉低 |
| GPIO控制无效 | 引脚复用冲突、方向配置错误、电气连接问题 | 查引脚复用表,确认方向寄存器,用示波器量引脚电平 |
| 偶发死机重启 | 看门狗超时、内存越界、电源不稳 | 串口抓panic调用栈,量复位瞬间电源波形 |
| 日志太多导致卡顿 | DEBUG日志过多、打印频繁 | 用宏控制日志级别,只保留关键节点打印 |
这张表覆盖了我个人项目中遇到的大部分高频问题,当然实际情况会更复杂。但只要沿着“日志→串口→硬件工具”这条主线走,绝大多数问题都能收敛到某个具体环节。
6.2 我的一点私人心得
文章的最后,分享几个这些年沉淀下来的习惯,希望对你有帮助。
第一,拿到任何一块OpenHarmony开发板,先别急着烧自己的镜像,先把官方工程烧录一遍,确认串口有输出、系统能正常进入Shell。这相当于建立了一个“调试基线”,以后出了问题,你能对比“原来好的状态是什么样”,而不是在一堆未知变量里瞎猜,排查效率完全不一样。
第二,日志的domain、tag、级别一定要趁早规范起来。OpenHarmony是一个多人协作的大系统,你自己单独开发可能觉得随意一点没关系,一旦代码合入项目、别人也要调试你负责的模块时,规范清晰的日志会节省整个团队的排查时间。我见过最崩溃的调试经历,就是一个模块所有关键日志都打成了ERROR,最后真正出问题时,那个ERROR被埋在一大堆无关错误里,根本找不到。
第三,不要迷信某一板斧,也不要轻视某一板斧。有经验的工程师从来都是看情况出招:简单问题打日志,启动问题看串口,疑难杂症上工具。三板斧本身没有高低之分,只有适合场景之分。
最后再分享一个小技巧:调试串口和日志端口在开发阶段不要省。很多板子默认只留一组调试串口,但我习惯在产品设计阶段就预留两路UART,一路给内核日志,一路给业务系统,这样可以在日志系统异常时互相印证。看起来多占用了一点资源,但关键时刻真的能救命。