news 2026/9/7 16:19:49

开源鸿蒙硬件调试三板斧:串口日志、断点与逻辑分析仪实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
开源鸿蒙硬件调试三板斧:串口日志、断点与逻辑分析仪实战

做OpenHarmony系统开发有一段时间了,踩过的坑比写过的代码还多。身边不少朋友从应用开发转过来,第一个项目往往是板子拿回来、编译烧录折腾完,然后卡在“系统起不来”和“外设没反应”这两座山上。翻开代码看半天,总觉得逻辑没问题,但硬件就是不给你面子。这时候真正能救你的,不是玄学,而是一套成体系的硬件调试方法。今天要分享的就是我在开源鸿蒙项目里反复用、也反复教新人用的“硬件调试三板斧”:串口日志、调试器断点、逻辑分析仪/示波器。这套方法不挑板子,不挑架构,跑在ARM开发板还是x86 PC上都适用,希望给正在入坑OpenHarmony系统开发的朋友一些真正能落地的参考。

1. 硬件调试三板斧到底是什么——先搞清楚工具链

1.1 为什么偏偏是这三板斧

很多刚接触系统开发的人有个误区,觉得调试就是“代码没写对,回去改”。但OpenHarmony这种级别的系统,跑起来之后你根本不知道代码执行到哪一步,更不知道硬件引脚上到底发生了什么。软件层看不到的东西,硬件上可能已经翻江倒海了。

我习惯把调试手段分三个层次,每一层解决一类问题。

第一层是串口日志,回答“系统里到底发生了什么”。开机卡住、驱动报错、服务崩溃、网络起不来,这些问题在日志里几乎都有蛛丝马迹。它是整个系统的“黑匣子”,也是排查问题的第一入口。你在代码里写的日志、内核打印的调试信息、各个系统服务的启动状态,最后都会汇聚到串口上。

第二层是调试器断点,回答“程序到底卡在哪一行”。光有日志只能说明“出问题了”,但出问题的时候代码执行流是什么样、变量的值是什么、函数调用栈是谁,日志未必能完全告诉你。这时候需要JTAG/SWD调试器,让CPU停下来,直接查看寄存器和内存。

第三层是逻辑分析仪和示波器,回答“引脚上的电信号到底对不对”。这是最底层的手段,也是很多纯软件背景的朋友最容易忽略的。I2C通不通、SPI时序对不对、GPIO电平到底有没有拉起来,只有把探头怼上去才看得见。软件读寄存器成功不代表物理信号没问题,这是我带项目时反复强调的一句话。

这三层从系统行为、代码位置、物理信号三个维度,把问题空间完整覆盖掉。实际排查时按顺序来,先日志缩小范围,再断点定位代码,最后用信号工具验证硬件。绝大多数问题在第三斧之前就能解决,但三板斧齐备,心里才有底。

1.2 一套够用的调试硬件与工具清单

聊完思路,列一下我平时项目里常备的硬件和工具。不需要一步到位,但下面这几样建议至少配齐:

工具类别推荐方案主要用途
开发板润和DAYU200、HiHope系列等运行OpenHarmony系统的目标板
USB转串口模块CH340、CP2102、FT232输出串口日志、进入系统控制台
调试器SEGGER J-Link、ST-Link、DAP-Link断点调试、内核寄存器查看
逻辑分析仪Saleae 8路/16路或兼容版I2C/SPI/UART/GPIO时序抓取
示波器带宽100MHz以上,双通道起步电源纹波、时钟、信号质量验证

软件侧也是一套组合:

  • DevEco Device Tool:OpenHarmony设备开发的IDE,负责工程编译、烧录和调试入口。
  • hb:OpenHarmony的构建工具,命令行编译项目时常用。
  • hilog/hdc:日志查看和设备连接工具,hdc可以理解成“OpenHarmony版adb”。
  • minicom/picocom:Linux环境下的串口终端,连上USB转串口就能看日志。
  • OpenOCD:开源的调试器驱动,配合J-Link/ST-Link给GDB或者IDE提供调试通道。

这里有个新手容易掉的坑:只买了开发板和USB数据线,以为插上就能看日志。数据线走的是下载和hdc通道,串口日志必须额外用USB转串口模块接开发板上的UART调试口。我第一次带新人时,他折腾一上午没输出,最后发现是没接串口线。工具没备齐,后面的三板斧根本抡不起来。

