鸿蒙 PC 底层开发技术详解(八):鸿蒙 PC 上的问题定位手段
1 前言在软件开发的过程中我们不仅需要实现业务功能还常常需要深入底层进行问题定位。在常规的 UNIX-like 系统上常用的问题定位手段有这几类进程跟踪。业界有很多知名的用于进程跟踪的开源工具它们实现的功能各不相同但归根结底都是跟踪某个进程的运行过程大多都是依赖操作系统提供的 ptrace syscall 去实现这个能力。典型的工具有 gdb、lldb、strace、ltrace 等。系统日志。每个操作系统都有日志机制。比如 Linux 上面会有各种各样的日志包括 systemd 服务日志、内核日志等。proc 文件系统。通过读 proc 文件系统我们可以观测到进程运行过程中的各种状态。内核打点。ftrace 和 eBPF 都是常用的内核打点机制这需要操作系统内核支持。受限于当前鸿蒙 PC 的安全管控措施上述大多数手段在鸿蒙 PC 上并不可用本文档仅整理出当前可用的部分。2 进程跟踪2.1 lldb在当前 6.1 版本的 HarmonyOS 系统中自签名二进制无法拥有 ptrace 权限因此我们自己编译的 lldb 是无法正常工作的必须要使用 ohos-sdk 里面提供的 lldb并且版本要足够新。为什么需要新版本OpenHarmony 社区在最新版本的 ohos-sdk 中对 lldb 做了证书签名而非自签名证书签名可以让二进制拥有更多高级权限ptrace 就包括在内。我们可以去 OpenHarmony 的日构建流水线下载最新的 ohos-sdk-full_ohos 制品curl-fL-oohos-sdk-full_ohos.tar.gz https://cidownload.openharmony.cn/version/Daily_Version/ohos-sdk-full_ohos/20260728_020506/version-Daily_Version-ohos-sdk-full_ohos-20260728_020506-ohos-sdk-full_ohos.tar.gztar-zxfohos-sdk-full_ohos.tar.gz-C~/rm~/daily_build.log ~/manifest_tag.xmlcd~/ohos-sdk/ohosunzip-uqnative-*.zipcd-现在你可以在 ohos-sdk 中找到 lldb 程序路径是~/ohos-sdk/ohos/native/llvm/bin/lldb。这个 lldb 在鸿蒙 PC 上可正常工作。附赠一个技巧如何检查你下载的 lldb 文件是否具有调试权限。方法非常简单使用 binary-sign-tool 查看签名信息即可该工具来自 ohos-sdkbinary-sign-tool display-sign-inFile~/ohos-sdk/ohos/native/llvm/bin/lldb如果你的 lldb 是具有调试权限的版本你将会得到这样的信息07-29 10:37:12.321 INFO - permission { requestPermissions: [{ name: ohos.permission.kernel.ALLOW_DEBUG }, { name: ohos.permission.kernel.DEBUGGER }, { name: ohos.permission.READ_WRITE_USB_FILE }], version: 1 } 07-29 10:37:12.333 INFO - certificate #0 Version: 3 (0x2) Serial Number: 09:fc:0d:1c:17:b5:b3:b1:19:91:67:ec:90:16 Signature Algorithm: ecdsa-with-SHA384 Issuer: CCN,OHuawei,OUHuawei CBG,CNHuawei CBG Developer Relations CA G2 Validity Not Before: Nov 24 06:53:47 2025 GMT Not After : Nov 24 06:53:47 2028 GMT Subject: CCN,O\U5F00\U653E\U539F\U5B50\U5F00\U6E90\U57FA\U91D1\U4F1A,OU1826159925408081473,CN\U5F00\U653E\U539F\U5B50\U5F00\U6E90\U57FA\U91D1\U4F1A(1826159925408081473)\,DevID查询结果显示这个文件拥有ohos.permission.kernel.ALLOW_DEBUG和ohos.permission.kernel.DEBUGGER权限并且下方展示了证书链。证书链里面显示颁发者是华为可能是应用市场或者开发者中心之类的网站颁发的证书的所属主体属于开放原子基金会。那一串 Unicode 转义序列解码出来是“开放原子基金会”几个字。2.2 QEMU在当前 6.1 版本的 HarmonyOS 系统中自签名二进制无法拥有 ptrace 权限我们自己编译的 strace 是无法正常工作的。好在 QEMU 也提供了与 strace 类似的功能。并且这个功能是在纯用户态实现的不需要内核 ptrace 权限。因此我们可以用 QEMU 来作为 strace 的替代品。由于 QEMU 的构建过程十分繁琐我这里选择直接从 Alpine Linux 的软件源里面下载构建好的版本。这个版本静态链接了 musl libc在鸿蒙 PC 上也可正常使用。# 准备一个安装目录这里以家目录为例mkdir~/qemu-aarch64# 从 Alpine Linux 软件源下载 qemu-aarch64# 由于 apk 文件的下载链接随时可能过期这里选择从包索引文件里面实时解析出最新的下载链接package_nameqemu-aarch64alpine_repositoryhttps://mirrors.huaweicloud.com/alpine/v3.24/community/aarch64curl-fsSL${alpine_repository}/APKINDEX.tar.gz|tar-zx-C~/qemu-aarch64package_version$(grep-A1^P:${package_name}$~/qemu-aarch64/APKINDEX|sed-ns/^V://p)apk_file_name${package_name}-${package_version}.apkcurl-L-O${alpine_repository}/${apk_file_name}tar-zxf${apk_file_name}-C~/qemu-aarch64# 需进行代码签名后使用签名工具来自 ohos-sdkcd~/qemu-aarch64/usr/bin binary-sign-tool sign-selfSign1-inFileqemu-aarch64-outFileqemu-aarch64cd-现在你得到了一个可用的 qemu-aarch64 可执行文件文件位于~/qemu-aarch64/usr/bin/qemu-aarch64。我们尝试用它来作为 ELF 解释器用来执行一个程序# 解释 ELF 文件的时候需要输入文件路径# 执行过程中加上 -strace 参数输出系统调用日志~/qemu-aarch64/usr/bin/qemu-aarch64-strace/bin/ls你将会得到这样的日志输出格式与 strace 工具一模一样38114set_tid_address(0x7e1fa611e8)3811438114mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0)0x0000007e1efa700038114madvise(0x0000007e1efa7000,4096,MADV_DONTNEED)038114munmap(0x0000007e1efa7000,4096)038114mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0)0x0000007e1efa700038114prctl(1398164801,0,541685608448,4096,541694890400,541694890400)-1errno22(Invalid argument)38114madvise(0x0000007e1efa7000,4096,MADV_FREE)038114munmap(0x0000007e1efa7000,4096)0...最后需要澄清一个常见误区使用了 QEMU并不等于运行在虚拟机中。这里使用的只是 QEMU 用户态解释器并没有虚拟出完整的硬件设备和操作系统。程序发起的 syscall 最终仍会下发给鸿蒙内核因此不会改变程序原有的运行逻辑。由于这些 syscall 在下发内核前会先由 QEMU 进行拦截与转发我们得以轻松捕捉并观测它们。3 系统日志对底层开发而言定位问题最有价值的日志就是内核日志了。要查看内核日志大家可能会首先想到 dmesg 命令和 /dev/kmsg 文件。在鸿蒙 PC 上dmesg 命令和 /dev/kmsg 文件都是存在的但它们并不向用户开放因此我们无法通过这两个途径查看内核日志。要查看内核日志唯一的途径就是 HiLog。HiLog 日志系统除了会收集应用日志外还会收集内核日志并且这部分日志是向用户开放的。只需要在 HiShell 中执行这句命令就能看到有内核日志源源不断打出hilog-tkmsg一般情况下使用自己的进程名字作为过滤关键字就能知道你的程序被什么安全模块拦截了hilog-tkmsg|grepmy_program你也可以使用安全模块的名字来作为过滤关键字例如avc、xpm、hmsecpt都是引发拦截的常见模块hilog-tkmsg|grep-Eavc|xpm|hmsecpt关于这几个日志的作用这里提供一些个人经验总结由于缺乏官方资料暂无权威信息avc: 程序被 selinux 拦截会产生这方面的日志xpm: 程序因代码签名无效而验签不通过会产生这方面的日志hmsecpt程序被 seccomp 拦截会产生这方面的日志4 proc 文件系统proc 文件系统涉及范围太广这里不展开介绍只说一个大致结论在鸿蒙 PC 上/proc下的部分路径是向用户开放的尤其是/proc/self下面的节点几乎是完全开放的。用户需要使用哪个路径可以自行尝试访问。