2. 第一板斧:串口日志——OpenHarmony排障的第一道防线

2.1 为什么串口日志能解决80%的问题

OpenHarmony从开机到运行,整个启动链路是有明确顺序的:bootloader引导、内核启动、init进程拉起、各种系统服务和应用的初始化。每一层都会往串口打印日志。说白了,系统就像一台不断向你汇报状态的机器,串口就是它的嘴。只要它还能张嘴,你就有线索可查。

我统计过自己排障的案例,大概有八成是靠串口日志直接或者间接解决的。比如说:

  • 开机卡在logo,日志显示某个驱动初始化超时。
  • App调用传感器接口失败,日志里能看到SENSOR服务返回的错误码。
  • 网络配置不生效,日志里能看到eth0的状态变化。
  • 系统分配内存失败,日志会直接把oom信息打出来。

有了日志,你至少知道去哪儿查;没有日志,你面对的就是一块哑巴板子,只能靠猜。所以在OpenHarmony开发中,第一件事不是急着写业务代码,而是把串口日志环境搞通、养成看日志的习惯。

2.2 OpenHarmony串口日志的开启与配置

串口日志的硬件接法非常简单,三根线搞定:开发板的UART_TX接USB转串口模块的RX,开发板的UART_RX接模块的TX,最后GND和GND必须共地。不要小看共地这一步,不共地时日志会乱码或者完全没有输出,这是新手最容易踩的坑。

接线确认后,把USB转串口插到电脑,Linux下先用dmesg确认设备节点:

dmesg | grep ttyUSB

正常会看到类似/dev/ttyUSB0的设备节点输出。如果看不到,检查驱动、换一根USB线试试。

然后用串口终端连接,波特率默认115200,8N1,无流控。我用得比较多的是picocom和minicom,命令分别长这样:

sudo picocom /dev/ttyUSB0 -b 115200
sudo minicom -D /dev/ttyUSB0 -b 115200

连接成功后,给开发板上电,就能看到完整的启动日志从串口里涌出来。启动完成后,串口通常会变成系统控制台,可以直接敲命令操作设备,比如查看进程、调整网络、重启服务。这部分体验很接近在一台Linux主机上操作终端。

如果串口连上后没有任何输出,优先检查三件事:接线是不是接反了、波特率对不对、开发板有没有进到正常的启动流程。我遇到过一种情况,开发板的调试串口被设备树屏蔽了,启动时完全不打印,最后查设备树配置才发现UART节点没有使能。

2.3 日志分级与过滤技巧

OpenHarmony的日志体系里,最常用的是HiLog。它给每条日志打了级别和标签,级别从低到高是DEBUG、INFO、WARN、ERROR、FATAL。日志默认会输出到串口和hilog缓存里,开发阶段我会把日志级别调到INFO或者DEBUG,排障时再重点关注WARN和ERROR。

串口上日志刷得飞快,如果只用肉眼硬看,很快就会被淹没。我的习惯是先用通用工具过滤,再针对性地看特定模块:

hilog | grep ERROR

只看错误级别日志,快速筛查系统是否有异常。

hilog | grep -i sensor

按关键词过滤某个业务模块的日志。

hilog还支持很多参数,可以根据时间、进程、标签做过滤。这个能力在系统服务日志很多的时候特别好用。比如Wi-Fi模块有问题,就只抓含wifi关键字的日志;某个进程反复崩溃,就按进程ID过滤。

还有一点:串口日志是宝贵的排障资产。遇到疑难问题时,我会先把完整的原始日志保存一份到文件里,再开始各种尝试。因为有些问题出现在很长一段日志之后,手动翻屏很容易错过前后文的关联。保存日志用终端自带的log功能,或者直接把串口重定向到文件:

sudo cat /dev/ttyUSB0 | tee boot.log

这样一边看屏幕一边把日志留底,后面想回看哪一段都不慌。

2.4 串口日志的进阶用法

串口除了看日志,还能当系统控制台使。OpenHarmony设备上电启动完成后,我经常直接通过串口执行命令,比反复烧录省事得多。

hdc是OpenHarmony的调试桥,类似adb。电脑和设备连好后,可以这样操作:

hdc shell

进入设备的shell环境,然后用命令行查看进程、检查网络、修改文件、重启服务。这些操作和Linux上的体验几乎一致。

想查内核日志,可以在串口控制台执行:

dmesg | tail -100

内核驱动的报错、中断异常、内存信息大多在这里。

还有个小技巧:OpenHarmony的日志量很大,有些历史问题一闪而过,没来得及看。用hilog -x可以清空缓存后再复现问题,这样日志里只保留最干净的那一段,排查效率高得多。我在定位偶现问题时经常用这个方式,先清日志,再触发问题,最后看log。

3. 第二板斧:调试器与断点——让崩溃和卡死无所遁形

3.1 JTAG/SWD调试的基本思路

串口日志能告诉你系统哪里出了问题,但“哪里出了问题”和“为什么出问题”之间,还隔着一段代码执行过程。想象一下,你正在看一部电影,日志相当于偶尔弹出的字幕,告诉你剧情到了哪一段;但你想知道某个角色在某个瞬间为什么做了那个决定,就得把画面暂停,逐帧回放。调试器干的正是这件事。

JTAG和SWD是两种常见的调试接口协议。JTAG历史更久,引脚多、功能全;SWD是ARM平台下更精简的方案,只要两根线加地线,占用的引脚少,很多开发板都默认留了SWD调试接口。OpenHarmony很多开发板用的是ARM架构芯片,所以我平时用SWD居多。

调试器的核心能力就四样:打断点、单步执行、看变量、看调用栈。当程序停在断点上,CPU就被冻结了,你可以看到当前函数的入参、局部变量、全局变量,也能看到完整的调用链——这个函数是谁调用的、上一层的函数参数是什么。这些东西靠串口日志很难完整还原。

3.2 OpenHarmony环境下的调试器接法与工具链

调试器的硬件接法同样不复杂。以J-Link用SWD模式为例,只需要接四根线:SWDIO、SWCLK、GND,另外VREF用来让调试器读取目标板电平,接目标板的3.3V电源引脚。

接线的时候注意,不同开发板的调试接口丝印可能不一样,但SWDIO和SWCLK这两个名字基本固定。实在找不到引脚定义,就去翻开发板的原理图,不要凭感觉乱接。我第一次用某国产开发板时,丝印把SWDIO和SWCLK标反了,排查了半小时才发现是接反了。

软件侧,我常用两条路线。一条是DevEco Device Tool的图形化调试界面,适合不太熟悉命令行的朋友;另一条是OpenOCD加GDB的命令行组合,适合自动化脚本和深度调试。

OpenOCD启动示例:

openocd -f interface/jlink.cfg -f target/xxx.cfg

其中interface配置指定调试器型号,target配置指定目标芯片。启动成功后,OpenOCD会监听本地端口,再用GDB连接:

gdb-multiarch vmlinux (gdb) target remote :3333

这里的vmlinux是带符号表的系统内核镜像,没有符号表的话,GDB只能看到地址,看不到函数名,调试体验大打折扣。

3.3 断点调试实战流程

我拿一个常见的崩溃场景来演示:某个系统服务因为空指针异常挂掉了。日志里能看到FATAL EXCEPTION之类的关键信息,但光靠日志你只能知道崩在哪个线程,具体崩在哪一行还要靠调试器。

完整流程大概是这样:

第一步,编译时确保带有调试信息。OpenHarmony工程的编译选项中需要包含-g,否则符号表缺失,断点打不上,调用栈也不完整。有调试信息后,函数名、行号、变量名都能正确对应。

第二步,连接调试器,让目标板处于可以被调试的状态。上电前接好SWD线,然后启动OpenOCD。

第三步,在可疑位置打断点。比如怀疑某个指针在使用前没有判空,就在解引用它的那行代码上打断点。调试器中打断点可以直接指定代码行号或函数名:

break osSensorHandleRead

第四步,触发复现。让系统跑起来,执行到断点时,CPU自动停下,调试器会显示当前位置。

第五步,查看调用栈和变量。GDB里用bt看调用栈,用print 变量名看值。这时候你会看到从系统初始化到当前函数的完整调用链,还能直接检查null指针是从哪里传进来的。

第六步,单步执行验证修复。修改代码后重新编译、烧录,再一次跑断点,确认指针判空后不会进崩溃路径。

这个过程听起来繁琐,但实际操作中非常有效。特别是那些偶发性崩溃,单独看日志代码怎么都想不通,一打断点,变量值摆在面前,问题原因瞬间清晰。