相关新闻

量子计算机原理与应用:从叠加态到原子量子比特的突破

量子计算机原理与应用:从叠加态到原子量子比特的突破

那天下午,实验室的师兄指着屏幕上一条几乎看不见的噪声曲线问我:“你觉得量子计算机最厉害的是什么?”我下意识回答:“算得快啊,能破解密码。”他摇摇头:“如果只是快,那和超级计算机有什么区别…

2026/10/7 4:30:42 阅读更多 →
CAN总线技术详解:从差分信号到STM32实战应用

CAN总线技术详解:从差分信号到STM32实战应用

1. 从两根线到复杂网络:CAN总线的核心价值与无处不在如果你拆开过一辆现代汽车,或者打开过一台工业机器人、一台高端医疗设备,你很可能会看到一捆捆五颜六色的线束。但在这些线束中,有两根线往往扮演着“神经系统”的角色&#xf…

2026/10/14 14:34:14 阅读更多 →
信赖域优化方法:从核心原理到Python实现详解

信赖域优化方法:从核心原理到Python实现详解

1. 项目概述:从“走一步看一步”到“谋定而后动”的优化哲学在解决工程、金融、机器学习等领域的复杂优化问题时,我们常常面临一个核心矛盾:如何平衡“局部探索”的精度与“全局推进”的效率?想象一下,你在一片浓雾笼罩…