有一个要点:OpenHarmony默认编译优化等级比较高,-O2级别的优化下,变量可能会被优化掉,单步执行也会出现“跳行”的错觉。遇到这种问题,我会在调试模块临时把优化等级降到-O0-O1,虽然编译慢一点,但调试体验靠谱很多。

4. 第三板斧:逻辑分析仪与示波器——信号级的真相

4.1 什么时候必须上信号级工具

软件调试做得再细,也有一类问题是看不到的:CPU寄存器里读到的是1,但引脚物理电平实际上没拉上来;I2C驱动返回成功,但总线上根本没有设备应答。这种“软件说正常、硬件实际不正常”的矛盾,只有用逻辑分析仪和示波器才能定性。

我总结过必须上信号工具的典型场景:

  • I2C/SPI/UART等总线通信偶发失败,代码看起来没有逻辑漏洞。
  • 外设不上电或不响应,怀疑供电或复位时序有问题。
  • GPIO输出状态不对,需要确认引脚是不是被复用成其他功能了。
  • 启动不稳定、偶尔跑飞,怀疑时钟信号或电源纹波超标。
  • 排查干扰问题,比如触摸屏误触、射频信号异常。

这些场景的共同点是:问题发生在物理层,不是逻辑层。你光看寄存器、看代码逻辑、加日志打印,都可能只看到表面现象。之前有个项目,传感器数据偶尔出错,日志和断点层面的代码逻辑完全正常,最后用逻辑分析仪抓总线波形,才发现是上拉电阻阻值太大,时序边沿不达标导致偶发采样错误。

4.2 逻辑分析仪抓I2C时序的实操

逻辑分析仪是数字信号排查的利器。它不关心电压具体是多少,只关心引脚电平是0还是1,采样速率高、通道多,适合抓并行数字总线。我用得最多的是I2C、SPI、UART和GPIO波形。

以抓I2C时序为例,操作分四步:

第一步,接线。I2C一般两根线,SCL时钟线和SDA数据线,分别接到逻辑分析仪的通道0和通道1,然后共地。接线之前最好确认一下设备的I2C地址和总线速率,这些参数后面解码要用。

第二步,设置采样率。I2C速率为400kHz时,我通常把采样率设为4MHz以上,至少10倍于信号速率,否则波形边沿抓不准。采样率太高也有问题,数据量巨大,软件处理不过来,所以够用就好。

第三步,设置触发条件。逻辑分析仪软件里可以把触发条件设为I2C的Start信号,即SDA在SCL为高电平时拉低。这样按下采集后,只要总线上出现一次I2C通信启动,波形立刻被抓住。

第四步,解码分析。Saleae等逻辑分析仪软件都内置I2C解码器,设置好I2C从机地址和速率,软件会自动解析出地址帧、数据帧、ACK/NACK标志位。我一般直接看ACK位,从机不应答时波形上能看得清清楚楚。

实测中,我抓过这样一段波形:主机发送从机地址后,SDA一直保持高电平,没有拉低回应,这就说明从机根本没有正常工作。再查供电和使能引脚,很快找到问题。

4.3 示波器测电源与时钟的注意事项

逻辑分析仪只能看数字电平,但很多硬件问题出在模拟信号上,比如电压跌落、纹波超标、时钟毛刺。这时候必须用示波器。

对OpenHarmony开发来说,我重点测两类信号。

第一类是电源。开发板上电瞬间,如果电源跌落太多,CPU会不稳定甚至复位。测电源纹波时,示波器要用交流耦合、带宽限制到20MHz,探头地线尽量短,最好用接地弹簧,避免地环路引入额外噪声。正常的电源纹波应该在几十毫伏以内,如果看到几百毫伏的毛刺,就要怀疑电源设计或者负载突变。

第二类是时钟。OpenHarmony主芯片通常有外部晶振,晶振不起振或者频率偏了,系统可能完全跑不起来。示波器测晶振波形时,探头会引入分布电容,可能导致振荡器停振。我的习惯是测晶振输出波形时用高阻探头,或者拿逻辑分析仪看系统时钟引出脚的数字波形,尽量少直接接触晶振本身。

还有一点容易忽视:示波器探头带宽要高于被测信号。测100MHz的时钟,至少用200MHz带宽的示波器,否则测出来的上升沿严重变形,误判信号质量问题。

5. 三板斧配合使用——一个真实排障场景

5.1 问题现象与初步定位

前面分别讲了三板斧怎么用,但实际排障时它们从来不是孤立出场的。我拿一个最近处理的真实场景来完整过一遍,让大家看看这三板斧是怎么配合的。

问题是这样的:开发板上接了一个I2C接口的温湿度传感器,系统大部分时间工作正常,但每隔一段时间,应用层读数据就会失败一次,读到的数据偶尔是0xFF,或者直接返回超时。这个问题不是必现的,代码逻辑排查了几遍,I2C驱动也换过配置,问题依旧。

这种“偶发+外设”的问题,第一反应不能是改代码,而是按排障流程走一遍:先日志定位现象,再断点分析代码,最后信号验证硬件。

5.2 三板斧依次出招的完整过程

第一斧,串口日志。我在应用层读取传感器的函数里加了日志,把每次读数和返回值都打出来。复现问题的设备跑了一下午,日志抓到了异常:某个时间点开始,I2C读取接口返回了-110。这个是I2C总线超时的错误码,说明主机在总线上没有等到预期的应答。

这个信息价值很大,把问题范围从“应用不对”缩小到了“I2C总线通信异常”。但-110只说明超时,具体是总线上有设备没应答,还是电气信号有问题,还需要进一步定位。

第二斧,调试器断点。在I2C驱动返回-110的地方打断点,复现后停在断点上,查看当前函数上下文。我把I2C控制器的状态寄存器打出来,发现控制器在本次传输中确实没有收到ACK信号。再往前翻,主机发送从机地址后,总线状态寄存器显示总线忙,从机在地址阶段就没有回应。

到这里,问题几乎可以断定为硬件层的应答异常。日志给了现象,断点给了代码执行细节,但物理层到底发生了什么,还得看波形。

第三斧,逻辑分析仪。把探头接在I2C的SCL和SDA上,设置了Start触发条件。复现问题后,抓到的波形让我吃了一惊:主机发送从机地址后,从机确实没有拉低SDA回应ACK,总线在这里就断了。但正常情况下,传感器是能响应的,为什么会间歇性不响应?

我重新看了硬件设计,发现传感器电源引脚的前端加了一个很长的RC滤波,电容取值偏大。上电瞬间传感器电源爬升缓慢,达到工作电压的时间比I2C首次通信早不了多少,导致主从设备启动时序不匹配。温度变化和电压波动又让这个时序问题呈现为偶发。最后把滤波电容从10uF改成1uF,上拉电阻从10k改成4.7k,连续跑了三天,问题不再复现。

5.3 复盘:这套组合拳为什么有效

这个案例里,三板斧各司其职,缺一不可。

日志提供了问题发生的时机和错误码,指向I2C超时;断点确认了是地址阶段的ACK缺失,排除了软件逻辑错误;逻辑分析仪用波形证明了物理层确实没有应答,并进一步引导我检查电源时序。整个过程没有一步是靠猜的,每个结论都有据可查。

这也是我一直跟团队强调的:硬件调试最忌讳拍脑袋。看到偶发现象就怀疑代码、怀疑芯片,反复改东改西,但没有任何测量数据支持。三板斧配合的过程,本质上是“用证据逐步缩小问题范围”的过程,从系统级缩小到模块级,再到代码级,最后到信号级。每一步都走扎实了,答案自然会浮出来。

6. 实战中的常见问题与避坑清单

6.1 串口日志相关坑

串口日志的坑主要集中在硬件连接和使用习惯上。硬件方面,最常见的还是乱码和没输出。乱码的原因,要么是USB转串口模块质量差导致电平不稳,要么是波特率配置和开发板不一致。开发板默认115200,但有些老平台是9600,这个一定要查手册。

软件使用习惯上,我踩过最大的坑是日志刷屏。一个服务疯狂打ERROR,串口每秒几十行,把真正有用的信息淹没。后来我养成了先清缓存再复现的习惯,另外用hilog按进程、按标签过滤,效率提升明显。还有一个细节:串口控制台一旦被某个程序占用,其他调试工具就连不上了,注意排他性。

6.2 调试器相关坑

调试器的坑,第一名是SWD连不上。连不上的时候,优先检查供电、接线顺序和复位线。某些开发板SWDIO和SWCLK丝印反了,或者需要先给目标板上电再启动OpenOCD,顺序反了也连不上。