2026/10/14 20:39:01 阅读更多 →

最新新闻

桌面端AI工具实战:本地会话管理与API密钥安全存储指南

桌面端AI工具实战:本地会话管理与API密钥安全存储指南

1. 桌面端AI工具的核心价值与设计思路1.1 为什么桌面端是更务实的选择聊到AI工具的使用形态,很多人第一反应是打开浏览器、登录网页、输入问题、等待回答。这套流程在偶尔用用的时候没什么问题,但一旦你把它当成日常生产力工具,每天要调用几十…

2026/10/15 6:12:42 阅读更多 →
高德地图JS API自定义Marker图标与InfoWindow窗口完全指南

高德地图JS API自定义Marker图标与InfoWindow窗口完全指南

做地图类前端时间久了会发现,高德地图 JS API 自带的那根红色大头针和白色气泡,几乎是我见过“被替换率”最高的默认组件。刚接触时觉得挺省事,new 一个 Marker 就完事;等真正做门店地图、运营点位、活动大屏时,默认图…

2026/10/15 6:12:42 阅读更多 →
前端工程师如何转型Agent开发:从状态管理到工具调用

前端工程师如何转型Agent开发:从状态管理到工具调用

1. 从一个前端视角重新理解 Agent 开发1.1 为什么前端工程师会对 Agent 开发产生误解我做了六年多前端,从 jQuery 时代一路写到现在的组件化框架,去年开始接触 Agent 相关的项目。最开始那两个月,我踩了一个非常大的坑:我以为做 A…

2026/10/15 6:12:42 阅读更多 →
磁性角度编码器芯片选型:噪声、分辨率与INL的实测与避坑指南

磁性角度编码器芯片选型:噪声、分辨率与INL的实测与避坑指南

简介:这是一份面向电机控制、机器人及手持云台等领域的磁性角度编码器芯片入门讲解文档,聚焦传感器类芯片选型与闭环系统调试中的常见困惑。资料以MT6825为例,系统梳理噪声来源、有效分辨率与积分非线性(INL)三个核心指…

2026/10/15 6:12:42 阅读更多 →
51汇编实战:4x4矩阵键盘扫描与数码管移位显示避坑指南

51汇编实战:4x4矩阵键盘扫描与数码管移位显示避坑指南

简介:这份资源面向单片机初学者与嵌入式入门者,围绕51单片机平台,用汇编语言完整实现矩阵键盘扫描与数码管显示联动,帮助理解行线列线交叉检测按键、键值计算与移位显示等底层硬件操作。压缩包内共1个doc文件,约283KB&…

2026/10/15 6:12:42 阅读更多 →
FastAPI进阶实战:异步并发、依赖注入与生产部署全解析

FastAPI进阶实战:异步并发、依赖注入与生产部署全解析

先说一个可能有点得罪人的观点:FastAPI 之所以在圈子里被“吹”得这么厉害,大部分教程都在讲它有多少新特性、能省多少代码,但真正决定这门技术在生产环境里能不能站得住脚的,往往是另一套东西。不是路由怎么写,也不是…

2026/10/15 6:11:42 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/14 7:53:34 阅读更多 →