第二名是断点打不上。调试符号缺失、编译优化、代码被内联,都可能导致断点无效。我的经验是先用info sharedlibrary确认符号表加载,再把优化等级临时调低。如果是硬件断点,有些芯片只支持少量几个硬件断点,超过上限要改用软件断点(GDB默认会自动选择)。

还有一点:调试器连接的是整个系统,OpenHarmony有多个核时,要确保断点下在和问题相关的核上。多核环境下,GDB可能需要thread命令切换,不然你在0号核打断点,问题发生在1号核,自然毫无反应。

6.3 逻辑分析仪/示波器相关坑

逻辑分析仪最常见的坑是采样率不够。采样率不足会导致波形混叠,明明信号是正常的,抓出来却像毛刺一样。采样率至少取信号速率的4倍以上,我在实践中都是取10倍以上。

另一个坑是忘记共地。逻辑分析仪和被测板子必须共地,否则波形完全不可信甚至损坏设备。我见过有人图省事只接信号线不接地线,抓出来的波形像噪声,排查半天才发现是地没接。

示波器这边,测电源纹波时一定记得用交流耦合。直流耦合会把直流分量叠在波形上,纹波细节完全看不清。另外探头的接地线要短,越长越容易引入干扰。测高频信号时,探头的带宽和补偿校准也要检查,否则测量结果失真。

我把日常遇到的高频问题整理成一个表,方便大家直接对照排查:

现象可能原因排查办法
串口无输出接线错误/共地缺失检查TX/RX、确认GND连接
串口乱码波特率不匹配/模块质量差确认波特率、换模块测试
日志刷屏看不到重点未分级过滤清缓存后用hilog按级别和关键词过滤
SWD连不上接线错误/未供电/调试顺序不对核对线序、确认VREF和GND、先上电再连
断点无效符号表缺失/编译优化开启-g、临时降低优化等级
逻辑分析仪波形毛刺采样率不足/未共地提高采样率、接好地线
示波器纹波看不清用了直流耦合/探头地线过长切换交流耦合、缩短地线

我个人在实际操作中的体会是,三板斧看着基础,但真正遇到疑难杂症时,能不能冷静、有序地把这三招用到位,决定了你是花一天还是花一周才能定位问题。尤其是OpenHarmony这种系统级开发,干扰因素多,一套不依赖运气的排查方法论,比任何花哨工具都管用。

最后再分享一个小习惯:不管排查什么问题,第一件事永远是先完整保存一份原始串口日志,再动手改代码。很多时候答案就在日志前三行里,只是你太着急,没看到那里而已。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/7 16:19:43

机器学习3-4章核心算法与模型评估实战指南

1. 3-4章到底在讲什么:先看懂这学期的内容地图 先直说结论:机器学习课程的3-4章,几乎是整个学期最重要的一段。无论你用的是周志华的《机器学习》、李航的《统计学习方法》,还是学校自编讲义,这两章基本都会落在 监督…

作者头像 李华
网站建设 2026/9/7 16:18:16

别踩雷!不是随便一个 AI 就能搞定毕业论文,2026 导师信赖工具清单

每年毕业季,无数同学深陷论文难题:开题毫无思路、搭建框架耗费数日、初稿逻辑松散、查重标红泛滥、AI检测超标、格式反复被导师驳回。面对海量的AI工具,不少学生抱着“试试看”的心态选择通用型大模型,却频频踩坑。这些工具普遍存…

作者头像 李华
网站建设 2026/9/7 16:17:45

freeCodeCamp 基础 CSS 实战:用 RGB 值表示并混合元素颜色

freeCodeCamp 基础 CSS 实战:用 RGB 值表示并混合元素颜色 【免费下载链接】freeCodeCamp freeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free. 项目地址: https://gitcode.com/GitHub_Trending/fr…

作者头像 李华
网站建设 2026/9/7 16:17:43

还在敲 ls 和 cd?一组 TUI 工具接管你的终端

还在敲 ls 和 cd?一组 TUI 工具接管你的终端 【免费下载链接】awesome-tuis List of projects that provide terminal user interfaces 项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-tuis SSH 到服务器上时没有图形界面,但命令行不…

作者头像 李华
网站建设 2026/9/7 16:17:38

QQ空间备份开源工具:本地归档日志、说说与相册的工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/7 16:17:19

Linux下NVIDIA 610.43.03驱动安装与CUDA环境配置完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华